← 返回目录课程:《通信调制识别与雷达识别学习路线》
02

02 IQ信号采样与基带预处理:USRP B210与GNU Radio流图搭建

掌握USRP B210硬件配置与GNU Radio Companion流图设计,实现IQ数据实时采集
章节导航 难度:入门类型:工程实战
本页抓手

掌握通信调制识别在IQ信号采样与基带预处理中的定位、故障信号与验证顺序。

机制词
模块接口配置流程状态
可复用材料
代码片段排障表检查清单架构图
本节对象

围绕 通信调制识别、雷达识别学习路线、IQ信号采样 展开。

排障先看这三点

  1. 先核对IQ信号采样的前置条件、异常信号和验收结果
  2. 再用伪代码把实现动作固定下来
  3. 最后用稳定性与可观测性验证结果是否可复现

联调卡点

IQ信号采样与基带预处理能跑不代表稳定,真正要确认的是对象边界、状态变化和验证证据。

本节围绕通信调制识别建立一条更容易复测的联调路径。

从天线到基带:B210 实时 IQ 采集链路与 GRC 流图实现

由底到顶收敛01天线到基带确认射频无失真搬移02硬件参数绑定核对采样率与中心频率03流图模块级联检查UHDSour…04驱动与固件执行uhdfind…05实时采集验证观察IQ数据流图输出06稳定性检查确认结果可复现

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 参数绑定与 GRC 模块级联

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 模块定义全局采样率变量,所有模块引用该变量,避免硬编码

实时采集验证:IQ 数据流图与关键参数检查

以下是一个可直接运行的 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 控制器驱动或降低采样率