XDU 机器学习:无线电信号调制识别作业
基于深度学习的无线电信号调制识别实验(RML2016.10a 数据集)
一、问题背景:为什么需要无线电信号调制识别?
无线电通信系统通常会通过不同调制方式承载信息,例如 BPSK、QPSK、QAM 和 WBFM 等。调制识别的任务是根据接收到的信号片段,自动判断其调制类型。该技术常用于频谱监测、干扰识别、认知无线电和通信信号分析等场景。
传统调制识别方法往往依赖人工特征,例如瞬时幅度、瞬时相位、频谱峰值或高阶累积量。这类方法解释性较强,但在低信噪比、复杂信道或调制方式相近时,特征设计和分类效果容易受限制。深度学习方法可以直接从 IQ 信号中学习判别特征,减少人工特征工程,并在复杂样本上具有更好的扩展性。
本文使用 RML2016.10a 数据集构建调制识别模型,围绕数据读取、模型结构、训练策略和实验结果进行说明。
二、数据集介绍:RML2016.10a
RML2016.10a 是自动调制识别领域常用的数据集。数据以 Python pickle 字典形式组织,每个键由调制类型和信噪比组成,例如:
("QPSK", 2)
对应的值是形状为 (1000, 2, 128) 的 IQ 样本数组。其中 2 表示 I/Q 两路信号,128 表示每个样本的时间长度。
数据集包含 11 种调制方式:
- 数字调制:8PSK、BPSK、CPFSK、GFSK、PAM4、QAM16、QAM64、QPSK;
- 模拟调制:AM-DSB、AM-SSB、WBFM。
信噪比范围为 -20 dB 到 18 dB,步长为 2 dB,共 20 个 SNR。每个调制方式在每个 SNR 下有 1000 个样本,因此总样本数为:
11 × 20 × 1000 = 220000
实验中将数据划分为训练集、验证集和测试集,比例分别为 70%、15% 和 15%。划分时同时考虑调制类别和 SNR,使不同信噪比、不同类别在各集合中保持相对均衡。
核心数据读取流程如下:
def build_arrays_from_rml_dict(rml_dict, mods=None, snrs=None,
samples_per_class_snr=None, seed=42):
available_mods, available_snrs = discover_mods_and_snrs(rml_dict)
selected_mods = list(mods) if mods is not None else available_mods
selected_snrs = list(snrs) if snrs is not None else available_snrs
xs, ys, snr_labels = [], [], []
mod_to_id = {mod: idx for idx, mod in enumerate(selected_mods)}
for mod in selected_mods:
for snr in selected_snrs:
arr = np.asarray(rml_dict[(mod, snr)], dtype=np.float32)
xs.append(arr)
ys.append(np.full(arr.shape[0], mod_to_id[mod], dtype=np.int64))
snr_labels.append(np.full(arr.shape[0], int(snr), dtype=np.int64))
return np.concatenate(xs), np.concatenate(ys), np.concatenate(snr_labels)
三、模型设计:增强型一维卷积网络
IQ 信号本质上是双通道时间序列。模型需要同时提取局部波形变化、跨时间依赖关系以及不同通道之间的组合特征。本文采用增强型一维卷积网络,主要包含四个部分:
- 双分支输入处理:将长度为 128 的 IQ 信号切分为前后两段,分别提取局部特征;
- 多尺度卷积:使用不同卷积核观察不同范围的时间模式;
- CBAM 注意力机制:从通道和时间位置两个角度突出关键特征;
- BiLSTM 与全局池化:进一步建模时间依赖,并将变长特征压缩为分类向量。
模型前向传播的核心逻辑如下:
def forward(self, x):
front = self.front_branch(x[:, :, : self.split_point])
back = self.back_branch(x[:, :, self.split_point :])
fused = self.fusion(torch.cat([front, back], dim=1))
avg = F.adaptive_avg_pool1d(fused, 1).squeeze(-1)
max_value = F.adaptive_max_pool1d(fused, 1).squeeze(-1)
features = torch.cat([avg, max_value], dim=1)
return self.classifier(features)
其中,平均池化关注整体稳定特征,最大池化关注局部强响应特征。二者结合后送入全连接分类器输出 11 类调制方式的 logits。
注意力模块采用通道注意力和空间注意力串联的方式:
class CBAM1D(nn.Module):
def forward(self, x):
x = self.channel_attention(x)
avg = torch.mean(x, dim=1, keepdim=True)
max_value, _ = torch.max(x, dim=1, keepdim=True)
mask = self.spatial_attention(torch.cat([avg, max_value], dim=1))
return x * mask
该结构可以帮助模型在噪声较强的情况下更关注有判别意义的通道和时间片段。
四、训练策略
训练阶段使用 AdamW 优化器,并结合权重衰减抑制过拟合:
optimizer = torch.optim.AdamW(
model.parameters(),
lr=config.learning_rate,
weight_decay=config.weight_decay,
)
损失函数采用标签平滑交叉熵。普通交叉熵会鼓励模型对正确类别给出过高置信度,而标签平滑会为非目标类别保留少量概率质量,从而降低过拟合风险:
class LabelSmoothingCrossEntropy(nn.Module):
def forward(self, pred, target):
log_prob = F.log_softmax(pred, dim=1)
nll = -log_prob.gather(dim=1, index=target.unsqueeze(1)).squeeze(1)
smooth = -log_prob.mean(dim=1)
return ((1 - self.smoothing) * nll + self.smoothing * smooth).mean()
数据增强包括轻微高斯噪声、时间平移和幅度缩放:
def augment_iq(x, noise_factor=0.01):
x = x + torch.randn_like(x) * noise_factor
shift = int(torch.randint(low=-4, high=5, size=(1,)).item())
if shift:
x = torch.roll(x, shifts=shift, dims=-1)
scale = torch.empty(1).uniform_(0.9, 1.1).item()
return x * scale
训练配置使用全部 SNR 和全部样本,最大训练轮数为 50。训练过程中根据验证集准确率保存最佳模型,并使用早停策略避免无效训练。
五、实验结果与分析
实验使用 RML2016.10a 全量数据,共 220000 个样本。训练、验证和测试集样本数分别为 154000、33000 和 33000。模型使用全部 20 个 SNR 和全部 11 个调制类别。
实验结果如下:
| 指标 | 数值 |
|---|---|
| 最佳验证准确率 | 50.34% |
| 测试准确率 | 50.03% |
| 测试损失 | 1.5793 |
| 实际训练轮数 | 44 |
不同信噪比下的识别准确率如下:
| SNR(dB) | 准确率 |
|---|---|
| -20 | 9.64% |
| -18 | 9.52% |
| -16 | 10.48% |
| -14 | 16.30% |
| -12 | 20.30% |
| -10 | 29.15% |
| -8 | 38.97% |
| -6 | 50.61% |
| -4 | 59.58% |
| -2 | 66.48% |
| 0 | 68.30% |
| 2 | 69.03% |
| 4 | 68.12% |
| 6 | 68.61% |
| 8 | 69.27% |
| 10 | 68.79% |
| 12 | 69.09% |
| 14 | 70.30% |
| 16 | 68.85% |
| 18 | 69.27% |
从整体结果看,模型在测试集上达到 50.03% 的准确率。由于测试集覆盖 -20 dB 到 18 dB 的全部信噪比,整体准确率会同时受到极低 SNR 样本和高 SNR 样本影响。验证集最佳准确率为 50.34%,与测试集结果接近,说明训练过程中没有出现明显的验证集与测试集表现脱节。
分 SNR 结果能够更清楚地反映模型性能变化。-20 dB、-18 dB 和 -16 dB 时准确率约为 10%,接近 11 类随机猜测水平,说明在极低信噪比条件下,调制结构几乎被噪声淹没。随着 SNR 提升,准确率逐步上升:-10 dB 时达到 29.15%,-6 dB 时达到 50.61%,-2 dB 时达到 66.48%。当 SNR 达到 0 dB 及以上时,准确率稳定在约 68% 到 70% 之间,最高值出现在 14 dB,为 70.30%。
这一趋势符合调制识别任务的基本规律:低 SNR 下,IQ 波形中的幅度、相位和频率结构受到强噪声干扰,模型难以提取稳定特征;中高 SNR 下,信号结构逐渐清晰,卷积和时序模块能够学习到更可靠的判别模式。
混淆矩阵可用于分析具体类别的错误来源。一般来说,相位结构相近的调制方式更容易互相混淆,例如 QPSK 与 8PSK;星座结构层级相近的 QAM16 与 QAM64 也容易在噪声环境下产生误判。模拟调制与数字调制之间的差异相对明显,但在低 SNR 条件下仍可能受到噪声影响。后续若要进一步提升准确率,可以针对低 SNR 样本加强数据增强,或引入频域特征、星座图特征和 Transformer 等更强的序列建模结构。
六、总结与展望
本文基于 RML2016.10a 数据集构建了无线电信号调制识别模型。实验流程包括 IQ 数据读取、分层划分、数据增强、增强型一维卷积网络训练、模型评估和结果可视化。
模型通过双分支卷积、多尺度卷积、注意力机制和 BiLSTM 对 IQ 序列进行特征建模,可以从原始信号中自动学习调制相关特征。实验结果表明,深度学习方法能够完成端到端的调制识别,但在低 SNR 和相似调制类别上仍存在明显挑战。
后续可以从三个方向改进:
- 使用更强的时序模型,例如 Transformer 或 TCN;
- 针对低 SNR 样本设计更强的数据增强和抗噪训练策略;
- 引入星座图、频谱图等辅助表示,构建多视角融合模型。
附录:代码使用说明
代码见:
https://github.com/hurrypeter02-cmd/wuxianxinghaotiaozhi/tree/main
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)