ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

USRP B210与GNU Radio实战:从零搭建软件无线电FM收音机

USRP B210与GNU Radio实战:从零搭建软件无线电FM收音机 说实话如果你手里正好有一块 USRP B210第一个想做功能多半就是它——用 GNU Radio 搭一个 FM 收音机。我当年拿到 B210 的时候第一件事不是跑什么复杂协议而是把它接到电脑上在 GNU Radio Companion 里拖几个模块让耳机里传出广播声。原因很简单FM 广播是软件无线电里最友好的信号88MHz 到 108MHz 之间全是现成的模拟信号解调链路短、原理直观、参数好计算非常适合作为 SDR 入门和链路验证的第一个项目。这篇文章就是把整条路从头到尾讲清楚B210 怎么接线、GNU Radio 环境怎么搭、GRC 流程图每一路参数怎么填、为什么这么填以及我在实操中踩过的坑。你只要跟着走大概率半小时内能听到声音。即便你用的是别的 USRP 或者 RTL-SDR这套流程同样适用因为核心逻辑是相通的。1. 项目到底在做什么为什么用 B210 做 FM 收音机1.1 软件无线电里的“收音机”为什么值得玩传统收音机是硬件电路完成混频、滤波、鉴频你只能收听改不了链路。但在软件无线电里天线后面的所有处理全部在 PC 上完成信号经过 B210 的射频前端变成一串数字 I/Q 数据流剩下的活交给 GNU Radio 的模块。这意味着同一个硬件平台今天可以解调 FM明天换一张流图就能解调 AM、单边带、甚至数字广播。FM 广播作为入门项目优势非常明显信号频段固定88-108MHz、带宽固定约 200kHz、调制方式固定调频而且几乎任何城市都有强台不需要额外发射源。跑通一个 FM 解调链路你就能把一个完整的“射频采集—数字下变频—信道选择—解调—音频输出”流程给打通。这套流程是后续所有 SDR 项目的地基。1.2 B210 在这个项目里扮演什么角色B210 的本质是一块射频前端加高性能 ADC/DAC内部使用 AD9361 单芯片收发器频率范围覆盖 70MHz 到 6GHz这刚好覆盖 FM 广播频段。接收 FM 信号时B210 做的事情就是把天线感应的射频信号放大混频到基带零中频架构直接输出 I/Q 两路正交信号然后以你设定的采样率通过 USB 3.0 送到电脑。值得一提的是B210 拥有最大 56MHz 的瞬时带宽能力。做 FM 收音机只用 2MHz 采样率是典型的杀鸡用牛刀但正是这种“高配跑最简单应用”的组合最适合排查硬件和软件层面的基础问题。如果连 FM 都收不清楚那做复杂应用基本无从谈起。1.3 这篇文章的适用对象和最终目标这篇文章既适合完全没有接触过 GNU Radio 的入门者也适合已经会写流图但想搞懂参数背后计算的软件无线电爱好者。最终你会得到两样东西一套能出声的 FM 接收流图以及一张“为什么这个参数要这么设”的对照表。看完之后你可以不依赖教程自己修改频率、增益、采样率甚至在流图上加频谱观察器直观看到不同电台在频谱上的分布。2. 环境准备硬件连接、驱动安装和 GNU Radio 搭建2.1 硬件清单和接线要点除了 B210 本身你还需要一根支持 USB 3.0 的数据线B210 用的是 Type-A 到 Type-B 的 USB 3.0 线接头通常是蓝色标记一台带 USB 3.0 接口的电脑建议 Linux 系统Ubuntu 22.04/24.04 是我用得最顺的一根 FM 天线。B210 的 RF 接口是 SMA/BNC 类型我建议买一根普通 FM 接收天线或者用最简单的 1/4 波长导线。FM 广播波长大约 3 米1/4 波长大约 75 厘米取一段 75 厘米左右的导线插在 B210 的 RF 口上就能收到不少台耳机或者音箱插在电脑的音频输出口B210 有两个 RF 接口TX/RX 和 RX2。做接收项目时我习惯把天线插在 TX/RX 端口因为 GNU Radio 的 UHD Source 默认子设备配置会使用这个端口如果你插在 RX2需要手动把 Subdev Spec 改成 A:AB否则收不到信号。这是一个很容易踩但不难解决的细节。2.2 UHD 驱动和 GNU Radio 的安装方式在 Ubuntu 上最简单的路径是直接用 apt 安装sudo apt update sudo apt install gnuradio uhd-host这条命令会同时装好 GNU Radio 3.10、GRC 图形化工具和 UHD 驱动。UHD 驱动是与 B210 通信的底层库GNU Radio 通过 UHD Source 模块加载它。如果之后你想用最新版 GNU Radio可以通过源码编译或者使用 PyBOMBS 这类管理工具但做 FM 收音机完全没必要折腾系统自带版本足够稳定。2.3 设备识别、固件镜像加载与权限问题装完驱动后把 B210 插入电脑 USB 3.0 口打开终端检查uhd_find_devices如果输出里能看到USRP B210等设备信息说明驱动识别正常。第一次运行 UHD 相关程序时B210 的 FPGA 需要加载固件镜像系统可能提示你运行uhd_images_downloader这个命令会从网上下载合适的 FPGA 镜像之后 UHD 每次启动 B210 时自动加载。国内网络环境下载可能慢但一般等几分钟能完成。权限是个高频坑。Linux 下如果提示找不到设备或者 USB 权限不足通常是因为当前用户不在dialout用户组sudo usermod -aG dialout $USER然后注销重新登录再用uhd_find_devices检查。执行uhd_usrp_probe可以看到 B210 的详细配置包括主时钟速率和通道信息建议跑一遍确认硬件状态正常再进 GRC。3. GNU Radio 流图设计与参数计算3.1 信号链路整体拆解整个 FM 接收链路可以拆成五个阶段对应 GRC 里的五个模块UHD: USRP Source负责从 B210 拿原始 I/Q 数据Frequency Sink可选负责在频谱上观察信号方便找台WBFM Receive负责 FM 解调输出单声道音频Rational Resampler负责把解调后的音频采样率转换成声卡支持的速率Audio Sink负责把音频数据播放出来这个链路看起来简单但每个模块的参数都牵一发而动全身。下面我按每个模块详细解释参数怎么设、为什么这么设。3.2 UHD USRP Source 参数怎么填在 GRC 中搜索UHD: USRP Source双击打开配置。关键参数如下参数名推荐值说明Device Address留空只有一个 B210 时留空会自动搜索Samp Rate2M每秒钟采集 200 万个复数样本Center Freq本地某个强台频率如 103.9M这是接收的中心频点Gain40射频前端总增益单位 dBBandwidth1M 或 2M模拟前端滤波器带宽Subdev Spec默认如果天线在 TX/RX 口就默认RX2 口改成 A:ABSamp Rate 为什么选 2M很多刚接触的朋友会问FM 广播带宽只有约 200kHz按奈奎斯特定理采样率 500kHz 不就行了理论上确实可以但有两个现实原因第一B210 的模拟前端滤波器和数字下变频并非理想矩形2M 采样率可以留足过渡带余量避免相邻频道的干扰混叠进来。第二2M 采样率的频谱视野足够宽。FM 广播频道间隔通常是 200kHz2M 频谱里能看到 10 个左右的电台这样你在频谱图上可以一次性看到很多信号峰找台非常方便。Gain 参数也有讲究。B210 的总接收增益范围大概在 0-75dB增益开太大容易让射频前端饱和频谱上出现一坨“平头”信号声音反而破音、失真增益太小则弱台听不见。对 FM 广播来说先用 40dB 起步然后在频谱图上观察信号强度再微调。3.3 WBFM Receive 模块FM 解调的核心这是整条链路最关键的部分。WBFM Receive 模块在 GNU Radio 中封装了一整套 FM 解调处理链信道选择低通滤波、正交鉴频、去加重、音频低通滤波、采样率抽取。模块参数有两个必须设置Quadrature Rate必须等于上游 UHD Source 的 Samp Rate即 2MAudio Decimation抽取因子决定了音频输出采样率关键计算就在这一步。音频输出采样率等于音频采样率 Quadrature Rate / Audio Decimation如果 Quadrature Rate 2M设 Audio Decimation 25那么输出音频采样率就是 2,000,000 / 25 80,000 Hz也就是 80kHz。设成 50输出就是 40kHz。需要说明一下GNU Radio 3.8 和 3.10 的 WBFM Receive 参数形式略有不同。3.8 是直接填 Audio Decimation3.10 之后部分版本改为同时支持 Audio Rate 参数你可以直接填 48k模块内部自动计算抽取。我下面以 3.8 的写法为例因为它更能讲清楚采样率换算过程。你为什么不能直接把 Audio Decimation 设成 41 或者 42 来让输出等于 48k因为抽取必须是整数2,000,000 无法整除 48,000结果是 41.67。这就是后面需要 Rational Resampler 的原因。3.4 从 80k 到 48kRational Resampler 补救采样率WBFM Receive 输出 80kHz 的音频流但绝大多数声卡只原生支持 44100Hz、48000Hz 或 96000Hz。把 80k 变成 48k需要一个有理数重采样器。Rational Resampler 参数设置Interpolation3Decimation5因为 80,000 × 3 / 5 48,000。这个 3/5 也就是 0.6把 80k 缩放成 48k内部会先插值 3 倍再抽取 5 倍既能保证整数运算又能满足声卡需求。如果你用的是 1M 采样率WBFM Receive 的 Audio Decimation 设成 20输出 50kRational Resampler 则要设成 24/25因为 50,000 × 24 / 25 48,000。你需要注意整套参数的一致性。3.5 Audio Sink把数据变成声音Audio Sink 模块负责把音频数据送给系统声卡。设置 Sample Rate 为 48k和 Rational Resampler 的输出一致。Device Name 一般留空让系统使用默认音频输出设备。如果没声音可以先在电脑上播放一首歌确认系统音频输出本身是正常的。到这里最小可用链路已经齐了UHD Source → WBFM Receive → Rational Resampler → Audio Sink。实际跑起来之前我强烈建议在 UHD Source 后面加一个 Frequency Sink频谱显示模块这样能实时看到频谱找台会方便得多。4. 实操过程从流图搭建到真实收台4.1 完整流图的连接顺序打开 GRC按以下顺序拖入模块并连线从模块库拖入UHD: USRP Source从模块库拖入Frequency Sink从模块库拖入WBFM Receive从模块库拖入Rational Resampler从模块库拖入Audio Sink连接关系如下UHD Source 输出 (complex) → Frequency Sink 输入 UHD Source 输出 (complex) → WBFM Receive 输入 WBFM Receive 输出 (float) → Rational Resampler 输入 Rational Resampler 输出 (float) → Audio Sink 输入注意数据类型的匹配。UHD Source 输出的是复数格式fc32Frequency Sink 和 WBFM Receive 都能接收复数WBFM Receive 输出浮点型float所以 Rational Resampler 和 Audio Sink 也用 float 类型。连线上如果出现红色断点多半是数据类型不匹配。各模块参数按照第 3 部分给的表格填好。Center Freq 那里先填一个你本地确定的强台频率如果没有头绪先填 100M跑起来后看频谱再调整。4.2 第一次运行听响和找台的完整流程点击 GRC 右上角的运行按钮生成流图。运行后你应该能看到频谱窗口同时耳机里能听到广播声或者噪声。如果没声音大概率是中心频率没对准电台。FM 信号在频谱图上不是那种特别尖锐的窄峰而是一个顶端相对平坦、有一定宽度的“鼓包”宽度约 200kHz。你可以在频谱图上拖动鼠标观察找到鼓包之后对着那个位置调整 Center Freq。也可以直接用键盘在 GRC 的变量面板里改频率改完重新运行。我自己的操作习惯是先用 Center Freq 100M 跑一遍然后在频谱图里找到信号最强的鼓包比如在 98.2MHz 附近就把 Center Freq 改成 98.2M重新点击运行。如果听到清晰的人声或者音乐说明解调链路已经通了。增益的调整手法是从 40dB 开始如果频谱显示底噪很高先把 Gain 降到 30如果弱台声音小再慢慢加到 50。注意增益不是越大越好。我实验过当 Gain 超过 60dB 时本底噪声会被抬得很高强台声音反而出现明显失真弱台也被淹没在噪声里。40-50 之间通常是一个比较合理的甜点区。4.3 用频谱观察台站分布和信号质量加了 Frequency Sink 之后你能直观地看到整个 FM 频段上的信号分布。2M 采样率下频谱横轴显示范围大约是 Center Freq 正负 1MHz你能看到 10 个左右的频道。判断信号质量有几个经验FM 信号在频谱上应该是宽而平坦的鼓包如果看到非常窄的尖峰那往往是单频干扰而不是 FM 广播如果整个频谱底噪特别高说明增益偏大或者天线位置不理想。把天线靠近窗口、远离电脑电源适配器底噪通常有明显改善。频谱工具还有一个额外用途做频率扫描。你可以把 Center Freq 从 88M 一步步加到 108M每次观察频谱就能统计出你所在区域能收到哪些台。这个“穷举扫描”虽然原始但对熟悉频段分布非常有效。4.4 调优进阶带宽、AGC 和立体声问题如果射频前端 Bandwidth 没有设置UHD Source 默认使用较宽的带宽可能会有邻频干扰。把 Bandwidth 设为 1M 或更窄可以减少带外噪声让频谱更干净。这里注意Bandwidth 不能低于你真正需要的信号带宽FM 信号需要约 200kHz所以设在 500kHz 到 1M 之间是安全的。UHD Source 模块自带 AGC 选项可以尝试打开让硬件自动调整增益。不过我用下来在 FM 广播这种强信号场景里AGC 有时候会带来增益持续波动反而不如手工固定 Gain 稳定。这个需要你自己试不同环境差别挺大。WBFM Receive 模块输出的是单声道音频。如果要收立体声单纯依靠这个模块不够因为立体声的副载波19kHz 导频 38kHz 差分信号在解调出来的基带音频里是高频分量需要额外的立体声解码器。这个话题可以作为后续进阶方向不影响你先把单声道跑通。5. 常见问题与排查技巧实录5.1 设备识别与固件加载问题现象uhd_find_devices找不到设备或者 UHD Source 模块报No UHD Device Found。先检查物理连接是否是 USB 3.0 接口B210 对 USB 供电要求比较高如果是前置 USB 口或者 USB 2.0 口供电不足会导致设备反复离线。我遇到过几次这种问题换到机箱后面板 USB 3.0 口立刻正常。再检查系统识别在终端运行lsusb看是否存在Ettus Research相关的设备记录。如果有但uhd_find_devices看不到基本就是权限问题按 2.3 节加入dialout用户组。如果固件加载失败重新执行uhd_images_downloader确保镜像下载完整。UHD 与 GNU Radio 的版本需要匹配如果 UHD 太新而 GNU Radio 是 apt 装的旧版也可能导致模块加载异常。5.2 没有声音、噪音很大或声音断续我把这类问题整理成速查表现象可能原因处理方法完全没声音接收频率没对准电台参考频谱图重新设置 Center Freq完全没声音声卡采样率不匹配确认 Audio Sink 采样率是 48k完全没声音天线没接好或增益太低检查 RF 口连接Gain 调到 40dB 以上全是嘶嘶噪声没有信号或本振偏移在频谱图上找鼓包微调频率声音断续、卡顿采样率设置过高或 USB 3.0 不稳定将 Samp Rate 降到 1M 或 2M换 USB 口声音破、失真增益过大射频前端饱和降低 Gain 到 30-40dB某几个台串在一起前端滤波器带宽过宽将 Bandwidth 设为 1M 以下还有一个容易被忽略的环节Audio Sink 模块里面如果勾选了OK to Block会等待声卡准备好再输出数据如果没勾选音频数据超时时会被直接丢弃可能导致声音断断续续。我一般保持默认勾选如果用的是 PulseAudio 或 PipeWire这个选项通常没有副作用。5.3 性能问题和 CPU 占用异常B210 在 2M 采样率下跑 FM 解调CPU 占用非常低。如果你发现 CPU 占用很高首先要看是否是 Frequency Sink 的 FFT 点数设置太大比如 8192 点以上会明显增加计算量把它降到 1024 点即可。另外如果你把 Samp Rate 设成 20M 或者更高去观察频谱USB 带宽和 UDP 处理就会吃紧电脑风扇开始狂转。做 FM 收音机完全没必要控制在 2M 是最舒适的。若想扫频段可以一次把采样率升到 4M观察完频谱再降回来不会对硬件造成伤害。如果在 Windows 上运行出现音频延迟问题建议改用 Linux 系统。这不是玄学Linux 下 UHD 对 B210 的调度稳定性和音频后端兼容性明显更好我最初在 Windows 上折腾了很久没解决好换到 Ubuntu 一次搞定。5.4 频率偏移和 DC 干扰现象B210 使用零中频架构在基带频谱的正中心也就是 Center Freq 的那一点通常会出现一个 DC 尖峰。如果电台正好落在中心频点上DC 尖峰可能会干扰解调产生持续的“嗡嗡”声。解决办法是让接收频率和电台频率稍微错开一点比如电台在 98.2MHz你把 Center Freq 设在 98.3MHz让所需的 FM 信号落在频谱的中高频区域避开 DC 尖峰。这个手法在很多 SDR 接收方案里都用到属于零中频架构下的通用处理技巧。6. 从 FM 收音机还能延伸出哪些项目FM 收音机这个项目跑通之后你手里的 B210 和 GNU Radio 就解锁了更多可能。我简单列几个方向都是在这个基础链路上做小改动就能起步的把 WBFM Receive 换成 AM Demod配合合适的低通滤波器就能接收中波 AM 广播原理类似只是解调方式从频率变化变成了幅度变化用相同的硬件加一张新的 GnuRadio 流图就能监听航空甚高频语音甚至接收气象卫星数据属于软件无线电“一机多用”的典型体验如果对数字信号处理感兴趣可以在 FM 解调后的音频流上做频谱分析观察 19kHz 导频信号进一步实现 FM 立体声解码把 UHD Source 换成 RTL-SDR Source整套流图几乎不用改就能跑。B210 不是必需品这恰恰说明 GNU Radio 的优势在于模块化硬件只是信号来源我在实际操作中的体会是FM 收音机的价值不在于“听广播”——毕竟是个人就能买台 50 块的收音机。它的价值在于把采样率、带宽、调制解调、频谱观察、声卡后端这一整条链路中的所有关键概念用一个最小项目串起来了。第一次听到声音的那一刻你会对整个信号处理链条有一种“打通了”的感觉这种理解是看多少理论都换不来的。最后再分享一个小技巧跑通之后别急着关掉试试把 Samp Rate 从 2M 降到 1M再升到 4M观察频谱显示范围和 CPU 占用率的变化再试试把天线从窗边挪到桌底看信噪比怎么变。这几个小实验做完你对采样率和射频前端的理解会比看十篇教程都深刻。
返回列表