成为新会员获取本项目完整代码、skill与AI智能体

加入会员群

8类调制验证准确率78.75%,附AI Agent、skill与完整可复现代码

TL;DR 射频信号调制识别完整落地方案:轻量1D-CNN对原始IQ信号端到端分类,8类调制验证准确率78.75%、低阶恒包络超90%,89K参数CPU实时推理,附 AI Agent 、skill与可复现代码。

摘要

痛点:射频信号调制识别长期依赖专家手工提取特征与分类规则,换场景即失效,频谱监测等实时场景急需端到端方案。

方法:用轻量 1D-CNN 直接学习原始 IQ 基带序列,叠加 DeepSeek 大模型报告生成 与 Streamlit 交互界面。

结果:8 类调制验证准确率 78.75%(宏平均 F1 0.7826),低阶恒包络调制识别率超过 90%,模型仅 89,896 参数、CPU 实时推理。

价值:全链路代码、模型与文档齐全,推理侧完全可复现,可直接支撑频谱监测、电子对抗辅助、软件无线电互操作性测试等落地场景。

本文回答以下核心问题:

  1. 如何用一维卷积网络直接对原始 IQ 基带信号做端到端调制分类,免去人工特征工程?
  2. 在 -5~20dB 宽信噪比范围内,8 类调制(含高阶 QAM)的识别表现如何、瓶颈在哪?
  3. 如何把识别结果自动生成可读的技术分析报告,并在无大模型密钥时保证交付可用?
  4. 仅 89K 参数的轻量模型如何导出部署到嵌入式设备,支撑频谱监测等实时场景?

实测验证集准确率 78.75%,低阶恒包络调制识别率超过 90%,整套流水线代码、模型与文档齐全,结果真实可复现。

关键词:射频信号调制识别;CNN;IQ 信号;自动调制识别;深度学习;Streamlit;AI Agent

Abstract

This paper presents a complete, deployable pipeline for automatic RF modulation recognition, covering synthetic IQ signal generation, a lightweight 1D-CNN classifier, AI-powered report generation, and a Streamlit demo. It addresses: (1) end-to-end IQ classification without handcrafted features; (2) recognition performance and bottlenecks across eight modulations at SNR -5 to 20 dB; (3) turning predictions into readable analysis reports with graceful template fallback when no model key is available; (4) exporting an 89K-parameter model to embedded devices for real-time spectrum monitoring. The validation accuracy reaches 78.75%, with over 90% on low-order constant-envelope modulations, and all code, models, and docs are reproducible.

Keywords: RF modulation recognition; 1D-CNN; IQ signal; automatic modulation classification; deep learning ; Streamlit; AI Agent

研究背景与痛点

射频信号调制识别,说白了就是让机器在不知道对方用了哪种通信制式的情况下,仅凭一段接收到的射频信号,判断出它到底是 BPSK、QPSK、16QAM 还是别的调制方式。这件事在频谱监测、电子对抗、软件无线电以及通信设备互联互通测试中都是绕不开的刚需。过去很长一段时间里,工程师们靠的是手工提取高阶累积量、瞬时幅度相位统计量这些专家特征,再为每种调制单独写分类规则——费时费力,换个场景就得重来。

我们把深度学习直接搬进了这个领域:用一维卷积 神经网络 (1D-CNN)对原始的 IQ 基带信号做端到端学习,不再依赖人工特征;再叠加一个大模型驱动的技术报告生成模块,把”信号进来、决策出去”这件事做成了闭环。整套系统只有 89K 参数,能在普通 CPU 上实时推理,也方便导出到嵌入式设备。

本文将我们的射频调制识别建模经验封装为一个对话式AI Agent和可复用的skill。

本文完整代码、数据与配套AI Agent、skill请阅读原文链接获取。

自动调制识别是射频通信与信号处理领域的核心任务,在频谱监测、电子对抗、软件无线电、通信设备互操作性测试等场景中都有用武之地。传统做法依赖领域专家手工提取特征(高阶累积量、瞬时幅度相位统计量),再为不同调制类型设计专门的分类规则。本文用一维卷积神经网络直接对原始 IQ 基带信号做端到端学习,并融合 大语言模型 自动生成技术分析报告,打通从信号采集到智能决策的闭环。

