跳至主要內容

FM 电台

Jia-Yin大约 1 分钟comm

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

这边修改的部份,包括:

  1. 更换电台频道清单,这份清单是根据当前状况重新设定的。
  2. init 函数中,我们把 GNU Radio 产生的物件传送进来 (grc)。
  3. 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

  1. 执行上述的程式码,确定其可以正常运作。
  2. 增加电台,或者改变布局。