掌握通信调制识别在IQ信号采样与基带预处理中的定位、故障信号与验证顺序。
围绕 通信调制识别、雷达识别学习路线、IQ信号采样 展开。
IQ信号采样与基带预处理能跑不代表稳定,真正要确认的是对象边界、状态变化和验证证据。
本节围绕通信调制识别建立一条更容易复测的联调路径。
在通信调制识别(Communication Modulation Recognition)与雷达信号识别任务中,第一步也是最关键的一步,是将空中射频信号无失真地搬移到数字基带。本节围绕 USRP B210 硬件与 GNU Radio Companion(GRC)流图,构建一条从天线到基带 IQ 数据的实时采集链路。核心目标是:掌握 USRP 硬件配置参数(采样率、中心频率、增益)与 GRC 流图中信号处理模块的级联方式,最终在主机端获得可供后续调制识别算法直接使用的基带 IQ 样本
在首次连接 B210 前,务必执行 uhd_find_devices 和 uhd_usrp_probe 命令,确认 FPGA 固件版本与主机 UHD 驱动匹配。若出现“No UHD Device Found”,优先检查 USB 3.0 线缆与接口,并尝试重新加载 fx3 固件
B210 作为软件无线电(SDR)前端,其核心配置集中在三个参数:采样率(samp_rate)、中心频率(center_freq) 和 增益(gain)。在 GRC 中,这些参数通过 UHD: USRP Source 模块的“Device Arguments”与“Samp Rate”等字段传入。一个典型的流图链路为:USRP Source → Rational Resampler → Multiply Const → File Sink / QT GUI Time Sink。其中,Rational Resampler 用于将 B210 输出的高速率 IQ 流降采样至后续识别算法可处理的基带速率(例如从 20 入口栈指针s 降至 2 入口栈指针s),而 Multiply Const 则用于调整信号幅度,防止 ADC 削波或量化噪声过大
在一次 2.4 GHz ISM 频段的调制识别任务中,团队发现采集的 BPSK 信号星座图始终呈“环状”而非清晰的两点分布。排查后发现,B210 的 gain 被设置为 75 dB(接近满量程),导致 ADC 前端饱和,信号被硬限幅。将增益降至 40 dB 后,星座图恢复正常,识别准确率从 62% 提升至 94%
在 GRC 流图设计时,需注意 流图时钟域一致性。B210 的采样时钟由板载 10 MHz TCXO 提供,而主机端通过 USB 3.0 接收 IQ 数据包。若流图中存在多个同步模块(如 Phase Lock Loop 或 Costas Loop),必须确保所有模块的采样率参数与 samp_rate 一致,否则会出现时序错乱,导致基带信号频率偏移。推荐在 GRC 顶层使用 Variable 模块定义全局采样率变量,所有模块引用该变量,避免硬编码
以下是一个可直接运行的 GRC 流图配置片段(Python 导出格式),用于验证 B210 实时采集链路是否正常工作。该流图以 10 入口栈指针s 采样率采集 2.4 GHz 中心频率的信号,经 5 倍降采样后输出至 File Sink 和 QT GUI Frequency Sink
# GRC 流图核心配置(Python 导出)
from gnuradio import gr, uhd, blocks, qtgui
import os
class b210_iq_capture(gr.top_block):
def __init__(self):
gr.top_block.__init__(self, "B210 IQ Capture")
self.samp_rate = 10e6
self.center_freq = 2.4e9
self.gain = 40
# USRP Source 配置
self.usrp_source = uhd.usrp_source(
",".join(("", "")),
uhd.stream_args(
cpu_format="fc32",
channels=range(1),
),
)
self.usrp_source.set_samp_rate(self.samp_rate)
self.usrp_source.set_center_freq(self.center_freq, 0)
self.usrp_source.set_gain(self.gain, 0)
# 降采样与输出
self.resampler = blocks.rational_resampler(ccf=1, ddr=5)
self.file_sink = blocks.file_sink(gr.sizeof_gr_complex, "iq_capture.bin", False)
self.qt_sink = qtgui.freq_sink_c(1024, fftw=1, wintype=qtgui.WIN_BLACKMAN_hARRIS,
fc=self.center_freq, bw=self.samp_rate/5,
name="Spectrum", nconnections=1)
self.connect(self.usrp_source, self.resampler)
self.connect(self.resampler, self.file_sink)
self.connect(self.resampler, self.qt_sink)阅读这段代码时,重点看IQ信号采样的伪代码,以及它如何用稳定性与可观测性证明结果可复测。
该配置片段验证了从射频前端到基带存储的完整链路。运行后,若 QT GUI Frequency Sink 窗口显示稳定的频谱轮廓,且 iq_capture.bin 文件大小持续增长,则说明采集链路已就绪。注意:File Sink 默认以二进制格式写入复数 IQ 数据,后续可用 np.fromfile(..., dtype=np.complex64) 读取
当频谱显示为一条平坦直线时,通常表示 B210 未接收到有效信号(天线未连接或频率偏移)。当频谱出现周期性尖峰时,可能是 USB 传输丢包导致 IQ 数据中出现重复帧,此时应检查 USB 3.0 控制器驱动或降低采样率