0#1 FM收音機

對HackRF比較熟悉,可以直接調(diào)到最后的最后的最后。

0x00準備工作
0x01 正題
0. 開始進入正題
1. 要求分析
1.1 輸出模塊
1.2 輸入模塊
1.3 第一次檢測
1.4 解決問題
1.5 第二次檢測
1.6 低通濾波器
1.7 第三次檢測
1.8 解碼
1.9 降頻操作 
1.10 最后的最后

0x02. 最后的最后的最后

0x00 準備工作

將 HackRF 插上USB連上電腦,命令行打開顯示 HackRF One 的信息。
使用命令:

hackrf_info
hackrf_info.png

說明 HackRF One 已經(jīng)正常工作了。

檢測波段
在我們城市,F(xiàn)M廣播的頻段在 80-110 MHz之間。
命令:

osmocom_fft
FFT.png

能夠明顯的看見
95MHz,99MHZ處有高峰。說明這些地方有電臺。

圖的信息.png

雖然還是在準備階段,但是還是想試試能不能聽到 FM ,我們可以直接使用已有的軟件進行測試。
命令:(gqrx)

gqrx

gqrx.png

如果沒有相關(guān)命令,建議進行下載。
相關(guān)網(wǎng)址:
gqrx官方
使用命令:

sudo add-apt-repository -y ppa:bladerf/bladerf
sudo add-apt-repository -y ppa:myriadrf/drivers
sudo add-apt-repository -y ppa:myriadrf/gnuradio
sudo add-apt-repository -y ppa:gqrx/gqrx-sdr
sudo apt-get update

sudo apt-get install gqrx-sdr

sudo apt-get install libvolk1-bin
volk_profile

0x01 正題

似乎準備工作的時候已經(jīng)完成了所有的內(nèi)容,但是似乎,我們除了 apt-get install 就沒有啥實質(zhì)的內(nèi)容了,所以這并不是我們的目的。接下來我們開始使用 GNURadio 進行編程。GNURadio 是一個 GUI 界面的工具,所以沒用任何的編程基礎(chǔ)基本沒有什么問題,如果有 Python 的基礎(chǔ)就更好了,因為 GNURadio 是將圖形轉(zhuǎn)為Python然后進行執(zhí)行的。

GNURadio 的安裝,在前面安裝部分已經(jīng)完成了,所以我們不需要進行安裝。如果出現(xiàn)任何問題,可以試試去官網(wǎng)尋找答案。
官方也有一些入門教程。
GNURadio官網(wǎng)
如果對 GNURadio 毫無感覺,可以先看看大佬錄制的視頻。
greatscottgadgets

開始進入正題:

先看看我們的開局情況:
開局一個 Variable ,和一個 Options。

開局.png

Variable 中的是 Samp rate 表示的是采樣率。HackRF支持最高為20M。隨意我們可以先設(shè)置為 20MHz。(不能直接輸入20M,而是輸入20e6)


圖片.png

Options 中的是選擇GUI的配置內(nèi)容。
一般常用的有兩個:
WX:表示GUI編程使用wxpython

QT:表示GUI編程使用gt
本質(zhì)沒有多大區(qū)別,只是使用的模塊名稱不同。
為了統(tǒng)一,我使用WX進行演示。
設(shè)置完后顯示如下:


圖片.png

1#01 要求分析

我們的目的是獲取 FM 的頻率,并把FM廣播的內(nèi)容進行播放。
但是 HackRF ,只提供了一個比較廣的頻帶,沒有提供聲卡,所以決定了我們的聲卡只有使用筆記本的聲卡。

輸出模塊

在GNURadio中使用 [ctrl]+F 進行尋找聲卡模塊:Audio Sink。


Audio Sink.png

Sink 的類似于是輸出源。
我們雙擊查看詳細信息。


Audio Sink屬性.png

我們要修改他的采樣頻率為最高的頻率48KHz,這與我們的采樣率20MHz有很大的差別,所以我們要進行降采樣。
但是我們目前還用不到輸出模塊,選中模塊,按下鍵盤 [D] 使其處于禁用狀體。

輸入模塊

同樣的我們也要設(shè)置輸入模塊,我們使用的設(shè)備為 HackRF One,但是 GNURadio 是一種普適的工具。
同樣 [ctrl]+F 查找輸入模塊:osmocom source。

圖片.png

Source 類似于輸入源的意思,同樣我們進行屬性設(shè)置。


source 屬性.png

特別注意:RF Gain要設(shè)置為0。RF Gain 不但放大型號,而且還會放大噪聲。而且RF Gain只有兩個可以調(diào)節(jié)的檔位0或者14。所以一般情況我們并不會試著用RF Gain。
詳細信息:


圖片.png

如果不出意外的話,會出現(xiàn)一些錯誤,比如變量未定義。所以我們要開始定義變量。center_channel,if_gain,bb_gain

我們希望在運行中,有個類似滑動條的東西可以將這些參數(shù)進行自定義隨機調(diào)整。這個模塊叫做:slider
參數(shù)設(shè)置如圖:


slider.png

center_channel:并不是我們要找的 FM電臺,而是略小于我們要找的電臺,具體原因稍后會講述。
if_gain:中頻放大
bb_gain:基頻放大

第一次檢測

在實驗室中我們有類似示波器等儀器可以測量電流電壓,GNURadion也提供了類似的工具。
FFT SinK:查看頻率分布情況(頻域)
Scope Sink:示波器(時域)
我們先不進行任何設(shè)置,如下圖所示。

進行啟動


啟動.png

啟動后:


圖片.png

出現(xiàn)了一些問題:
FFT Plot 中坐標的中心是0,還有負頻率段,當然如果學過 DSP 就會覺得這個是正常情況。 頻率中心0即對應 0Hz直流,又對98H,center_channel 滑塊的內(nèi)容。如果我們對應的電臺是98MHz,那么會與0Hz的直流頻率相重疊,所以這就是為什么剛剛說的 center_channel 不是我們想要獲取電臺的頻率,我們應該將其進行過濾。我們真正的頻率(FM_channel)應該略高于center_channel。

解決問題

所以有個想法,將(FM_channel)在FFT時放置在 FFT Plot 的中間位置,這時候center_channel和0Hz直流分量像左移動,相對于 FM_channel 變?yōu)楦哳l。然后我們利用低通濾波器進行過濾。

利用 DSP的知識,時域相乘就是頻率卷積,頻域卷積,就會將 FM頻率進行移動。
那乘什么呢?于是我們相當余弦函數(shù),余弦函數(shù)(cos)FFT后的內(nèi)容是一條單一的直線,就相當于在cos頻率部分我們將98MHz內(nèi)容進行復制粘貼,為了讓0Hz處為我們的FM_channel,所以余弦函數(shù)(cos)的頻率為(center_channel-FM_channel)。
所以我們只要一個乘法就能完成任務(wù)。
乘法:[ctrl]+F:multiply
余弦信號:[ctrl]+F:signal source


cos配置.png

同樣我們需要添加一個滑塊(slider)
這事我們完整的圖片應該為:


第二次檢測.png

第二次檢測

檢測結(jié)果.png

和預期非常一致。說明 DSP 還是有用的。
接下來的想法就是低通濾波了

低通濾波器

因為我們是先采樣然后濾波,所以使用的是數(shù)字低通濾波器
低通濾波器:[ctrl]+F:low pass
同樣我們使用設(shè)置slider的方式進行設(shè)置參數(shù)。

低通.png

完整的圖為:


第三次檢測.png

第三次檢測

過程.png

調(diào)節(jié)后為:


調(diào)節(jié)后.png

不要忘記記錄參數(shù)。
width:500k
cutoff:100K
FM_channel:96.83M

解碼

這是最關(guān)鍵的一步之一:因為 FM 需要解調(diào),不能直接進入到聲卡中,所以我們需要一個解調(diào)模塊。
WBFM
設(shè)置如下圖


WBFM.png

我們還要控制聲卡的聲音,使用一個slider,進行調(diào)節(jié)。
完整如下圖。

完整圖片.png

途中有些參數(shù)有點小改動,并且加入了一個Rational Rasample

這就是最后的過程:對信號進行降頻操作。

降頻操作

進行計算頻率:
初始狀態(tài):采樣率為20MHz
目標Audio:48KHz
所以中間需要降低很多次。
在低通濾波的時候有個參數(shù),可以用來降低頻率我們可以使用:
decimation(降采樣)我們設(shè)置為40

低通.png

這里的降低采樣只能設(shè)置為整數(shù)。
20M降低為500KHz
我們需要另一個降采樣(非整數(shù))的模塊。
Rational Rasample

設(shè)置如下:

圖片.png

50KHz/25*24=480KHz
也就是能進入到我們的 解調(diào)模塊 中了。
解調(diào)模塊中也有個decimation(降采樣):10
480/10=48KHz
最后完成了輸出模塊的要求。

最后的最后

試試聲音怎么樣,不要忘記修改剛剛設(shè)置的參數(shù)。我嘗試的結(jié)果非常的成功。


圖片.png

最后的最后的最后

完整圖片.png

圖片.png

或許你只對這張圖感興趣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 數(shù)字音頻基礎(chǔ)知識# 1.1 聲波### 聲音始于空氣中的振動,這些振動一起推動鄰近的空氣分子,而輕微增加空氣壓...
    朱細細閱讀 18,884評論 0 25
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 聲明:作者翻譯論文僅為學習,如有侵權(quán)請...
    SnailTyan閱讀 5,496評論 1 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 描述 求兩個不超過200位的非負整數(shù)的和。 輸入 有兩行,每行是一個不超過200位的非負整數(shù),可能有多余的前導0。...
    tingshuo123閱讀 633評論 2 0
  • 2017年最大的收獲是重新拾起畫筆,開始自學畫畫。下面是從3月到8月里,最滿意的幾幅作品,作為我的年終總結(jié)...
    愛笑的雪球閱讀 529評論 1 3

友情鏈接更多精彩內(nèi)容