跳至主要內容

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 產生的物件傳送進來,並設定為 self.grc 屬性。
  3. changeFreq 函數中,我們把得到的頻率,傳回給 self.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. 增加電台,或者改變佈局。