基于时频双分支 CNN 的射频信号调制自动识别系统,使用 PyTorch 实现。支持 11 种常见调制类型的分类,含数据生成、训练、评估、可视化及 Gradio 交互界面。
| 模拟调制 | 数字调制 |
|---|---|
| AM(常规调幅) | BPSK(二进制相移键控) |
| AM-DSB(双边带调幅) | QPSK(四进制相移键控) |
| AM-SSB(单边带调幅) | 8PSK(八进制相移键控) |
| WBFM(宽带调频) | FSK2(二进制频移键控) |
| FSK4(四进制频移键控) | |
| 16QAM | |
| 64QAM |
采用时频双分支卷积神经网络(model_v2.py → DualBranchClassifier):
输入 (batch, 3, 512) — I路 + Q路 + FFT幅度
│
┌────┴────┐
▼ ▼
时域分支 频域分支
(2ch→128) (1ch→128)
Conv1d+残差 Conv1d
MaxPool MaxPool
│ │
└────┬────┘
▼
特征融合 (256)
FC → 128 → 11
- 时域分支:处理 I/Q 两路信号,使用残差块提取时域特征
- 频域分支:处理 FFT 幅度谱,提取频域特征
- 融合层:拼接两路特征后通过全连接层分类
torch>=2.0.0
numpy>=1.21.0
scipy>=1.7.0
scikit-learn>=1.0.0
matplotlib>=3.5.0
seaborn>=0.11.0
tqdm>=4.62.0
gradio>=4.0.0
安装依赖:
pip install -r requirements.txt# 训练模型
python main.py --mode train
# 评估模型(生成混淆矩阵、SNR曲线等)
python main.py --mode evaluate
# 生成可视化图表(波形、星座图、频谱图等)
python main.py --mode visualize
# 交互式演示
python main.py --mode demo
# 完整流程:训练 → 评估 → 可视化
python main.py --mode all
# 启动 Gradio Web 界面
python app.py.
├── main.py # 主入口
├── config.py # 配置(调制类型、信号参数、训练超参数)
├── dataset.py # 数据生成器(11种调制信号 + AWGN噪声)
├── model.py # 基础CNN模型
├── model_v2.py # 时频双分支CNN模型(主力模型)
├── train.py # 训练脚本(含数据预处理、FFT、早停)
├── evaluate.py # 评估脚本(混淆矩阵、SNR分析、分类报告)
├── visualize.py # 可视化脚本(波形、星座图、频谱图等)
├── app.py # Gradio Web 交互界面
├── generate_report.py # 实验报告生成
├── generate_report_detailed.py # 详细实验报告生成
├── requirements.txt # 依赖列表
├── checkpoints/ # 模型权重
│ └── best_model.pth
├── results/ # 评估结果与图表
├── confusion_matrix.png
├── snr_accuracy.png
├── class_accuracy.png
├── training_curve.png
├── waveforms.png
├── constellation.png
├── spectrograms.png
└── ...
## 关键参数
| 参数 | 值 |
|------|-----|
| 采样率 | 200 kHz |
| 信号长度 | 1024 点 |
| 载波频率 | 10 kHz |
| 信噪比范围 | -10 dB ~ 30 dB(步进 5 dB) |
| 每类样本数 | 2000 |
| 训练/验证/测试 | 70% / 15% / 15% |
| Batch Size | 64 |
| Epochs | 40(含早停) |
| 优化器 | AdamW(lr=0.001, weight_decay=1e-5) |
| 学习率调度 | ReduceLROnPlateau |
| 梯度裁剪 | max_norm=5.0 |
## 评估指标
- **总体准确率** 与 **F1-Score**
- **混淆矩阵**:展示各类别间的混淆情况
- **SNR-准确率曲线**:不同信噪比下的识别性能
- **各类别准确率**:逐类别识别表现