注 :调制识别的本质,是”听懂”一段看不见的电磁波在说什么语言。早年这靠老师傅拿频谱仪和经验判断,后来靠统计特征加专家规则,等于给每种调制配一本字典。深度学习带来的变化,是把”配字典”这件事交给网络自己从数据里学——这就像从”背单词表”进化到”沉浸式语感”,代价是需要足够多的样例,好处是换场景不用重写规则。

技术方案总览

整套系统由四段串成,输入输出契约清晰,任何一段都可以单独替换升级;整体流程与项目目录结构见附录A。

IQ 信号输入 → 1D-CNN 分类器识别 8 类调制 → 输出带置信度的概率(Top-3 排序)→ 调用 大模型 生成 Markdown 技术分析报告,最后由 Streamlit 界面统一呈现。信号侧则以合成 IQ 数据(8 种调制、信噪比 -5~20dB)作为训练与验证来源。

本项目完整代码、skill与AI智能体

下载资料(17页)

数据来源与预处理

训练数据全部由程序合成、可重复生成,不依赖任何外部数据集——这是保证结果可复现的第一道关口。

  • 数据名称:合成射频 IQ 信号数据集(Synthetic RF IQ Signal Dataset)
  • 数据量:8 种调制类型 × 500 条 = 4000 条样本;按 8:2 划分,训练 3200 条、验证 800 条
  • 字段:每条样本为 (2, 1024) 的浮点张量,通道 0 为 I 分量、通道 1 为 Q 分量;标签为 0~7 的调制类型索引
  • 数据来源:由本文作者基于标准通信链路仿真程序自动生成,经拓端团队整理核对(非公开竞赛数据,可重复生成)
  • 时间跨度:合成数据,无实际采集时间跨度
  • 区域跨度:合成数据,无实际地域跨度
  • 数据格式:NumPy 数组(运行时生成,可导出为 csv 或面板格式)
  • 数据简介:每条样本以 (I, Q) 两通道时域序列表示,依次经过符号映射、根升余弦脉冲成形(滚降系数 0.35)、随机载波频偏(±0.05 倍采样率)、单位功率归一化、AWGN 加噪(信噪比在 -5~20dB 随机采样)五步构建,覆盖 BPSK、4PAM、QPSK、8PSK、16QAM、64QAM、GFSK、CPFSK 八类调制。
  • 本数据可支撑的主题实证研究:一是宽信噪比下不同调制类型的可识别性边界研究;二是高阶 QAM 识别瓶颈的成因分析;三是轻量卷积模型与残差、Transformer 模型的精度-算力权衡对比。
  • 数据指标(核心变量):I 通道序列、Q 通道序列、信噪比(dB)、调制类型标签、样本长度(1024)、频偏系数。

合成过程模拟真实通信链路,关键步骤如下表:

步骤说明
符号映射按调制类型生成对应的复基带符号序列
脉冲成形根升余弦滤波器(滚降系数 0.35)
频率偏移随机载波频偏(±0.05 倍采样率)
归一化单位功率归一化
加噪叠加高斯白噪声,信噪比在 -5~20dB 随机采样

支持的 8 种调制类型:BPSK、4PAM、QPSK、8PSK、16QAM、64QAM、GFSK、CPFSK。每个类型生成 500 条样本(共 4000 条),每条为 (2, 1024) 的 IQ 张量,按 8:2 划分训练集与验证集。

第一轮对话:构建合成信号生成器

背景:我们手头没有现成的标注射频数据集,且真实采集成本高,先用仿真把数据造出来。 目标:写一个生成器,按指定调制类型与信噪比产出 (2, 1024) 的 IQ 张量,并支持批量生成与全局打乱。 约束:用 NumPy 实现,覆盖 8 种调制;成形、频偏、加噪链路要可复现(固定随机种子)。

数据展示:下文”测试结果与对比”章节以训练曲线与混淆矩阵作为数据可视化代表,可直接反映不同调制在宽信噪比下的可分性。

核心模型设计:1D-CNN 射频信号调制识别分类器

模型侧的核心决策是”直接对时域序列做卷积”——不做特征工程,也不上重量级骨干,用 89,896 个参数换 CPU 上的实时推理能力。

网络结构

本文采用 1D-CNN 直接对时域 IQ 序列做分类,网络结构如下:

层输出通道核大小池化Dropout
卷积块 1323最大池化(2)0.1
卷积块 2643最大池化(2)0.15
卷积块 31283最大池化(2)0.2
卷积块 41283自适应平均池化(1)–
全连接块64––0.3
分类输出8–––

