简介:论文面向非合作通信中的信号调制方式自动识别,提出一种基于循环累积量特征提取与神经网络智能分类相结合的算法,适合无线通信、信号处理及深度学习方向的研究人员和工程师。文章从信号模型与二阶、四阶循环累积量公式推导入手,详细给出三层神经网络分类器设计,可在无需人工设定判决门限情况下完成BPSK、QPSK、8PSK、8QAM与16QAM信号的分类识别,并验证了低信噪比下的鲁棒性。资源为单个PDF文件,大小约338KB,已有101人学习浏览,可作为调制识别课题、算法研究或毕业论文写作的参考资料。文内包含完整的理论推导、特征提取步骤、网络参数配置和实验评估流程,便于读者按图索骥地复现整套算法。
1. 非协作信号下的调制识别,为什么偏偏选循环累积量
在认知无线电、频谱监测和电子侦察这类非协作通信场景里,接收机面对的最大问题不是噪声本身,而是“不知道对方用什么规则在发信号”。调制方式未知,后面的解调、译码、协议分析全都无从谈起。传统的功率谱估计和瞬时统计量在信噪比低于 0 dB 时基本失效,眼图张不开,星座点糊成一团。这时候,循环累积量成了少数能在低信噪比下仍然保持区分度的特征——它不关心具体的波形畸变,而是捕捉信号内在的周期平稳结构,再用神经网络去学这些特征与调制类型的映射关系。这篇内容适合做信号处理、软件无线电协议逆向的工程师,也适合准备通信方向竞赛的在校生,核心解决的是“怎么把循环累积量特征和神经网络正确接在一起,而不是各自为战”。
2. 循环累积量能当信号“指纹”的前提:从循环平稳到统计量归一化
2.1 为什么要用循环累积量而不是普通累积量
通信信号经过脉冲成形之后,均值、自相关函数都呈现周期性,这类信号被称为循环平稳信号。普通累积量只对一个平稳随机过程做时间平均,把周期性信息给抹掉了;而循环累积量在时间平均之前,先乘上一个循环频率因子,把信号里隐含的周期分量单独抽出来。这一下就和噪声拉开了差距——平稳白噪声没有循环频率分量,它的循环累积量在非零循环频率处理论值恒为零。
正是这个“只在信号存在的循环频率上有值”的性质,让循环累积量成为调制识别的天然候选特征。比如 BPSK 信号在符号速率对应的循环频率上有明显的二阶循环累积量峰值,而 QPSK 需要到四阶才能看出显著差异。选特征的时候,常规做法是取一组固定循环频率下的累积量数值拼成向量,或者把循环频率-累积量幅度的二维图直接喂给神经网络。
% 二阶循环累积量的离散估计骨架(MATLAB) function C = cyclic_cumulant(x, alpha, N) % x : 接收信号序列(已做载波同步或已知近似频偏) % alpha : 待估计的循环频率 % N : 累积的符号数,决定方差 x = x(:); L = length(x); % 循环自相关:对 x(t) * conj(x(t-tau)) 乘 exp(-j*2*pi*alpha*t) 后累加 tau = 0; % 时延取0,对应二阶混合矩的简化形式 C = sum(x .* conj(x) .* exp(-1j*2*pi*alpha*(0:L-1).')) / L; end这段代码的核心在最后一行:先把信号与自身共轭相乘,得到能量序列,再乘上以循环频率 alpha 旋转的复指数,最后做算术平均。当 alpha 等于信号真实的循环频率时,乘积项里的相位变化被抵消,累加值显著不为零;当 alpha 偏离真实值时,复指数在求和区间里近似均匀分布,累加结果趋近于零。这样我们就得到了一个对循环频率敏感的标量特征。需要说明的是,这里取时延 tau=0 是为了用最简单的方式展示估计思路,实际工程里四阶累积量还需要对不同时延组合做平均,方差会更大,需要的样本数也更多。
2.2 高阶循环累积量对不同调制格式的理论区分能力
单看二阶量只能区分“有没有信号”和大概的符号速率,想把 MPSK、MQAM 这些同族调制分清楚,必须上四阶、六阶循环累积量。原因是高阶量的相位旋转特性对调制阶数更敏感:BPSK 的四阶累积量理论值远大于 QPSK,而 16QAM、64QAM 这类幅度调制又有不同的幅值期望组合。
我一般会把理论值预先算成一张查表,这样在仿真和实测时能快速判断特征提取的代码有没有写对。以下是常见调制格式在归一化后的四阶循环累积量理论值(默认信号功率归一化为 1,循环频率取符号速率相关的位置):
| 调制方式 | |C40|(四阶累积量) | |C42|(四阶共轭累积量) |
|---|---|---|
| BPSK | 2 | 2 |
| QPSK | 1 | 0 |
| 8PSK | 0 | 0 |
| 16QAM | 0.68 | 0 |
| 64QAM | 0.36 | 0 |
从表里能看到两个关键点。其一,QPSK 和 8PSK 的 |C40| 都为 1 和 0,需要用 |C42| 来做二次区分,这就是为什么只用单一阶数做特征在很多论文里准确率到 90% 就上不去了。其二,16QAM 和 64QAM 的 |C40| 都非零,幅度调制族内部往往还要补充六阶累积量或者星座点幅度方差,才能把密集的 64QAM 和 16QAM 分开。实际使用中,把各阶循环累积量拼成特征向量时,每一维都应该单独做归一化,否则幅值较大的低阶量会主导神经网络的损失函数。
2.3 信道影响怎么剔除:循环累积量的归一化技巧
循环累积量不受加性高斯白噪声影响,但不代表不受信道影响。多径衰落会让信号幅度产生乘性畸变,这直接改变累积量的绝对值大小。不同信号的幅度不同,如果直接把绝对累积量值送入神经网络,网络学会的很可能是“识别信号功率”,而不是“识别调制方式”,训练集和测试集信噪比一变化就崩。
所以标准做法是构造归一化累积量,用低阶量的绝对值去除高阶量,比如定义归一化四阶量C40_norm = |C40| / (|C21|^2)。其中 |C21| 是二阶循环矩的绝对值,它跟随信号的功率变化,相除之后功率因子被抵消。这样归一化之后的理论值就和信号功率、接收通道增益无关了。特征生成流程一般是:先估计出 |C21|、|C40|、|C42|,再做比值和正态化(用训练集的均值和方差做标准化),最后送入网络。
提示:多径信道的频率选择性衰落通常不是纯乘性增益,归一化只能消除平坦衰落的影响。在频率选择性信道下,还是得靠信道均衡或者干脆用循环谱的二维图像特征,让神经网络自己去学不变性。
3. 特征形态决定网络选型:前馈、CNN 还是循环结构
3.1 把循环累积量组织成什么样的数据
循环累积量提取完之后,面对的首要问题不是选网络,而是决定以什么形态的数据送到网络里。同样一组特征,展开成一维向量和堆叠成二维图,对网络结构的要求完全不同。
常见做法有三种。第一种是固定一组循环频率(比如符号速率整数倍的几个峰),在每个循环频率下提取若干阶累积量,拼成一个固定长度的一维向量,用bp神经网络或者更深的前馈神经网络就能处理。向量维度通常在 16 到 64 维之间。这种方式特征紧凑、训练快,但循环频率选择的偏差会直接损害识别率。
第二种是把循环频率-累积量幅度的二维分布直接当图像处理,用卷积神经网络去提取局部模式。因为不同调制方式的循环谱有不同的峰脊结构,CNN 的局部感受野很适合捕捉这种空间相关性。这个和“图像处理为啥用cnn不用前馈神经网络”是同一个道理——前馈网络对输入的空间局部性没有任何假设,把所有维度一视同仁地全连接,在二维结构数据上参数效率低得多。第三种是沿时间轴滑窗提取循环累积量序列,配上循环神经网络或 LSTM,用时间上下文来补足低信噪比下单帧特征方差过大的问题。这种方法效果好,但训练速度和收敛难度都要高一个量级。
3.2 不同网络结构的分工边界与适用场景
| 网络结构 | 输入形态 | 参数量级 | 低信噪比鲁棒性 | 适用场景 |
|---|---|---|---|---|
| 前馈神经网络 / BP | 一维特征向量 | 小 | 中 | 快速原型、硬件资源受限的嵌入式环境 |
| 卷积神经网络 | 二维循环谱图 | 中 | 较高 | 频偏残留较大、特征局部模式明显的场景 |
| 循环神经网络/ LSTM | 时间滑窗特征序列 | 中到大 | 高 | 突发信号、信噪比变化剧烈、需要时间累积的场景 |
| 图神经网络 | 累积量关系图 | 中 | 中 | 多天线融合、多信号叠加分离等结构化场景 |
实际选择上,如果是在 x86 上位机上做离线分析,CPU 资源无所谓,直接上 CNN 最省心;如果后续要往 FPGA 或者 DSP 上移植,参数量很难压下来的 CNN 会是个麻烦,一维特征加轻量前馈网络反而更容易量化部署。我个人的经验是:先拿一维特征和 BP 网络把整体流程调通,确认特征提取和标签对准没有问题,再根据识别率瓶颈决定是否升级到 CNN 或加时间序列建模。
3.3 训练集构造里最容易忽略的犯错误
调制识别网络很少在真实信号上从头训练。原因很简单:真实数据的标签不好拿,你得先解调出原始的比特流,才能反推它是什么调制方式,这本身就需要一个已知条件下的精确解调系统。绝大多数团队的做法是用仿真数据预训练,再用少量真实 I/Q 数据微调。
这个过程中有几个惯例要特别留意。第一,每个调制类型的数据量要按信噪比分段均衡,不能只生成高信噪比的样本,否则模型在 0 dB 以下就是瞎猜。第二,I/Q 不平衡和直流偏置要人为叠加进去,把损伤参数随机化,让网络学到的是对损伤不敏感的特征,而不是对干净信号过拟合。第三,训练集和验证集必须按“不同的随机种子”来切分,不能用同一段信号的不同时隙既做训练又做验证——因为相邻时隙的噪声相关,验证结果会虚高。
提示:生成仿真训练数据时,每种信噪比下的样本数要相同,且信噪比网格间隔不要超过 2 dB。间隔太大会让网络丢失信噪比与特征分布之间连续变化的关系,间隔太密则训练耗时翻倍却没有收益。
4. 完整跑通一次“累积量提取 + CNN 分类”的仿真链路
4.1 信号生成到循环累积量估计的 MATLAB 骨架
下面给出一段可以完整运行的最小流程,覆盖信号生成、累积量提取、特征集构建三步。这个流程去掉了工具箱依赖,只用原生 MATLAB 语法,方便在只有基础 License 的环境下直接测试。
% 调制识别特征提取:从基带信号到归一化循环累积量特征 % 以 QPSK 和 16QAM 为例,生成基带符号 + 脉冲成形 + AWGN Fs = 20e6; % 采样率 20 MHz Rs = 1e6; % 符号速率 1 MHz,过采样倍数 20 nSymbols = 4096; % 每个样本包含的符号数 snrList = [0, 5, 10]; % 要扫描的信噪比 % 生成 QPSK 信号(也可以换成 16QAM 等,标签同步修改) data = randi([0 3], nSymbols, 1); modOrder = 4; sym = exp(1j * 2 * pi * data / modOrder); % QPSK 星座点 % 简单的矩形成形,实际系统应换用根升余弦滤波器 tx = reshape(repmat(sym.', 20, 1), [], 1); % 计算二阶循环自相关(归一化) alpha = Rs; % 取符号速率为循环频率 txLen = length(tx); C21_abs = abs(sum(abs(tx).^2 .* exp(-1j*2*pi*alpha*(0:txLen-1).' / Fs)) / txLen); % 计算四阶循环累积量(简化估计) C40_abs = abs(sum(tx.^4 .* exp(-1j*2*pi*alpha*(0:txLen-1).' / Fs)) / txLen); C40_norm = C40_abs / (C21_abs^2); % 归一化,消除功率因子 fprintf('C21_abs = %.4f, C40_norm = %.4f\n', C21_abs, C40_norm);这段代码有两个地方需要重点解释。一是repmat(sym.', 20, 1)做了过采样后的矩形成形,相当于每个符号重复 20 个采样点,这样符号速率对应的循环频率在数字域里才是可辨的。二是C40_norm = C40_abs / (C21_abs^2)这一行的归一化,理论上 QPSK 的 C40_norm 在无噪声时应接近 1,16QAM 接近 0.68,如果算出来偏差超过 10%,优先检查符号数是否少于 2048——样本太少时累积量估计方差偏大是正常现象,不用急于怀疑代码。
4.2 把特征送入 CNN 分类器
累积量特征已经规整成二维数组之后,按图像的方式交给 CNN 是最直接的路径。我给出一个规模适中、不会在 CPU 上跑到天荒地老的网络结构,同时附上每层的设计理由。
% CNN 分类网络定义(MATLAB Deep Learning Toolbox) layers = [ imageInputLayer([32 32 1], 'Normalization', 'none', 'Name', 'input') convolution2dLayer(3, 16, 'Padding', 'same', 'Name', 'conv1') batchNormalizationLayer('Name', 'bn1') reluLayer('Name', 'relu1') maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool1') convolution2dLayer(3, 32, 'Padding', 'same', 'Name', 'conv2') batchNormalizationLayer('Name', 'bn2') reluLayer('Name', 'relu2') maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool2') fullyConnectedLayer(5, 'Name', 'fc') softmaxLayer('Name', 'softmax') classificationLayer('Name', 'output') ]; % 训练选项:重点看学习率和 mini-batch 大小 options = trainingOptions('adam', ... 'InitialLearnRate', 1e-3, ... 'MiniBatchSize', 128, ... 'MaxEpochs', 30, ... 'ValidationFrequency', 50, ... 'Plots', 'training-progress');网络设计上,两层 3×3 卷积加池化的组合在图像尺寸只有 32×32 时足够提取局部峰脊特征,参数量也在可控范围。batchNormalizationLayer放在卷积和 ReLU 之间,能显著减轻累积量特征数值范围不一致带来的训练抖动。训练选项里学习率 1e-3 搭配 Adam 优化器是这类中等规模图像分类任务的常规起点;如果训练损失不降,优先降低学习率而不是加大网络深度。
对于 5 类调制识别任务,这个结构在 10 dB 信噪比下验证集准确率通常能到 98% 以上,0 dB 时会掉到 85% 附近。如果偏差过大,先检查训练集是不是只在干净高信噪比数据上生成的,再看循环频率网格的划分是否覆盖了所有调制格式的特征峰。
4.3 混淆矩阵和信噪比扫描结果应该怎么看
训练完成后,只用总体准确率下结论是新手常犯的错误。调制识别更看重的是哪两类之间在混淆。比如 QPSK 和 8PSK 的混淆根因往往是二阶特征在低阶时相似度过高,这时该补的是四阶 C42 特征,而不是加深网络。16QAM 和 64QAM 混淆则通常说明幅度分辨率相关的特征不够,需要从累积量阶数上补六阶量。
另一个必看的指标是“信噪比-准确率”曲线。做法很简单:把测试集按 0~20 dB 每 2 dB 一组切分,分别统计准确率。如果一个系统的识别率在 8 dB 以上接近 100%,却在 6 dB 时骤降到 60%,这往往不是网络能力不足,而是特征提取端的累积量估计方差在低信噪比下急剧增大,输入分布的偏移量已经超出了网络泛化容限。这种情况下加大训练数据只会浪费算力,应该先去改进累积量的估计长度或引入时域滑窗平均。
5. 真实工程里更常用的三个进阶手法
5.1 用循环频率峰对齐对抗残余频偏
仿真里假设载波同步是理想的,但真实接收机的载波频偏往往有几十到几百赫兹的残留。循环频率位置一旦偏离理论值,累积量能量就会泄漏到相邻频率仓,特征值显著衰减。我一般会在提取特征之前加一步循环频率峰值搜索:在理论循环频率附近 ±2 个频率分辨率单位内做一次一维峰值扫描,把局部最大值对应的频率当实际循环频率,替代理论值。这一步等价于在累积量计算里内嵌了一个粗同步,能换来 5 dB 左右的等效信噪比改善。
5.2 模型剪枝与量化,把网络压到嵌入式处理器
许多项目做完仿真实验后,面临的下一个问题就是往 FPGA 或 DSP 上移植。CNN 的参数量和中间激活值在嵌入式平台上是很大的负担。常规做法是先做训练后剪枝,把权重绝对值低于阈值的连接直接置零,再微调几个 epoch 恢复精度;随后把权重从 float32 量化为 int8。值得注意的是,调制识别网络的输入特征本身抗量化能力比自然图像强得多——因为循环累积量的动态范围不大,8 bit 量化损失的精度在统计意义上几乎可以忽略,但网络体积通常能压缩到原来的四分之一以下。
5.3 用少量真实 I/Q 数据做微调,而不是重新训练
仿真数据训练出来的模型在真实场景里一定会有分布偏移,因为仿真建模很难覆盖发射机的非线性失真、滤波器的群时延特性、本振相位噪声这些现实因素。主流做法是拿 5~10 分钟的真实 I/Q 数据,打上标签后用极小的学习率(比如 1e-5)对整个网络做 5~10 个 epoch 的微调。这里有个容易忽略的陷阱:微调时要把 BatchNorm 层的统计量重新估计,否则训练模式和推理模式的统计量不一致,会导致识别率在预训练基础上反而下降。具体实现上,只用少量数据做微调的话,learning rate 要调低,mini-batch 也要降低到 16 或 32,以免真实数据过少导致 Batchnorm 统计量抖动。
本文还有配套的精品资源,点击获取