如何實現FM廣播回放?

FM(Frequency Modulation)即頻率調製,人們習慣上用FM來指一般的調頻廣播(在中國為88-108MHz)。注意FM廣播一般為WBFM(寬頻調頻),對講機一般為NBFM(窄帶調頻)。FM調製一般是把基帶信號(比如說語音信號)體現在載波的頻率信息中,正如下面的公式所描述的:

A_{m}cosomega_{m}t 
ightarrow Acos(omega_{c}t+eta_{F}cosomega_{m}t) = Re[Ae^{jomega_{c}t}e^{jeta_{F}cosomega_{m}t}]

其中 eta_{F} 為調製指數且 eta_{F} = frac {K_{F}A_{m}}{omega_{m}} = frac {Delta omega_{max}}{omega_{m}} = frac {Delta f_{max}}{f_{m}}

FM解調即是把基帶信號從載波的頻率中解析出來,二者互為逆過程。

接下來要介紹一下本文的主角了——HackRF!

HackRF是一款簡易的開源SDR(軟體定義無線電),SDR是一種無線電廣播通信技術,它基於軟體定義的無線通信協議而非通過硬連線實現。頻帶、空中介面協議和功能可通過軟體下載和更新來升級,而不用完全更換硬體。

更多關於SDR的故事請詳見下面鏈接:

【Software Defined Radio】軟體無線電的過去、現在和未來

下圖為HackRF硬體架構圖:

HackRF硬體結構圖

以接收過程為例,信號由天線進入後流程如下:

  1. 由射頻開關決定是否經由14dB的放大器進行放大(RF放大)
  2. 經過鏡像抑制濾波器對信號進行高通或低通濾波。
  3. 信號進行RFFC5072晶元混頻到2.6GHz固定中頻。
  4. 信號送入MAX2837晶元混頻到基帶,輸出差分的IQ(兩路正交)信號(帶寬限制)
  5. MAX5864晶元對基帶信號進行數字化後送入CPLD和單片機。
  6. 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 HackRF

Index: 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,到這一步採樣率應該為 samp\_rate = frac{10e6	imes12}{5	imes50} = 480e3

再進行WBFM接收(解調),這裡還需將採樣率縮小10倍,採樣率變為 samp\_rate = frac{480e3}{10} = 48e3

這樣才可以匹配計算機音效卡的採樣率,Audio Sink即為計算機音效卡輸出,這時運行該程序即可收聽FM廣播了,如果想更改頻道的話可以拖動Slider滑塊。

下面就是本文的最終部分了:如何實現廣播回放?

其實很簡單,我們只需要把FM信號錄製下來就可以了,但是我們應該從哪一步開始錄製呢?理論上哪一步都可以:如果在接收機或者混頻之後錄製,那麼採樣率沒有經過調整,計算機還會以預設的採樣率進行錄製,這樣就會導致錄製文件比較龐大,浪費硬碟資源。所以我建議放在WBFM解調之後,這樣會以音效卡的採樣速率錄製文件,而且在回放的時候步驟也很簡單,僅需要File SinkAudio Sink兩個模塊。

gnuradio-companion編譯界面


幾點解釋:

經過正交檢波後,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型來匹配。


推薦閱讀:

如果燈泡能通信,您想讓它做什麼

TAG:無線電 | 無線通信 |