基于 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 时域对比图,观察要点:
- OFDM/WOLA/FOFDM 包络近似高斯分布,WOLA 与 FOFDM 因窗/滤波,带外衰减更陡;
- FBMC 符号在时域重叠,包络更"毛糙",边界存在过渡带;
- OTFS 经 ISFFT 后时域接近均匀分布,包络平坦;
- GFDM 因滚降滤波器(rolloff=0.1)与重叠配置,块边缘可见过渡带。
这些时域统计特征为后续基于 CNN/Transformer 的波形识别提供了可分特征。识别准确率曲线(accuracy vs SNR)建议保存为 PNG 用于论文/报告。
七、总结
本文实现了 8 种多载波波形识别数据集生成的完整 MATLAB 流程,关键经验:
- AFDM 的 chirp 周期扩展 CP 与 c 1 c_1 c1、 c 2 c_2 c2 参数设计是正确性核心;
- OTFS 的 CP/ZP 需按列(逐符号)补,注意维度;
- 频偏/时偏/多普勒等损伤逐条注入,且每条样本重新生成信道实现;
- 数据标准化必须逐 SNR 进行,避免信息泄露。
完整的开箱即用工程、原始数据集与批量测试脚本,可在**EWFrontier** 获取。