每个卷积块结构为:一维卷积 → 批归一化 → ReLU。使用 Kaiming 正态初始化,总参数量 89,896,可在 CPU 上实时推理。

注(答辩视角·为什么选 1D-CNN):射频 IQ 信号本质是带时间先后顺序的一维序列,1D-CNN 的滑动卷积核天然适合抽取局部时域模式(如相位跳变、幅度台阶),且参数量远小于 2D-CNN 或Transformer,契合嵌入式部署。评委常问”为何不直接用 LSTM”,答案是本场景序列相关性强但长度固定,卷积的权值共享更省参、推理更快。

第一轮对话:定义基础 1D-CNN 分类网络

背景:数据已就绪,需要把 (2, 1024) 的 IQ 序列映射到 8 类调制概率。 目标:定义一个四层一维卷积 + 全局池化 + 全连接分类器的网络,参数量控制在 100K 以内。 约束:用 PyTorch 实现;每一卷积块含 卷积→批归一化→ReLU;Kaiming 初始化;forward 只做特征提取与分类。

AI 智能报告生成:大模型优先,模板兜底

基于 DeepSeek 大模型实现智能报告生成,构建的 提示词 包含:当前信号识别结果(Top-1 调制 + 置信度)、Top-3 候选概率分布、模型训练指标(准确率、参数量)。当无密钥时,系统自动降级为结构化模板报告,覆盖四个维度:信号特征分析、调制类型判别依据、模型可信度评估、工程应用建议。

注(答辩视角·工程可用性):把大模型当成”锦上添花”而非”必需依赖”是关键设计。评委常问”没网或没密钥怎么办”,模板降级机制正是答案——它保证交付物在任何环境下都可用,而不是依赖外部服务。

训练设置与评估

训练侧用”标签平滑 + 余弦退火 + 早停”三件套稳住泛化,全部配置均可从代码直接复现。

  • 损失函数:交叉熵损失 + 标签平滑(ε=0.1)
  • 优化器:AdamW(学习率 5e-4,权重衰减 1e-3)
  • 学习率调度:余弦退火(Cosine Annealing)
  • 早停机制:验证集准确率连续 8 个轮次无提升即停止
  • 数据规模:3200 条训练样本 + 800 条验证样本

背景:模型与数据齐了,需要把训练闭环跑通并产出评估图表。 目标:实现单轮训练、验证、早停、学习率调度,并把曲线与混淆矩阵落盘。 约束:用 PyTorch DataLoader;标签平滑;余弦退火;连续 8 轮无提升早停。

测试结果与对比

模型在第 21 个轮次触发早停,最佳验证准确率 78.75%——这是 8 类调制的平均水位,拆开看高低阶调制差异明显。训练损失从 1.74 降至 0.74,验证损失在第 13 轮后趋于平稳。

训练曲线图展示左右两子图:左图为训练/验证损失随轮次变化,右图为训练/验证准确率随轮次变化。

射频信号调制识别训练曲线图:左图为训练/验证损失随轮次变化,右图为训练/验证准确率随轮次变化

8 类调制在验证集上的逐类表现如下表(宏平均 F1 为 0.7826):

调制类型精确率召回率F1 分数说明
BPSK0.80951.00000.8947二相相位特征区分度极高
QPSK0.55911.00000.7172相位稳定,与 8PSK 略有混淆
8PSK0.93550.82860.8788与 QPSK 区分良好
16QAM0.57610.47750.5222高阶幅度调制识别困难
64QAM0.64440.28160.3919极少被正确分类
GFSK1.00001.00001.0000恒包络特征清晰
CPFSK0.92471.00000.9609连续相位易提取
4PAM1.00000.80950.8947多级幅度调制

总体准确率:78.75%(宏平均 F1:0.7826)

混淆矩阵为 8×8 热力图,纵轴为真值、横轴为预测值,按行归一化。

射频信号调制识别混淆矩阵:8 类调制验证集逐类分类热力图,纵轴为真值、横轴为预测值,按行归一化

性能分析

优势:恒包络调制(BPSK、QPSK、GFSK、CPFSK、4PAM)识别率极高,说明卷积网络对星座结构与相位特征的抽取能力可靠。

