B200 FM Receiver by gnuradio
一句话:把 USRP B210 采到的 2 MS/s 射频信号,一路降到 48 kHz 音频,用 GNURadio 搭出一条完整的 FM 收音机链路。
一、背景:为什么要自己搭 FM 接收
软件无线电(SDR)最经典的入门项目就是”听广播”——它把”天线 → 射频前端 → 解调 → 扬声器”这整条链路,全部变成软件里的一个个 block。
做这件事的价值在于:你能亲眼看到每一级采样率、每一个滤波器在干什么。买一台收音机你只能听到声音,搭一条链路你能看懂声音是怎么来的。
本文目标:用 USRP B210 在 GNURadio 里搭出一条能出声的 FM 广播接收链路,并把采样率变换讲清楚。
二、原理:FM 接收到底在做什么
一条 SDR 接收链,本质是**”降采样 + 解调”**两件事:
- 降采样:USRP 以 2 MS/s 采下 88–108 MHz 频段里的一段(FM 广播单台带宽约 200 kHz,2 MS/s 足够覆盖并留出余量)。但后续解调只需要几十 kHz,所以要用重采样把速率降下来。
- 解调: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 接收链你都能自己推出来。