实测|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

实现复用 gfdmlibGFDM_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** 获取。

相关推荐
YOLO数据集集合2 天前
排球动作识别数据集 | 排球动作 体育分析 动作识别9041期
深度学习·数据集·动作识别·排球动作识别·运动动作识别·体育分析·排球动作
深瞳智检2 天前
深瞳智检(小程序)正式上线!【免费/快捷/方便】获取YOLO检测数据集
人工智能·yolo·目标检测·小程序·数据集·cv数据收集
@HNUSTer5 天前
基于 GEE 的 Sentinel-2 多光谱数据实现河流浊度指数(NDTI)遥感监测
云计算·数据集·遥感大数据·gee·云平台·河流浊度(ndti)·水质遥感反演
weixin_440213297 天前
大模型训练、微调、对齐、推理、量化、优化、数据集等
微调·数据集·sft·预训练·模型量化·gptq·kv cache
YOLO数据集集合7 天前
蚊子视觉验证数据集 | 蚊虫识别 疟疾防控 病媒生物 细粒度分类 YOLO格式 深度学习数据集
深度学习·yolo·分类·数据集·蚊子分类·蚊虫分类·蚊虫识别
@HNUSTer12 天前
基于 GEE 的 Sentinel-2 海岸线自动提取:从NDWI水体指数到Canny边缘检测全流程
云计算·数据集·遥感大数据·gee·云平台·canny边缘检测·sentinel-2
@HNUSTer12 天前
基于 GEE 的 LST 降尺度建模——利用 Sentinel-2 和 SRTM 提升 Landsat 热红外分辨率至 10 米
云计算·数据集·遥感大数据·gee·云平台·随机森林回归模型·多源遥感与随机森林回归
YOLO数据集集合19 天前
一站式AI数据自动化标注与训练平台:零门槛玩转YOLO全系列模型
人工智能·深度学习·yolo·ai·自动化·数据集·标注软件
HyperAI超神经20 天前
128K长上下文+智能体强化训练!LFM2.5-2.6B解锁端侧大模型高效部署;DETR用Transformer斩断NMS与Anchor,重塑目标检测
人工智能·深度学习·目标检测·计算机视觉·数据集·transformer