从AM到FM:在GNU Radio里一步步改出调频接收器

发布于
5

继续学习《Practical SDR:Getting Started with Software-Defined Radio》,上一篇了解了一个 AM 接收器的工作原理,本文在此基础上,只通过少量模块替换和参数调整,就可以将它改造成一个 FM 接收器

首先把源文件设置修改为 FM 信号:ch_07/fm_c96M_s8M.iq,这个信号中心频率为 96M(96e6),采样率为 8M(8e6),因此修改将流程图中相应的变量进行修改:center_freq=96e6,samp_rate=8e6,频率暂时设置为 96e6 看看当时捕获的中心频率有什么信息

为了方便修改频率,我将 freq 变量改成了 QT GUI Range,这需要设置频率的起始范围和步进,由于一般采样率至少为信号带宽的两倍,所以暂且设置这个信号是从 92M 到 100M 的

接下来修改低通滤波器,FM 带宽通常为 200 kHz,因此修改低通滤波器的截止频率为 100kHz(双边带带宽,即正负频率各100kHz,总带宽200kHz),Transition Width 设置为截止频率的 1/10,即 10kHz,最后将抽取率 (Decimation) 改为 20(原流程图是 400k 的采样率,我们现在是 8M,所以需要 Decimation 设置为 8M/400k = 20 以降低采样率)

将原来的 AM Demod 替换成 WBFM Receive,设置 Quadrature Rate 为 400k,将“Audio Decimation”(音频抽取率)设置为 1,修改完后流程图如下,启动后可以调整 freq 变量,在多个频率上听到广播声音(96.5M、97.3M 等)

到此就完成了从 AM 到 FM 接收机的转变,但是还有一种更简洁的方法,目前我们调谐信号需要三个不同的模块(Signal Source、Multiply、Low Pass Filter)。实际上 GNU Radio 有一个集成了这些功能的模块(Frequency Xlating FIR Filter)它的功能就是:频移、滤波、抽取

该模块有几个参数,先来说中心频率(Center Frequency),我们之前已经创建过变量 center_freq,通过计算 center_freq – freq 得到频移值,实现 RF 数据的中心频率调整

在 GNU Radio 中,信号以 0Hz 为中心,对应实际频率为 96MHz,假设我们想要调整到 96.5MHz,这个频率在 GNU Radio 中现在是 0.5MHz,那需要往左移动 0.5MHz,也就是乘以 -0.5MHz,这样实际中心频率就到了 96.5MHz

但在这个模块中,中心频率指的是将输入射频数据调整后的目标中心频率。例如,若要以 96.5MHz 为中心频率,这里应设置为 0.5MHz(即从 0MHz 调整到 0.5MHz),所以需要将中心频率设置为:freq – center_freq

抽取率 Decimation 保持 20 不变,接下来需要配置模块的下一个功能:低通滤波器,首先创建两个变量:

chan_width 设置为 200e3 表示滤波器的频率范围(这里与之前的 Low Pass Filter 差异是,低通滤波器模块的截止频率指的是到负截止频率和正截止频率的频率范围,而现在 chan_width 通道宽度指的是整个频率范围)

transition_width 设置为 chan_width/20(通道宽度 chan_width=200e3,截止频率为 chan_width/2,过渡宽度应为截止频率的十分之一,因此 transition_width 应该设置为 chan_width/20)

设置模块的 Taps 为 firdes.low_pass(1, samp_rate, chan_width/2, transition_width),这实际上是一个 GNU Radio 的函数,用来生成低通滤波器的抽头,这四个参数分别是:

  • 滤波器的增益:我们不需要增益,因此设置为 1
  • 数据的采样率:仍然是 samp_rate
  • 滤波器的截止频率:这就要和之前的 Low Pass Filter 一样了,通道宽度的一半 chan_width/2
  • 过渡宽度:直接用刚才创建的变量 transition_width

然后尝试运行,应该与之前的效果一样

接下来可以对流程图进行一些优化,比如现在采样率是 400k 如果想要改成其他值需要调整多个模块,我们可以创建一个变量 working_samp_rate,把值设置为 400e3,然后把 Decimation 属性改为 int(samp_rate/working_samp_rate) 这样就会根据原始的采样率和模块输出端所需的采样率来计算 Decimation,由于 Decimation 必须是整数值,因此使用 python 的 int 变量来强制转换类型为整数

别忘了还有有理采样(Rational Resampler)模块的 Decimation 属性改为 int(working_samp_rate/1000),这将产生一个整数值抽取率 400,与 32 的插值相结合将产生 32 ksps 的输出数据流

还可以添加一个 QT GUI Range 来通过滑块控制音量

在 Rational Resampler 和 Audio Sink 之间添加一个 Multiply Const 模块,将 IO Type 设置为 float,并将 Constant 属性设置为 volume/10

也可以添加一个频率图(QT GUI Frequency Sink),可以通过峰值清晰地看到这段信号中有哪些电台信号

一个排版建议:选中该模块按方向键可以将其旋转,以便更美观地绘制流程图(比如我向右旋转旋转两次,现在 IN 在模块右侧了,直接将 File Source 的输出连接到 QT GUI Frequency Sink 的输入,而不用像 WBFM Receive 和 Rational Resampler 模块那样绕)

到这里,一个结构更清晰、参数更集中的 FM 接收器流程图就完成了

0 赞
0 收藏
分享
1 讨论
反馈
0 / 600
1 条评论
热门最新

这篇文章顺着《Practical SDR》的学习脉络,把从AM接收器改造为FM接收器的过程讲得很细致,从替换FM信号源文件、调整中心频率和采样率,到把频率变量改成可调的GUI组件,每一步都清晰明了,对入门软件无线电的新手很有帮助,感谢作者分享,期待后续更多实操内容!