瓶颈:高阶 QAM(16QAM、64QAM)识别率低,原因有三:一是 QAM 幅度层级在加噪后边界模糊,16QAM 有 12 种幅度过渡、64QAM 有 48 种,远比 4QAM 的 4 种难分;二是合成数据的频率偏移噪声对”相位+幅度”联合调制的 QAM 影响更大;三是当前 89K 参数模型对 8 类细分任务已达容量边界,进一步提升需引入残差结构或扩充训练数据。

与业务场景的映射

绝大多数实际射频系统使用低阶调制(BPSK、QPSK、FSK 一类)以保证抗干扰能力,本模型在这些实用场景下的平均识别率超过 90%,具备实际应用价值。

需要说明:原文未提供与传统特征工程方法的基线对比数据,本章仅呈现本方案的实测结果,不作跨方法优劣断言。

局限性与失败分析

本章把方案的边界讲透:哪些场景能用、哪些数字要打折看、哪些内容原文没有提供。

高阶 QAM 是主要失败模式

16QAM 的 F1 仅 0.5222(召回率 0.4775),64QAM 的 F1 仅 0.3919(召回率 0.2816)——高阶幅度调制是当前方案最明确的失败区,成因即上文性能分析所列三点:幅度层级加噪后边界模糊、频移噪声对”相位+幅度”联合调制影响更大、89K 参数容量触顶。

样本量与置信区间

验证集共 800 条、每类约 100 条。GFSK、4PAM 等类准确率为 100%,但按每类 100 条样本量,100% 准确率的 95% 置信区间约为 97%–100%(三倍法则),小样本下的满分应谨慎解读,不宜外推为”该类绝对可识别”。

合成数据与真实信道有差距

训练数据为程序合成,未包含多径、相位噪声等真实信道损伤;在真实射频信号上的表现原文未提供实测数据,上真实场景前需用实测数据 微调 (扩展方向见结论与展望)。

分布外输入与长度失配

SNR 低于 -5dB 属于分布外输入,置信度下降是模型的正常边界反应,并非模型故障;序列长度非 1024 时,推理端会静默裁剪或零填充(保证不崩的设计),精度可能下降,演示应使用 1024。

复现性边界

重新训练时,准确率会在 78.75% 附近小幅波动(随机初始化影响),深度学习结果不可严格复现;但仓库自带训练好的 model/modulation_cnn.pth,推理侧固定种子 42、完全可复现。另需注意:Web 界面演示为单条固定样本(8PSK@10dB,置信度 92.29%),不代表整体分布。

数字口径说明

项目报告.md 结尾写的”验证集准确率 72.75%”与 outputs/report.json 的 78.75% 不一致,本文以 report.json(训练脚本实际落盘的指标)为准。

消融与基线对比缺失

原文未提供消融对比与基线方法对比数据,此处如实标注,不作编造。

系统实现与落地

Web 侧用 Streamlit 把”选参数—看结果—拿报告”压缩成一次点击;交付前对全部源码做过系统性审查。

基于 Streamlit 搭建 Web 界面,支持:选择调制类型与信噪比生成模拟信号、实时 IQ 波形图与星座图展示、识别结果(Top-1 + 置信度 + Top-3 概率)、AI 分析报告 Markdown 渲染、一键下载报告。

Agent 界面分五个区块:侧栏控制面板(模型路径、调制类型、信噪比、序列长度、LLM 开关)+ IQ 信号波形图 + 星座图 + 识别结果卡片与 Top-3 概率 + AI 分析报告;交互顺序与逐区块实现细节见附录B 第 3、6、7 节。

交付前对全部 6 个 Python 文件完成系统化代码审查,覆盖语法正确性、导入完整性、类型标注一致性与运行期行为,结果如下:

