实测|8 种多载波调制识别数据集如何生成?原理 + 完整 MATLAB 流程拆解【文末附MATLAB代码链接】

基于 MATLAB 的多载波调制识别数据集生成:8 种波形仿真实现

本文环境:MATLAB R2021a 及以上,需要 Communications Toolbox(physconst、信道模型)与 Signal Processing Toolbox。核心代码基于 Multicarrier Modulation Recognition 数据集生成项目,输出文件 MWR_all_AMC_diffmod.mat。

一、引言

自动调制识别(Automatic Modulation Classification, AMC)是频谱感知、干扰识别与认知无线电的关键前置技术。随着 5G/6G 候选波形增多(OFDM、FBMC、UFMC、FOFDM、WOLA、GFDM、OTFS、AFDM),识别任务的难点从"调制阶数"转移到"多载波波形类别"。训练识别模型的第一步是构建高质量数据集:波形种类齐全、信道非理想、参数可复现 。

本文给出完整的数据集生成实现,覆盖 8 种多载波波形的调制原理、VehicularA 信道建模、频偏/时偏/相位噪声注入、SNR 扫点与数据标准化,并附可运行代码片段。

二、系统模型

发射端按 8 种波形分别调制,统一经过以下损伤链后保存 IQ 数据:

复制代码
符号映射(QPSK/16QAM/64QAM)
   → 多载波调制(OFDM/FBMC/UFMC/FOFDM/WOLA/GFDM/OTFS/AFDM)
   → 频偏注入(归一化0.4)
   → 时偏注入(0~0.05/Δf)
   → VehicularA 多径信道(60km/h, Jakes 多普勒)
   → AWGN(按 SNR 扫点 -18:2:20 dB)
   → 逐SNR标准化 → 保存 .mat

2.1 关键仿真参数

参数 取值 说明
采样率 f s f_s fs 15 × 10 3 × 256 15\times10^3\times256 15×103×256 满足奈奎斯特与子载波配置
子载波间隔 Δ f \Delta f Δf 15 15 15 kHz LTE 标准
有效子载波数 128 OFDM FFT 点数 512
SNR -18 : 2 : 20 dB 20 个 SNR 点
每 SNR 重复 1800 QPSK/16QAM/64QAM 各 600 帧
信道 VehicularA 车载多径,6 径
移动速度 60 km/h Jakes 谱,载频 1 GHz 下 f d ≈ 55 f_d\approx 55 fd≈55 Hz
归一化频偏 0.4 相对子载波间隔
相位噪声 线宽 200 kHz 本振非理想性
数据长度 1024 采样点/帧 实部、虚部两通道

三、8 种多载波波形调制实现

3.1 OFDM

OFDM 将宽带信道划分为 N N N 个正交窄带子载波:

x ( t ) = ∑ k = 0 N − 1 d k   e j 2 π k Δ f t x(t)=\sum_{k=0}^{N-1}d_k\,e^{j2\pi k\Delta f t} x(t)=k=0∑N−1dkej2πkΔft

每符号前插入循环前缀(CP)对抗 ISI。+Modulation/+OFDM 类中通过 IFFT + CP 插入实现,属于基准波形。

3.2 FBMC

FBMC 使用重叠因子 K = 4 K=4 K=4 的 PHYDYAS 原型滤波器逐子载波整形,相邻子载波频谱可重叠,因此无需 CP,频谱效率高于 OFDM,代价是解调复杂度高。实现上先做 OQAM 符号映射,再经原型滤波器组叠加:

matlab 复制代码
% gfdmlib 内置 FBMC 滤波器组,K=4,滚降 0.5
[p] = get_defaultGFDM('PHYDYAS');

3.3 UFMC

UFMC 将子载波划分为若干子带,对子带整体滤波 (子带内仍用 OFDM),滤波器长度 L f = N / 2 + 1 L_{f}=N/2+1 Lf=N/2+1,复杂度低于 FBMC。实现时每子带 IFFT 后与 Chebyshev 滤波器卷积再叠加。

3.4 FOFDM

FOFDM 在 OFDM 块整体后接长度为 L L L 的滤波,滤波器由 Sinc 加窗生成,抑制带外泄漏:

matlab 复制代码
% 生成滤波 FOFDM 滤波器(时域脉冲响应)
filtLen = 512;          % 滤波器长度
h = firls(filtLen-1, [0 0.85 1 1], [1 1 0 0]);

3.5 WOLA

WOLA 对 OFDM 符号加窗(如汉明窗),符号之间做重叠相加,用窗函数压低带外旁瓣,复杂度几乎不变。

3.6 GFDM

GFDM 在一个块内配置 K K K 子载波 × M M M 子符号,通过循环脉冲整形实现非正交传输:

x n = ∑ k = 0 K − 1 ∑ m = 0 M − 1 d k , m   g k , m n , g k , m n = g ( n − m K )   m o d   K M ⋅ e j 2 π k K n xn=\sum_{k=0}^{K-1}\sum_{m=0}^{M-1}d_{k,m}\,g_{k,m}n,\quad g_{k,m}n=g(n-mK)\\bmod KM\cdot e^{j2\pi\frac{k}{K}n} xn=k=0∑K−1m=0∑M−1dk,mgk,mn,gk,mn=g(n−mK)modKM⋅ej2πKkn

实现复用 gfdmlib 的 GFDM_Coder:

matlab 复制代码
function [GFDM_Tx_real, GFDM_Tx_imag] = GFDM_Coder(K, M, pulse, rolloff, overlap, Ncp, mu)
% K=128 子载波, M=7 子符号, pulse='rc' 升余弦, rolloff=0.1, mu=2(QPSK)/4/6
p.K = K; p.M = M; p.Ncp = Ncp;
p.pulse = pulse; p.a = rolloff; p.mu = mu;
B_C = do_qammodulate(get_random_symbols(p), p.mu);
D   = do_map(p, B_C);
GFDM_Complex = do_modulate(p, D);   % 单块调制
% ... 归一化后串行输出

3.7 OTFS

OTFS 将符号调制在时延-多普勒域,经 ISFFT 映射到时间-频率域,再通过 Heisenberg 变换(IFFT)发射:

