B200 FM Receiver by gnuradio

一句话:把 USRP B210 采到的 2 MS/s 射频信号,一路降到 48 kHz 音频,用 GNURadio 搭出一条完整的 FM 收音机链路。

一、背景:为什么要自己搭 FM 接收

软件无线电(SDR)最经典的入门项目就是”听广播”——它把”天线 → 射频前端 → 解调 → 扬声器”这整条链路,全部变成软件里的一个个 block。

做这件事的价值在于:你能亲眼看到每一级采样率、每一个滤波器在干什么。买一台收音机你只能听到声音,搭一条链路你能看懂声音是怎么来的。

本文目标:用 USRP B210 在 GNURadio 里搭出一条能出声的 FM 广播接收链路,并把采样率变换讲清楚。

二、原理:FM 接收到底在做什么

一条 SDR 接收链,本质是**”降采样 + 解调”**两件事:

  1. 降采样:USRP 以 2 MS/s 采下 88–108 MHz 频段里的一段(FM 广播单台带宽约 200 kHz,2 MS/s 足够覆盖并留出余量)。但后续解调只需要几十 kHz,所以要用重采样把速率降下来。
  2. 解调:FM 是调频,信息藏在瞬时频率里。WBFM Receive 模块做的就是这件事——把复基带信号的频率变化还原成音频。

采样率必须一级一级对齐,这是新手最容易翻车的地方。本文的链路里:

也就是:USRP 出来的 2 MS/s,经 Rational Resampler(插值 12、抽取 125)变成 192 kS/s,正好是音频 48 kHz 的 4 倍——这个”4 倍”就是 WBFM 模块里 Quadrature Rate 与 Audio Decimation 的比值。

三、动手:复现步骤

1. 环境准备

先在 Ubuntu 里确认 USRP B210 被系统识别(需要装好 UHD 驱动)。

关于 FM 调频本身的介绍可以看这篇知乎文章。

2. 搭建流图

需要的 block:

  • UHD: USRP Source —— 射频前端,采数据
  • Rational Resampler —— 有理数重采样,降速率
  • WBFM Receive —— 宽带调频解调
  • Audio Sink —— 把音频送去声卡
  • QT GUI Range —— 滑块,用来实时调频率
  • Throttle —— 限速,缓解 CPU 压力

按下面的结构连接:

3. 关键参数与”为什么”

USRP Source

  • Device Address:B210mini(换成你实际的设备标识)
  • Sync:改为 PC Clock
  • Center frequency:填变量 freq
  • Ch0:勾选 AGC Enable,通道选 RX1
  • samp_rate:2M(USRP 采样率)

为什么中心频率用变量?因为后面要用 QT GUI Range 挂一个滑块上去,边跑边扫台,不用每次改参数重跑。

QT GUI Range(频率滑块)

  • Default Value / Start / Stop / Step:设置成你本地能收到的电台参数(FM 广播在 88–108 MHz)。

Rational Resampler

  • Interpolation:12
  • Decimation:125

为什么是 12/125?为了让 2 MS/s 精确落到 192 kS/s。有理数重采样只能做”整数倍插值 + 整数倍抽取”的组合,所以这两个数要凑出你想要的比值:。

WBFM Receive

  • Quadrature Rate:48000*4(即 192 kS/s,必须和上一级输出一致)
  • Audio Decimation:4

为什么这样填?WBFM 要求输入速率是音频速率的整数倍。这里 192 kS/s ÷ 4 = 48 kS/s,正好得到标准音频采样率。

Audio Sink

  • Sample Rate:48k

可选优化

  • USRP Source 输出端后面加一个 Throttle,缓解 CPU 压力;
  • Audio Sink 前面加一个 低通滤波器,类型选 float,听感会明显干净很多;
  • 可以再挂 QT GUI Time Sink / Frequency Sink 看波形和频谱,记得打开自动缩放(Auto Scale)。

4. 运行验证

运行流图,拖动频率滑块扫台。听到清晰人声/音乐,说明整条链路打通了。

四、常见坑与边界

  • 每一级采样率必须首尾相接:USRP 的 samp_rate、Rational Resampler 的输出、WBFM 的 Quadrature Rate、Audio Sink 的采样率,任何一个对不上,要么报错要么全是噪声。这是最容易出问题的地方。
  • AGC 与增益:信号太弱听不清,增益开太大又会过载削顶(听起来沙哑失真)。先靠 AGC,必要时手动微调。
  • CPU 打满:不加 Throttle 时 GNURadio 会尽量快跑,频谱图一开就容易爆 CPU,画面卡顿甚至丢包。
  • 中心频率要落在电台带宽内:FM 单台带宽约 200 kHz,频率偏太多只会听到噪声。
  • 驱动:B210 需要 UHD 驱动,uhd_find_devices 找不到设备时先排查驱动和 USB 供电。

五、结论

FM 接收看似是”拖几个 block”,真正的知识点是采样率的级联换算:2 MS/s →(12/125)→ 192 kS/s →(÷4)→ 48 kS/s 音频。把这根链条想明白,任何 SDR 接收链你都能自己推出来。