等级发现处理
严重 P0app.py 第 148 行 f-string {conf:.2%</b> 缺少闭合花括号,导致 SyntaxError 使 Web 界面无法启动已修复
建议 P2模型加载无缓存,每次 Streamlit 重跑重复从磁盘加载权重已加 @st.cache_resource
建议 P2sklearn 宏平均指标在 64QAM 类零预测时刷屏警告已加 warnings 过滤
建议 P2matplotlib 中文标签触发大量字体缺失警告已配置微软雅黑回退字体链

最终验证:全部 6 个源文件 py_compile 通过、零语法错误;端到端连通性自测(推理 + 报告生成)通过,BPSK/QPSK/GFSK 识别置信度 >90%;完整训练脚本无警告输出,图表渲染正常;独立审查报告见 CODE_REVIEW.md。

部署路径:模型仅 89K 参数,支持 CPU 实时推理,可通过 ONNX 导出部署到嵌入式设备,边际部署成本低。

配套工具与资源

代码、权重、文档、测试页四类交付物齐全,按 README 步骤即可复现。

依赖说明:依赖仅六个包——torch>=2.0.0、numpy>=1.24.0、scikit-learn>=1.3.0、matplotlib>=3.7.0、streamlit>=1.30.0、requests>=2.31.0(完整 requirements.txt 见附录B 第 4 节)。

示例运行命令(以代码包实际接口为准):

完整功能测试页:教程配套  agent测试页/full/index.html——单文件、双击即开,在浏览器里真跑 Python(stlite = Pyodide + Streamlit WASM),功能与 app.py 一致:能改参数、能真算、能下载报告。首次打开需下载 Pyodide 运行时(约 30–60 秒),演示前先打开一次预热;断网时页面会明确提示,不会白屏。打开命令见附录B 第 9.2 节。

相关技术文章图片

文中推荐文章

拓端相关文章:开发LSTM、CNN模型预测玉米期货价格与涨跌可交互 Agent。

探索观点

结论与展望

一句话结论:用 89K 参数的 1D-CNN,把射频信号调制识别做成了端到端、可复现、可演示的完整闭环。

核心结论:

  1. 端到端流水线完整:信号合成 → 数据预处理 → 卷积训练 → 推理 → 智能报告 → Web 展示,链路完整。
  2. 轻量可部署:模型仅 89K 参数,支持 CPU 实时推理,可通过 ONNX 导出部署到嵌入式设备。
  3. 任何环境可用:大模型报告模块在无密钥时自动切换为结构化模板,保证交付物不白屏。
  4. 一键演示:Streamlit 界面 + 完整功能测试页,评审无需配置环境即可体验。
  5. 实用场景成立:低阶调制(BPSK/QPSK/FSK 一类)识别率超过 90%,可支撑频谱监测、电子对抗辅助、软件无线电互操作性测试。
  6. 可持续迭代:信号生成器支持注册新调制类型,模型易微调至特定场景(如军用扩频信号识别)。

高阶 QAM 瓶颈已有明确改进路径——引入残差结构扩充模型容量、接入真实硬件采集数据(如 USRP/ADALM-Pluto)、增加 SNR 估计前端、推理加速(ONNX/TensorRT)。残差块的改造示例如下:

第二轮对话:引入残差连接提升高阶 QAM 识别(演进方向)

背景:基础 1D-CNN 在高阶 QAM(16/64QAM)上识别率偏低,瓶颈在于模型容量与幅度层级模糊。 目标:在卷积块之间增加残差捷径,缓解深层退化,给后续升级到 ResNet 风格留好接口。 约束:保持输入输出维度兼容;仅演示残差块结构,完整训练脚本见配套仓库。

注:上面给出的残差块是后续优化方向的骨架,文中已实测的基础模型仍为四层 1D-CNN;是否启用残差、如何替换原卷积块,属于展望章节的演进路径。

原文局限与 Agent 扩展方向的完整对照见附录B 第 10.2 节。

常见问题 FAQ:射频信号调制识别十二问

Q1:什么是射频信号调制识别,它解决什么问题?

让机器在不知道发射端用了哪种通信制式的情况下,仅凭接收到的射频信号判断其调制方式(BPSK/QPSK/16QAM 等)。它是频谱监测、电子对抗、软件无线电与设备互操作性测试的基础环节;传统依赖专家特征与规则,本文用 1D-CNN 端到端完成。

Q2:传统方法为什么要换成深度学习方案?

传统方案靠手工提取高阶累积量、瞬时幅度相位统计量等专家特征,再按调制类型写分类规则,换场景就要重写规则、泛化差。1D-CNN 直接对原始 IQ 时域序列学习,判别特征由网络自行抽取,换数据分布只需重新训练而非重写规则。

Q3:宽信噪比下 8 类调制都能认吗?高阶 QAM 混淆怎么办?

-5~20dB 全范围 8 类平均验证准确率 78.75%;恒包络与低阶调制(GFSK/CPFSK/BPSK/4PAM)F1 在 0.89 以上,16QAM/64QAM 偏低(F1 分别为 0.5222、0.3919)。工程做法是 Top-3 排序 + 置信度分级:可信度高的低阶调制直接决策,模糊样本提示人工复核,而非一刀切。

Q4:没有 DeepSeek API Key,报告功能还能用吗?

能。报告模块是”大模型优先、模板兜底”双通道:无 Key 或调用失败时自动降级为结构化模板,仍覆盖信号特征分析、调制判别依据、可信度评估、工程应用建议四个维度,任何环境都能出报告。

Q5:为什么选 1D-CNN,而不是 LSTM 或 2D-CNN?

射频 IQ 信号是带时间顺序的一维序列,1D-CNN 的滑动卷积核天然适合抽取局部时域模式(相位跳变、幅度台阶),权值共享比 LSTM 更省参、推理更快;相比 2D-CNN(需先把信号转成图)参数量小一个量级,契合 89K 参数与嵌入式部署目标。

Q6:89K 参数的轻量模型,精度够用吗?

看场景。8 类平均 78.75%;但商用射频系统大多用低阶调制保抗干扰,这些类的平均识别率超 90%,实用场景够用。高阶 QAM 是明确瓶颈,需靠残差结构或扩充训练数据改进(见结论与展望)。

Q7:合成数据训练出来的模型,能直接用在真实射频信号上吗?

不能直接等同。合成数据未包含多径、相位噪声等真实信道损伤,原文也未提供真实信号实测数据;上真实场景需用实测数据(如 USRP/ADALM-Pluto 采集)微调,这是结论与展望列出的第一条演进路径。

Q8:序列长度设为 256 或 2048(非 1024)会发生什么?

模型按 1024 训练,非 1024 输入会在推理端被静默裁剪或零填充——这是保证不崩的设计,但精度可能下降。演示请使用 1024。

Q9:SNR 调到 -10dB,置信度下降是模型坏了吗?

不是。训练集 SNR 覆盖 -5~20dB,-10dB 属分布外输入,置信度下降是模型的正常边界反应;0~20dB 内模型最稳。

Q10:重新训练能得到完全一样的结果吗?

推理侧可以:仓库自带训练好的权重,种子固定 42,同一组(调制类型, SNR, 序列长度)输出完全一致。训练侧不行:深度学习结果不可严格复现,重训准确率会在 78.75% 附近小幅波动。

Q11:文章里出现 78.75% 和 72.75% 两个数字,以哪个为准?

以 78.75% 为准——它来自 outputs/report.json(训练脚本实际落盘指标)与逐类分类报告;72.75% 是项目报告.md 结尾的笔误,本文已在局限性章节注明。

Q12:怎样把模型部署到嵌入式设备,怎样快速演示?

部署:模型仅 89,896 参数,可导出 ONNX,CPU 上实时推理。演示:本地执行 streamlit run app.py;无环境场合用完整功能测试页 full/index.html,双击即开(首次打开需预热 30–60 秒)。

###

附录A:项目流程与目录结构

整体流水线(竖版流程图):

        合成 IQ 信号            |            v        数据预处理            |            v     ┌──── 轻量 1D-CNN ────┐     |    调制分类器        |     └─────────┬───────────┘               |               v        识别结果输出(Top-3)               |               v        AI 分析报告生成               |               v       Streamlit 可视化演示               |               v        工程落地与部署

项目文件目录:

project_signal_ai/├── app.py                      # Streamlit Web 主程序├── requirements.txt            # 依赖清单├── README.md                   # 快速开始├── CODE_REVIEW.md              # 代码审查报告├── test_e2e.py                 # 端到端连通性自测├── src/│   ├── signal_generator.py     # IQ 信号合成生成器│   ├── model.py                # 1D-CNN 模型定义│   ├── train.py                # 训练脚本│   ├── inference.py            # 推理封装│   └── report_generator.py     # AI 报告生成(大模型 + 模板降级)├── model/│   └── modulation_cnn.pth      # 训练好的模型权重└── outputs/    ├── training_curves.png     # 训练曲线    ├── confusion_matrix.png    # 混淆矩阵    └── report.json             # 评估指标

目录结构与流程图为原文交付形态,实际以仓库内文件为准。

射频调制识别可交互 AI Agent

目标形态

Agent 界面分五个区块,交互顺序自上而下:

┌─────────────────────┬──────────────────────────────────────────┐│  ⚙️ 侧栏控制面板      │  ① IQ 信号波形图(I/Q 双通道)              ││  · 模型路径          │  ② 星座图                                   ││  · 调制类型下拉框     │  ③ 识别结果卡片(Top-1 + 置信度 + 对错标记)  ││  · 信噪比滑块        │  ④ Top-3 概率条 + 全类概率分布图             ││  · 序列长度选择       │  ⑤ AI 分析报告(可展开)+ 下载按钮            ││  · LLM 开关 + Key    │                                            ││  · 🚀 运行分析       │                                            │└─────────────────────┴──────────────────────────────────────────┘

交互顺序:侧栏选参数 → 点「运行分析」→ 后台「加载模型 → 生成信号 → 推理 → 画图 → 出报告」→ 主区五区块一次渲染。没点按钮时,主区显示项目 outputs 预览(混淆矩阵、训练曲线、指标卡),让评审第一眼看到模型是训练过的。

射频信号调制识别 Agent 初始界面视口实截:左侧 ⚙️ 控制面板完整侧栏(模型权重路径 / 调制类型(模拟)/ 信噪比 SNR(dB)/ IQ 采样长度 / AI 报告开关 / 🚀 运行分析按钮),右侧主区为页面标题、副标题与引导条

四、环境与安装

Python 3.10+,全程 CPU 可跑(模型只有 89,896 参数)。依赖就六个包:

requirements.txt:

射频信号调制识别项目依赖安装终端实截:pip install -r requirements.txt 真实输出,可见 torch/streamlit 等包下载完成与 Successfully installed 一行

启动后终端会打印 Streamlit 的本地地址(默认 http://localhost:8501),浏览器自动打开:

射频信号调制识别系统启动终端实截:streamlit run app.py 输出,含本地地址与 Network URL 两行

数据准备

本项目的数据是合成信号,由 src/signal_generator.py 在运行时生成,不需要外部数据集。合成流程模拟真实通信链路:

步骤说明
符号映射按调制类型生成复基带符号(BPSK 用 ±1,QPSK 用 4 个相位,16QAM/64QAM 用星座点网格)
脉冲成形根升余弦滤波器(RRC,β=0.35,sps=4)
频率偏移随机载波频偏(±0.05×采样率)
归一化单位功率归一化
AWGN 加噪高斯白噪声,SNR 在 -5~20dB 随机

完整训练集规模:8 类 × 500 条 = 4000 条,每条 (2, 1024)。为了让读者不跑训练也能验证生成器,data/sample_iq_signals.csv 放了 8 条样例(每类 1 条,SNR=10dB,seed=42):

mod_type,snr_db,seq_len,i_values,q_valuesBPSK,10.0,1024,"0.98,-0.31,...","0.21,0.87,..."...

用法:

from src.signal_generator import SignalGeneratorgen = SignalGenerator(num_samples=1024, snr_range=(-5, 20), seed=42)iq = gen._gen_iq("QPSK", snr_db=10.0)   # shape (2, 1024)

说明:_gen_iq 是生成器的单条入口,generate(samples_per_class=500) 则一次产出整个数据集。下划线开头是原文风格,Agent 里直接复用即可。

骨架搭建:侧栏收参,主区渲染

app.py 的主结构是两段式:侧栏只放控件,主区先判断「有没有点运行」,没点就 st.stop()。这样参数区和结果区彻底解耦,改任何参数都不会触发重复计算,直到用户主动点按钮。

先搭骨架(侧栏部分):

三个要点:

  1. st.selectbox 的 options 直接绑 SignalGenerator.MOD_TYPES——控件选项和生成器的合法值永远同源,不会出现「界面上有、生成器不认」的调制类型。
  2. 按钮 type=”primary” 让主行动点一眼能看到。
  3. st.stop() 放在主区判断里,不是放在侧栏。侧栏永远要渲染(否则控件消失),能停的只有结果区。

射频信号调制识别 app.py 侧栏控件代码高亮渲染图:含 selectbox/slider/select_slider/checkbox/button 五个控件定义

核心模块逐个实现

7.1 模型加载:加缓存,别每次重跑都读盘

Streamlit 每次交互都会从头重跑整个脚本,模型权重(360KB 事小,初始化事大)必须缓存:

为什么这么写:@st.cache_resource 是 Streamlit 给「不可序列化的重资源」(模型、连接器)准备的缓存装饰器,同一组参数只构造一次。原项目的 CODE_REVIEW 把「未缓存导致重复加载」列为 P2 建议,这就是修复。

7.2 信号生成:固定种子,让演示可复现

gen = SignalGenerator(num_samples=seq_len, snr_range=(snr_db, snr_db), seed=42)iq_signal = gen._gen_iq(mod_type, snr_db)

种子写死 42,意味着同一组(调制类型, SNR, 序列长度)永远生成同一条信号——演示时观众问「刚才那条再来一次」,点按钮结果一模一样。想换样本,把种子做成控件即可。

7.3 推理:单条入口,返回全概率

predict() 内部做了三件事:(2, 1024) → (1, 2, 1024) 加 batch 维;长度不等于模型 seq_len 时裁剪或零填充(这是红线,见第八节);softmax 出 8 类概率,排序取 Top-3。

7.4 可视化:三列布局,图随结果走

点下「运行分析」之后,主区五区块一次渲染出来,实际效果如下:

射频信号调制识别运行结果总览实截:左列 IQ 信号波形与星座图,中列识别结果卡片(8PSK、置信度 92.29%)与 Top-3 概率条,右列八类概率分布图

为什么这么写:波形和星座图回答「这条信号长什么样」,结果卡片和概率条回答「模型怎么看」,三类信息并排,观众视线不用上下翻。st.progress 的 text 参数把类别名和百分比直接写在进度条上,比单纯表格更直观。

三列布局的局部细节(侧栏参数区 + 主区图表 + Top-3 概率条):

射频信号调制识别三列布局局部实截:侧栏参数区(调制类型 8PSK、SNR 10dB、长度 1024)与主区图表、Top-3 概率(8PSK 92.29% / QPSK 3.19% / BPSK 1.39%)

7.5 AI 报告

ReportGenerator 内部逻辑:有 API Key → 调 DeepSeek Chat(deepseek-chat,temperature=0.3)生成中文技术报告 。

报告区块用 st.expander 折叠 + st.download_button 下载 Markdown:

射频信号调制识别智能分析报告区块实截:中文模板报告含信号特征分析、调制类型判别依据、模型可信度评估与训练指标各节

八、参数怎么调

参数控件含义调它的后果
调制类型下拉框(8 类)生成哪种合成信号直接决定「应该识别出什么」,是演示对错的主要手段
信噪比 SNR(dB)滑块 -10~25噪声强度低于训练覆盖范围(-5dB)后置信度明显下降;0~20dB 内模型最稳
序列长度256/512/1024/2048IQ 采样点数模型按 1024 训练,非 1024 会在推理端裁剪/填充,精度可能下降
模型路径文本框权重文件位置留空用默认 model/modulation_cnn.pth
LLM 开关复选框是否调 DeepSeek勾选后才出现 Key 输入框;不勾选走模板报告

红线一:序列长度不是 1024 时,推理端会静默裁剪/填充。 这不是 bug 是设计(保证不崩),但演示时要用 1024 才是模型的主场。

红线二:SNR 低于 -5dB 属于分布外输入。 训练集 SNR 范围是 -5~20dB,拿 -10dB 的信号去问模型,置信度掉下来是正常的,别怀疑模型坏了。

红线三:模型能力边界要讲给观众。 78.75% 是 8 类平均分,拆开看:GFSK/CPFSK/BPSK/QPSK/4PAM 这些恒包络和低阶调制 F1 都在 0.89 以上,64QAM 只有 0.39。商用射频系统大多用低阶调制保抗干扰,模型在真实业务场景(>90%)比平均分好看——这是原文 3.4 节的结论,演示时主动说,比被问到再解释强。

红线四:深度学习结果不可严格复现。 重跑训练,准确率会在 78.75% 附近小幅波动(随机初始化影响);但本仓库自带训练好的 model/modulation_cnn.pth,推理侧完全可复现(种子 42 固定)。教程里的所有数字都来自这份权重 + outputs/report.json。

落地页整页实截 :

射频信号调制识别落地页整页实截:侧栏控制面板全量控件 + 主区项目输出预览三列(混淆矩阵、训练曲线、指标卡)+ 页脚

九、完整功能测试页(现场演示主用)

教程配套一个完整功能测试页 agent测试页/full/index.html:单文件、双击即开,在浏览器里真跑 Python(stlite = Pyodide + Streamlit WASM),功能与 app.py 一致——能改参数、能真算、能下载报告。

读者照第 4~9 节走一遍,即可把任意「分析型脚本」封装成同款可交互 Agent。

作者声明:作者系射频通信与深度学习方向分析师,具备一线射频工程与深度学习建模实践经验,本文代码、模型与结论均来自真实可复现项目。

封面