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 產生的物件傳送進來,並設定為 self.grc 屬性。 - 在
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
- 執行上述的程式碼,確定其可以正常運作。
- 增加電台,或者改變佈局。