matlab 复制代码
function y = OTFS_modulation(N, M, x, padlen, padtype)
% x: M×N 时延-多普勒域符号(M 子载波, N 时隙)
X = fft(ifft(x).').'/sqrt(M/N);   % ISFFT
y = ifft(X.')*sqrt(M);            % Heisenberg 变换
y = y(:);
switch padtype
    case 'CP'
        y = [y(end-padlen+1:end,:); y]; y = y(:);   % 每列补CP
    case 'ZP'
        y = [y; zeros(padlen,N)]; y = y(:);          % 每列补零
end
end

3.8 AFDM

AFDM 基于离散仿射傅里叶变换(DAFT),在 DFT 前后各乘一个 chirp 相位对角阵:

X = Λ c 2 F Λ c 1 x \mathbf{X}=\mathbf{\Lambda}{c_2}\mathbf{F}\mathbf{\Lambda}{c_1}\mathbf{x} X=Λc2FΛc1x

其中 Λ c = d i a g ( e − j 2 π c n 2 ) \mathbf{\Lambda}_c=\mathrm{diag}(e^{-j2\pi c n^2}) Λc=diag(e−j2πcn2)。chirp 参数 c 1 c_1 c1、 c 2 c_2 c2 需满足正交性条件, c 1 c_1 c1 与最大多普勒相关:

matlab 复制代码
function [S] = AFDM_modulation(X, c1, c2, cp_len)
N = size(X, 1);
L1 = diag(exp(-1j*2*pi*c1*((0:N-1).^2)));
L2 = diag(exp(-1j*2*pi*c2*((0:N-1).^2)));
F  = dftmtx(N)/sqrt(N);
IA = L1'*F'*L2';          % DAFT 矩阵
S  = IA*X;
if cp_len ~= 0
    n  = -cp_len:1:-1;
    Ro = exp(-1j.*2.*pi.*c1.*(N^2+2*N*n));  % chirp 周期扩展
    S  = [S(end-cp_len+1:end,:).*Ro; S];
end
S = S(:);
end

注意 :AFDM 的 CP 是 chirp 周期扩展 (乘 e − j 2 π c 1 ( N 2 + 2 N n ) e^{-j2\pi c_1(N^2+2Nn)} e−j2πc1(N2+2Nn)),不是普通循环前缀。chirp 参数按最大多普勒计算:

matlab 复制代码
maxDoppler = maxVel / (physconst('lightspeed')/Channel_CarrierFrequency) ...
             * 2 / SamplingRate * AFDM_NumberOfSubcarriers;
c1_AFDM = (2*(maxDoppler + AFDM_guardWidth) + 1) / (2*AFDM_NumberOfSubcarriers);
c2_AFDM = 1 / (AFDM_NumberOfSubcarriers^2 * pi);

四、信道与损伤注入

4.1 频偏

matlab 复制代码
t = (0:N_sig-1)' / fs;
freq_offset_signal = s_moded .* exp(1j*2*pi*freq_offset*SubcarrierSpacing*t);

freq_offset=0.4 为归一化频偏,需乘子载波间隔 15 15 15 kHz 得绝对频偏。

4.2 时偏

matlab 复制代码
M_NormalizedTimeOffset_Samples = round((0.05/SubcarrierSpacing)/dt);
M_NormalizedTimeOffset_Samples = randi(M_NormalizedTimeOffset_Samples);
time_offset_signal = [zeros(M_NormalizedTimeOffset_Samples,1); ...
                      freq_offset_signal(1:end-M_NormalizedTimeOffset_Samples)];

4.3 VehicularA 信道与 AWGN

matlab 复制代码
% 每条样本重新生成信道实现(避免模型"背信道")
ChannelModel.NewRealization;
r_noNoise = ChannelModel.Convolution(time_offset_signal);

% 加噪:按 OFDM 符号噪声功率折算
Pn_time  = 1/OFDM.GetSymbolNoisePower(1) * 10^(-SNR_OFDM_dB/10);
noise    = sqrt(Pn_time/2) * (randn(N,1) + 1j*randn(N,1));
rxSig    = r_noNoise + noise(1:N_sig);

五、数据标准化与保存

matlab 复制代码
% 逐 SNR 标准化(防止 SNR 信息泄露进特征)
temp_gen_data = (temp_gen_data - mean(temp_gen_data,'all')) ...
                ./ std(temp_gen_data,0,'all');

% 保存:xAFDM, xGFDM, xFOFDM, xUFMC, xFBMC, xOTFS, xOFDM, xWOLA
% 维度:snr_num × 1800 × 2 × 1024(SNR × 重复 × 通道 × 采样点)
save('MWR_all_AMC_diffmod.mat', 'xAFDM', 'xGFDM', 'xFOFDM', ...
     'xUFMC', 'xFBMC', 'xOTFS', 'xOFDM', 'xWOLA', ...
     'snr_seq', 'S_Number', '-v7.3');

六、仿真结果分析

生成后可绘制 6 波形 × {实部、虚部、包络} 的 3×6 时域对比图,观察要点:

  1. OFDM/WOLA/FOFDM 包络近似高斯分布,WOLA 与 FOFDM 因窗/滤波,带外衰减更陡;
  2. FBMC 符号在时域重叠,包络更"毛糙",边界存在过渡带;
  3. OTFS 经 ISFFT 后时域接近均匀分布,包络平坦;
  4. GFDM 因滚降滤波器(rolloff=0.1)与重叠配置,块边缘可见过渡带。

这些时域统计特征为后续基于 CNN/Transformer 的波形识别提供了可分特征。识别准确率曲线(accuracy vs SNR)建议保存为 PNG 用于论文/报告。

七、总结

本文实现了 8 种多载波波形识别数据集生成的完整 MATLAB 流程,关键经验:

  1. AFDM 的 chirp 周期扩展 CP 与 c 1 c_1 c1、 c 2 c_2 c2 参数设计是正确性核心;
  2. OTFS 的 CP/ZP 需按列(逐符号)补,注意维度;
  3. 频偏/时偏/多普勒等损伤逐条注入,且每条样本重新生成信道实现;
  4. 数据标准化必须逐 SNR 进行,避免信息泄露。

完整的开箱即用工程、原始数据集与批量测试脚本,可在**EWFrontier** 获取。

相关推荐
城南皮卡丘4 天前
苹果果实成熟度检测数据集 4195张+YOLO格式
深度学习·yolo·目标检测·计算机视觉·数据集
微尘hjx4 天前
【数据集 11】面向城市道路的坑洞检测数据集(含8760张,已按比例划分训练、验证、测试集,支持YOLO全系列训练)
人工智能·yolo·目标检测·数据集·道路坑洞·路坑数据集·路坑
数聚天成DeepSData7 天前
两份名录里的同名机构,主键该怎么合并
人工智能·深度学习·机器学习·数据集·deepsdata
Felaim10 天前
【SLAM】SLAM数据集相机规格说明
数据集·vslam·slam·相机标定
数聚天成DeepSData11 天前
第三方地图工具导出的 Landsat 影像,使用条件和 USGS 官方下载的一样吗
人工智能·深度学习·机器学习·数据集·deepsdata
数聚天成DeepSData12 天前
验收一批标注数据时,一致性到底在比谁和谁
人工智能·深度学习·机器学习·数据集·deepsdata
数聚天成DeepSData13 天前
两批标注数据合并前要核对什么
人工智能·深度学习·机器学习·数据集·deepsdata
数聚天成DeepSData13 天前
外部标注需求里该写清哪几项,样例包才验收得动
人工智能·深度学习·机器学习·数据集·deepsdata
数聚天成DeepSData13 天前
Landsat 影像去哪里下载:选景、批量与脚本检索怎么选
人工智能·深度学习·机器学习·数据集·deepsdata
数聚天成DeepSData21 天前
夜间灯光可以代表经济活动吗?先处理年际一致性
人工智能·深度学习·机器学习·数据集·deepsdata