FM 电台
2024年5月3日大约 1 分钟
FM 接收解码
FM 接收解码的部份,使用 GRC 设计如下:
模组参数:
- Soapy HackRF: Center Freq=100e6
- Range f=96e6~104e6
- Signal Source: Freq=100e6-f
- Low Pass Filter: Decimation=20, Cutoff Freq=80e3, Transition_width=20e3
- WBFM Receive: Quadrature Rate=500e3, Audio Decimation=10
- Rational Resampler: Decimation=25, Interpolation=24
- Range gain=0~3
- Audio Sink: 48e3
设定 ID 为 fm_recv,以产出 fm_recv.py 文件。
FM 面版
我们将上页的 Panel 面版略微修改如下:
import sys
from PyQt5 import Qt
class Station(Qt.QWidget):
stations = {
"ICRT(100.7)": 100.7,
"风城广播(98.7)": 98.7,
"国际广播电台(101.1)": 101.1,
}
def __init__(self, grc):
super().__init__() # parent initialization
self.setWindowTitle("广播电台") # set title
self.grc = grc # save the grc instance
vlayout = Qt.QVBoxLayout(self) # create a vertical layout
self.setLayout(vlayout) # set the layout
for name, freq in self.stations.items(): # loop items
btn = Qt.QRadioButton(name) # add a button
btn.toggled.connect(self.changeFreq) # connect click event
vlayout.addWidget(btn) # put into the vlayout
def changeFreq(self): # event handler
btn = self.sender() # get sender button
freq = float(self.stations[btn.text()])
self.grc.set_f(freq*1e6) # set frequency
这边修改的部份,包括:
- 更换电台频道清单,这份清单是根据当前状况重新设定的。
- 在
init
函数中,我们把 GNU Radio 产生的物件传送进来 (grc)。 - 在
changeFreq
函数中,我们把得到的频率,传回给 grc 的设定函数。
主程式
撰写一个主程式 main.py
,将上述两个程式组件结合在一起:
import sys
from PyQt5 import Qt
from fm_recv import fm_recv
from station import Station
qapp = Qt.QApplication(sys.argv)
grc = fm_recv()
grc.start()
grc.show()
fmStation = Station(grc)
fmStation.show()
qapp.exec_()
执行结果:
练习 4
- 执行上述的程式码,确定其可以正常运作。
- 增加电台,或者改变布局。