天天看點

SDR# (SDRSharp)代碼講解 (五)

SDR# (SDRSharp)代碼講解 (五)

解調算法還有不少有趣的,比如DSB、LSB、USB解調器,這些以後會講,讀者也可以先把這些子產品的代碼對照Matlab RTL-SDR那本書看一下。另外,比如DownConverter和Oscillator也是一個經典的用軟體方式實作以前硬體中實作的工作的例子。還有DCRemover在我們大多數的SDR中也很重要,Decimator在數字信号進行中也很常見。RdsDecoder是國外的在FM信号中攜帶文字資訊的解調器。這些以後有時間再詳細講,但我認為接下來最值得講的是SDRSharp中的FFT實作。

FFT算法可以說是數字信号處理裡最重要的算法,全稱是快速傅立葉變換。傅立葉變換的種類有很多,我們在通信領域會接觸到的還有一些比如離散傅立葉變換、連續傅立葉變換,其實如果不考慮公式推導,隻是做定性了解的話,它們的功能都差不多,都是把一個信号從時域變換到了頻域,用來分析信号的頻域特征的。

通過傅立葉變換,就能知道給定時間内的信号的各頻率分量,比如如果是音頻信号(聲波信号)做傅立葉變換,就能知道是高音分量大還是低音分量大,用來判斷這個聲音是高音還是低音。iPhone應用商店裡有不少這種APP,對着手機唱“哆唻 咪發 嗖拉 西”,手機經過FFT運算後可以得出主要分量對應的音階,有些APP還能把頻譜圖顯示出來,你可以看到除了主要分量外的其它諧波分量,你可以看看音調升高後,頻譜圖上的主要分量是否在向右側(高頻率方向)移動。

無線電信号是承載在電磁波上的,電磁波很多時候與聲波有相似的特性,我們也利用FFT算法來分析它的各頻率分量。FFT與最原始的傅立葉變換的差別就是可以在計算機上實作,且運算速度快。

SDRSharp裡其實有兩個地方都實作了FFT,一個是SDRSharp/Radio/Fourier.cs,另一個是SDRSharp/DNR/Fourier.cs。前者主要用于PanView中的頻譜顯示,後者用于解調出的音頻信号的降噪處理。其實内容差不多,但是我更喜歡DNR目錄裡的FFT實作,因為這個目錄下的FFT更接近比較原始的碟形算法,而且還實作了IFFT傅立葉逆變換,跟教科書裡的相關公式比較接近。

這裡推薦一個幻燈片,把FFT算法原理講得很好。

https://wenku.baidu.com/view/5cacb2b8bd64783e09122b9a.html