4、GNU Radio基础:GRC图形化界面入门、信号源与示波器、第一个FM收音机流图
好,咱们今天来点真家伙。
前面几章聊了SDR的理论基础,什么采样率、混频器、数字下变频……说实话,光看公式容易犯困。我当年学的时候也是,看了三天书,脑子里全是正弦波在打架。直到我打开了GNU Radio Companion(GRC),拖了几个模块连上线,看到波形在屏幕上跳出来的那一刻——嗯,通了。
这一章,我们就从GRC这个图形化界面入手。你不需要写一行C++或Python代码,就能搭出一个能跑的FM收音机。听起来是不是挺酷?
4.1 GRC是什么?为什么我推荐它?
GNU Radio本身是一个开源的软件开发工具包。它提供了几百个信号处理模块,比如滤波器、混频器、FFT分析等等。但如果你让我直接去调用这些API写程序,说实话,调试起来挺痛苦的。
GRC就是它的图形化前端。你拖拽模块,连线,设置参数,它自动生成Python脚本。说白了,就是“所见即所得”的信号处理设计工具。
我个人习惯是:先用GRC搭原型,验证思路。确认没问题了,再考虑要不要优化成纯Python脚本。这样效率最高。
在GRC里,你搭建的每一个连线图,都叫一个流图。数据从信号源(Source)流出来,经过各种处理模块,最后到信宿(Sink)。数据是单向流动的,不能回流。这一点和Simulink有点像,但更轻量。
4.2 第一个流图:信号源 + 示波器
咱们先别急着听收音机。先搞个最简单的:生成一个正弦波,然后用示波器看看它长什么样。
4.2.1 拖出信号源
打开GRC,你会看到右侧有一个模块列表。搜索“Signal Source”,拖到画布上。
双击它,设置参数:
- Waveform: 选择 Cosine(余弦波)
- Frequency: 1000(1kHz)
- Amplitude: 1
- Sample Rate: 32k(32000)
这里有个坑,我当年踩过。采样率一定要至少是信号频率的两倍,这是奈奎斯特定理。你设1kHz的信号,采样率至少2kHz。但实际中,我建议设到32k以上,这样波形看起来更平滑。
4.2.2 拖出示波器
搜索“QT GUI Time Sink”,拖出来。这个就是时域示波器。
把信号源的输出端口(右侧那个小圆点)连到示波器的输入端口。连好后,点击顶部的“Generate”按钮,再点“Execute”。
你会看到一个正弦波在屏幕上滚动。嗯,就是这个感觉。
如果你觉得波形滚动太快,可以把示波器里的“Number of Points”调大,比如设成2048。这样屏幕上显示的波形周期更多,看起来更稳。
4.3 深入一点:频域和瀑布图
时域波形只能看到幅度变化。但做SDR,频域才是主战场。
再拖一个“QT GUI Frequency Sink”出来,连到同一个信号源上。运行后,你会看到频谱图上在1kHz位置有一根竖线。这就是你的信号在频域的样子。
我建议你再拖一个“QT GUI Waterfall Sink”,这是瀑布图。它能显示频率随时间的变化。如果你改变信号源的频率,瀑布图上会看到一条彩色的轨迹在移动。做信号搜索的时候,这个视图非常有用。
4.4 第一个FM收音机流图
好了,热身结束。咱们来真的——搭一个能听声音的FM收音机。
4.4.1 需要的硬件
你需要一个SDR接收机,比如RTL-SDR(淘宝几十块钱那种就行)。插上电脑,装好驱动。GRC里有一个模块叫“RTL-SDR Source”,就是专门驱动它的。
如果你用的是RTL-SDR,记得先安装librtlsdr驱动。Windows下用Zadig工具,Linux下用apt安装。我曾经因为驱动没装对,折腾了一下午,结果发现是USB线接触不良……嗯,检查硬件也是工程师的基本功。
4.4.2 搭建流图
按照下面的步骤来:
- RTL-SDR Source: 设置频率为100.0M(比如你本地的FM电台频率),采样率设为2.4M,Ch0的增益设到20dB左右。
- Low Pass Filter: 搜索“Low Pass Filter”,截止频率设200kHz。FM广播的带宽一般是200kHz左右,把带外噪声滤掉。
- WBFM Receive: 搜索“WBFM Receive”,这个模块是宽带FM解调器。Quadrature Rate设为2.4M,Audio Decimation设为10(这样输出采样率就是240kHz)。
- Rational Resampler: 把240kHz的音频重采样到48kHz,因为声卡一般支持48kHz。Interpolation设48,Decimation设240。
- Audio Sink: 搜索“Audio Sink”,直接连到重采样器的输出。这个模块会把数字信号转成声音,从你的喇叭放出来。
连线顺序:
RTL-SDR Source → Low Pass Filter → WBFM Receive → Rational Resampler → Audio Sink
运行后,你应该能听到电台的声音了。如果全是噪声,检查一下频率对不对,或者天线有没有接好。
4.5 本章知识结构图
下面这张图,帮你理清GRC流图的核心逻辑。从信号源到信宿,中间经过各种处理模块。记住这个框架,后面所有的流图都是这个套路。
4.6 避坑指南与个人经验
最后,分享几个我实际项目中遇到的坑,你碰到了可以少走弯路。
- 采样率不匹配: 模块之间的采样率必须一致,或者通过重采样器匹配。我曾经在RTL-SDR输出2.4M,直接连到Audio Sink(48kHz),结果声音像外星人说话。后来加了Rational Resampler才正常。
- 增益设置: RTL-SDR的增益不是越大越好。增益太大,底噪会跟着放大,信号反而被淹没了。我一般从20dB开始,慢慢往上调,直到声音清晰为止。
- 天线位置: 如果你在室内,把天线靠近窗户。FM信号穿透力还行,但混凝土墙还是会衰减不少。我试过把天线贴在玻璃上,效果比放在桌子底下好很多。
GRC的核心就是拖模块、连线、设参数。你不需要成为编程高手,也能搭出复杂的信号处理系统。今天我们从信号源和示波器开始,最后搭出了一个能听的FM收音机。这个流图虽然简单,但它是所有SDR应用的基石。后面我们会在这个基础上,加入更多模块,做更酷的事情。
公众号:蓝海资料掘金营,微信deep3321