如何實現FM廣播回放?
FM(Frequency Modulation)即頻率調製,人們習慣上用FM來指一般的調頻廣播(在中國為88-108MHz)。注意FM廣播一般為WBFM(寬頻調頻),對講機一般為NBFM(窄帶調頻)。FM調製一般是把基帶信號(比如說語音信號)體現在載波的頻率信息中,正如下面的公式所描述的:
其中 為調製指數且
FM解調即是把基帶信號從載波的頻率中解析出來,二者互為逆過程。
接下來要介紹一下本文的主角了——HackRF!
HackRF是一款簡易的開源SDR(軟體定義無線電),SDR是一種無線電廣播通信技術,它基於軟體定義的無線通信協議而非通過硬連線實現。頻帶、空中介面協議和功能可通過軟體下載和更新來升級,而不用完全更換硬體。
更多關於SDR的故事請詳見下面鏈接:
【Software Defined Radio】軟體無線電的過去、現在和未來
下圖為HackRF硬體架構圖:
以接收過程為例,信號由天線進入後流程如下:
- 由射頻開關決定是否經由14dB的放大器進行放大(RF放大)
- 經過鏡像抑制濾波器對信號進行高通或低通濾波。
- 信號進行RFFC5072晶元混頻到2.6GHz固定中頻。
- 信號送入MAX2837晶元混頻到基帶,輸出差分的IQ(兩路正交)信號(帶寬限制)
- MAX5864晶元對基帶信號進行數字化後送入CPLD和單片機。
- LPC4320/4330處理器將採樣數據通過USB送至計算機。
HackRF支持Windows、Linux、Mac、安卓等系統,推薦大家使用Linux的GNU Radio軟體環境,本文會以Linux的一個完全支持HackRF和GNU Radio的distribution——pentoo為實例展示。
在pentoo的text模式輸入以下命令進入X Windows界面:
$ startx
為了驗證HackRF是否被系統檢測到,可以觀察電路板的USB燈是否點亮,點亮說明已被檢測到;或者是在終端輸入hackrf_info,若輸出類似以下信息說明已被檢測到。
hackrf_info version: 2017.02.1
libhackrf version: 2017.02.1 (0.5)Found HackRFIndex: 0
Serial number: 0000000000000000################Board ID Number: 2 (HackRF One)Firmware Version: 2017.02.1 (API:1.02)Part ID Number: 0x######## 0x########
打開終端,輸入:
$ gnuradio-companion
gnuradio-companion是一個類似於Labview的圖形化程序開發環境,採用python編寫,其中每個模塊的屬性配置均可採用python語法的表達式,最後編譯為py文件,可以在GUI上運行程序或者在終端輸入以下指令運行:(FM_Radio為我編譯的該常式名)
$ python ./FM_Radio.py
默認的空白界面應該是有options和一個Variable模塊,其中options可以配置常式名字和使用的GUI庫,比如WX庫或者QT庫;Variable模塊可以理解為一個全局變數,其有ID和Value兩個屬性,ID為變數名稱,Value為變數值,默認自帶的一個變數是samp_rate,其默認值為32e3,這個變數特別重要,代表著HackRF的採樣速率,在後面也會提到。
下面就按照模塊化的實例進行說明。
osmocom Source可以理解為配置HackRF為接收狀態,這裡需要把RF Gain設置為0dB,表示旁路射頻增益放大器,這裡注意一下,RF Gain雖然可以輸入任意數,但是實際只有兩檔:0dB和14dB,在這裡旁路是因為防止高功率的射頻信號再經過放大損壞電路板。Ch0:Frequency表示接收信號的中心頻率,我設置其為97.5e6。
Multiply(即乘法器)的作用是混頻,本質就是頻譜搬移。因為如果我們確定了Ch0的頻率(方便觀察FFT實時頻譜圖),便不能改變接收信號的中心頻率(即換台),那麼我們就可以與一個可變頻的本地信號源混頻(定義一個Slider),把中心頻率進行搬移,再進行低通濾波即可獲取我們想要的信號了。
濾波器的參數設置必須符合WBFM的特點,在這裡我們把採樣速率下降50倍,因為信號要進行解調處理,降低採樣速率可以降低運算負擔(當然如果省略這一步也可以),Rational Resampler其實進行的是採樣率的乘除法,先乘12再除5,到這一步採樣率應該為
再進行WBFM接收(解調),這裡還需將採樣率縮小10倍,採樣率變為
這樣才可以匹配計算機音效卡的採樣率,Audio Sink即為計算機音效卡輸出,這時運行該程序即可收聽FM廣播了,如果想更改頻道的話可以拖動Slider滑塊。
下面就是本文的最終部分了:如何實現廣播回放?
其實很簡單,我們只需要把FM信號錄製下來就可以了,但是我們應該從哪一步開始錄製呢?理論上哪一步都可以:如果在接收機或者混頻之後錄製,那麼採樣率沒有經過調整,計算機還會以預設的採樣率進行錄製,這樣就會導致錄製文件比較龐大,浪費硬碟資源。所以我建議放在WBFM解調之後,這樣會以音效卡的採樣速率錄製文件,而且在回放的時候步驟也很簡單,僅需要File Sink和Audio Sink兩個模塊。
幾點解釋:
經過正交檢波後,IQ採樣可以放寬對ADC採樣速率的限制,比如某信號頻域的最高頻率為10MHz,但我們手上僅有採樣率為10MS/s的ADC,如果進行直接採樣的話,勢必會造成頻譜混疊(採樣率低於Nyquist率),但是如果為IQ採樣的話就可以避免這一情況了,我們可以理解為IQ實際採樣率為其標稱採樣率的兩倍。
MCU通過USB匯流排將採樣數據傳送到計算機上,所以其實HackRF只是一個信號採集設備,信號分析、處理都是在計算機上完成的,這就對計算機的CPU和USB匯流排性能有一定的要求。如果HackRF的採樣速率為20MS/s(HackRF的最大採樣率),那麼就需要USB的傳輸速率達到20Mbps以上才可以匹配,所以在操作HackRF時盡量關掉佔用匯流排的設備。
HackRF在其SMA插頭沒接天線的時候盡量不要打開電源,以免高頻信號反射燒壞晶元IC,然而可以接50歐姆的負載做阻抗匹配。在天線端若使用有線的高頻線纜連接的話最好接一個10dB的衰減器,而且一定要把射頻增益放大器的增益開關關閉。
GUI可以選擇QT庫還是WX庫,如果選擇QT庫的話在編程區拖入WX模塊的話就會報錯,反之同理。
低通濾波器參數的設置使它看起來像一個模擬的低通濾波器,但它實際上是一個FIR濾波器,只不過設置它的截止頻率和過渡帶寬會自動計算出FIR濾波器的響應,有興趣的話可以直接使用FIR濾波器來取代該低通濾波器。
一定要注意數據類型的匹配,不匹配會報錯,比如說WBFM Receive的輸出為float型,但是File Sink的輸入為complex型,這時需要調整File Sink的輸入為float型來匹配。
推薦閱讀: