本期作者/0xc4se
GNU Radio介紹
GNU Radio是一款開源的軟件工具集,專注于軟件定義無線電(SDR)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)。該工具集支持多種SDR硬件平臺(tái),包括USRP、HackRF One和RTL-SDR等。用戶可以通過GNU Radio Companion構(gòu)建流程圖,使用不同的模塊實(shí)現(xiàn)信號處理、濾波、解調(diào)等功能。GNU Radio提供了豐富的信號處理庫,支持實(shí)時(shí)和離線操作,廣泛應(yīng)用于無線通信、雷達(dá)、無線電天文學(xué)等領(lǐng)域。其強(qiáng)大的社區(qū)支持和詳細(xì)的文檔使開發(fā)者能夠更好地使用這一工具,靈活、可定制地構(gòu)建和測試各種無線通信系統(tǒng)。
調(diào)制與信號處理流程
人類的可聽范圍為20 - 20000kHz。相對而言,這些頻率遠(yuǎn)低于FM無線電廣播頻率。因此,音頻波只能傳播很短的距離。廣播電臺(tái)想要遠(yuǎn)程傳輸聲音和音樂的音頻信號。那么電臺(tái)就需要將音頻信號中的信息傳輸?shù)礁哳l率的載波上。這些波可以比人們可聽見的波傳播得更遠(yuǎn)、更快。這個(gè)過程稱之為調(diào)制。調(diào)制有幾種不同的類型,我們經(jīng)常收聽的FM 廣播電臺(tái),使用的是頻率調(diào)制。
在軟件無線電(SDR)行業(yè)中,數(shù)字信號是以離散形式表示的信號,即信號的幅度、頻率和相位在時(shí)間上是離散的。這與模擬信號不同,模擬信號是連續(xù)的。數(shù)字信號的處理涉及將模擬信號轉(zhuǎn)換為數(shù)字形式,通過一系列離散的處理步驟對其進(jìn)行操作,最后將結(jié)果重新轉(zhuǎn)換回模擬信號。
以下是數(shù)字信號在軟件無線電行業(yè)中的處理步驟:
模數(shù)轉(zhuǎn)換(Analog-to-Digital Conversion,ADC)過程:模擬信號首先通過模數(shù)轉(zhuǎn)換器(ADC)轉(zhuǎn)換為數(shù)字信號。目的:將連續(xù)的模擬信號在時(shí)間和幅度上進(jìn)行離散化,以便計(jì)算機(jī)能夠處理。
數(shù)字信號處理(Digital Signal Processing,DSP)過程:數(shù)字信號經(jīng)過一系列數(shù)字信號處理算法,如濾波、混頻、解調(diào)等。目的:在數(shù)字域中對信號進(jìn)行操作和處理,以提取、增強(qiáng)或變換信號的特定特征。
數(shù)模轉(zhuǎn)換(Digital-to-Analog Conversion,DAC)過程:處理后的數(shù)字信號通過數(shù)模轉(zhuǎn)換器(DAC)轉(zhuǎn)換為模擬信號。目的:將數(shù)字信號還原為連續(xù)的模擬信號,以便在后續(xù)的模擬電路或設(shè)備中使用。
輸出階段過程:模擬信號經(jīng)過可能的放大器、濾波器等設(shè)備后,最終輸出到用戶的設(shè)備,如揚(yáng)聲器或顯示器。目的:將數(shù)字信號處理的結(jié)果轉(zhuǎn)換為可感知或可用的模擬信號。
在軟件無線電中,這些步驟通常在計(jì)算機(jī)上通過專用軟件(例如本小節(jié)中的GNU Radio)執(zhí)行。這種數(shù)字信號的處理方法使得系統(tǒng)更加靈活,能夠適應(yīng)不同的通信標(biāo)準(zhǔn)和應(yīng)用需求。
GNU Radio安裝
sudo apt-getinstall libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils cmake build-essential git clone git://github.com/EttusResearch/uhd.git cd~/code/udh/host sudo mkdirbuild sudo cmake ../ sudo make sudo ldconfig export LD_LIBRARY_PATH=/usr/local/lib sudo apt install cmake git g++ libboost-all-dev python-dev python-mako python-numpy python-wxgtk3.0python-sphinx python-cheetah swig libzmq3-dev libfftw3-dev libgsl-dev libcppunit-dev doxygen libcomedi-dev libqt4-opengl-dev python-qt4 libqwt-dev libsdl1.2-dev libusb-1.0-0-dev python-gtk2 python-lxml pkg-config python-sip-dev sudo apt-getinstall python3-pip git clone --recursive https://github.com/gnuradio/gnuradio.git cdgnuradio sudo mkdirbuild cdbuild sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../ sudo make sudo makeinstall sudo vim~/.barshrc export PATH=$PATH:/opt/gnuradio/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gnuradio/lib export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/gnuradio/lib/pkgconfig export PYTHONPATH=$PYTHONPATH:/opt/gnuradio/lib/python2.7/dist-packages
GNU Radio使用
第一個(gè)流程圖
打開終端運(yùn)行g(shù)nuradio_companion命令,會(huì)顯示如下界面,界面中有Options和Variable倆個(gè)塊。我們雙擊 Options 塊,我們可以通過編輯 Id 和 Title 來命名流程圖:
點(diǎn)擊file->save,輸入grc文件的名稱后保存GRC流程圖。
我們可以進(jìn)入保存grc的目錄下進(jìn)行查看,發(fā)現(xiàn)保存了一個(gè)grc文件和生成了一個(gè)python文件。其中g(shù)rc文件包含了在 GRC 中顯示流程圖的信息,python文件則包含實(shí)際的 Python 流程圖代碼。
返回gnuradio打開的grc文件中,鍵盤使用ctrl+f或者點(diǎn)擊菜單欄中的放大鏡按鈕可以進(jìn)行模塊搜索。這里我們分別搜索 Signal Source 、Throttle、QT GUI Frequency Sink 和 QT GUI Time Sink模板,并按照下圖順序?qū)⒚總€(gè)塊拖放到工作區(qū)中。隨后依次點(diǎn)擊上一個(gè)塊out口和下一個(gè)塊的in口,連接效果如下。
點(diǎn)擊Execute按鈕(菜單欄中綠色的三角按鈕)啟動(dòng)程序,我們可以看到如下的波形:
定義變量
我們搜索var,然后將Variable變量模塊拖入工作區(qū)中。并將其id命令為frequency。
雙擊Signal Source,修改Sample Rate的值為samp_rate變量,即可將定義的samp_rate=32k值賦值給Signal Source的。修改Frequency的值為frequency變量。
運(yùn)行時(shí)更新變量
GNU Radio 模塊庫自帶 QT GUI 模塊,這些模塊允許在運(yùn)行時(shí)對流程圖進(jìn)行交互和修改。QT GUI Range 模塊會(huì)創(chuàng)建一個(gè)滑塊,可用于運(yùn)行時(shí)更新變量。我們搜索range并將QT GUI Range塊拖入工作區(qū)中:
QT GUI Range是一個(gè)可變滑塊,使用該模塊需要設(shè)置 QT GUI Range默認(rèn)值。我們將ID修改為frequency,然后將Default Value設(shè)置為 0。這里的start和stop是滑塊的開始值和停止值。我們設(shè)置起始值為 -samp_rate/2 ,停止值設(shè)置為 samp_rate/2 。step是滑塊的步長。我們這里將步長設(shè)置為 100 Hz ,并點(diǎn)擊apply。
點(diǎn)擊運(yùn)行流程圖后,效果如下。我們可以滑動(dòng)按鈕來修改frequency的值。
QT GUI Chooser為變量創(chuàng)建選項(xiàng)下拉菜單。我們可以搜索Chooser,并將 QT GUI Chooser拖放到工作區(qū)中。
修改QT GUI Chooser的ID值后,點(diǎn)擊apply,發(fā)現(xiàn)報(bào)錯(cuò)。
這里是因?yàn)槲覀兦懊娴腝T GUI Range塊已經(jīng)引用了frequecy變量,導(dǎo)致沖突。
我們右擊QT GUI Range塊,點(diǎn)擊disable將其禁用,禁用該塊后顯示為灰色。
此時(shí)已經(jīng)顯示正常,我們此時(shí)點(diǎn)擊運(yùn)行流程圖。
QT GUI Chooser效果如下。
信號數(shù)據(jù)類型
塊上的每個(gè)輸入和輸出端口都將具有與之關(guān)聯(lián)的數(shù)據(jù)類型。數(shù)據(jù)類型由輸入和輸出端口的顏色標(biāo)識(shí),我們單擊 Help->Types可以進(jìn)行查看:
窗口顯示數(shù)據(jù)類型及其關(guān)聯(lián)的顏色,這些顏色對應(yīng)于 GRC 中模塊的輸入和輸出端口。
下面示例流程圖中使用 Complex Float 32 數(shù)據(jù)類型,該數(shù)據(jù)類型使用一對 32 位浮點(diǎn)數(shù)來表示復(fù)雜樣本的實(shí)部和虛部。
運(yùn)行流程圖顯示繪制在時(shí)域中的復(fù)數(shù)信號,其中信號 1 是實(shí)數(shù)分量,信號 2 是復(fù)數(shù)信號的虛數(shù)分量:
將所有數(shù)據(jù)類型轉(zhuǎn)換為 Float 后,我們重新運(yùn)行該流程圖:
Signal Source 模塊創(chuàng)建一個(gè)實(shí)際輸出,該輸出顯示為時(shí)域中的唯一信號:
數(shù)據(jù)類型轉(zhuǎn)換
搜索 Random Source 塊并將其拖動(dòng)到工作區(qū)中:
該塊默認(rèn)為 Integer 32 數(shù)據(jù)類型。雙擊該塊以打開屬性并將數(shù)據(jù)類型修改為 byte:
Random Source 和 Throttle 模塊之間的紅色箭頭表示需要修復(fù)的數(shù)據(jù)類型錯(cuò)誤。雙擊 Throttle 模塊,我們將數(shù)據(jù)類型更改為 byte:
QT GUI Time Sink 沒有 char 數(shù)據(jù)類型,我們選擇float類型。GNU Radio 模塊庫附帶了類型轉(zhuǎn)換器下列出的各種數(shù)據(jù)類型轉(zhuǎn)換器。搜索 Char To Float 模塊,將其拖動(dòng)到工作區(qū)中,然后將其連接到流程圖中。
現(xiàn)在所有紅色錯(cuò)誤都消失了,按播放按鈕啟動(dòng)流程圖。QT GUI Time Sink 現(xiàn)在將顯示來自隨機(jī)源塊的數(shù)據(jù),該塊隨機(jī)化為 0 和 1:
其他
以上為gnuradio幾個(gè)基礎(chǔ)模塊的使用方法,除了上面用到模塊的使用,常見的其他模塊使用效果如下:
信號波形生成器(Waveform Generators)
常數(shù)信源(Constant Source) - 生成固定幅度的常數(shù)信號。
噪聲信源(Noise Source) - 生成各種類型的噪聲信號,如高斯噪聲。
信號源(Signal Source) - 生成各種信號類型,如正弦波、方波等。
調(diào)制器(Modulators)
AM解調(diào)(AM Demod) - 解調(diào)幅度調(diào)制(AM)信號。
連續(xù)相位調(diào)制(Continuous Phase Modulation) - 進(jìn)行連續(xù)相位調(diào)制。
相位偏移調(diào)制與解調(diào)(PSK Mod/Demod) - 進(jìn)行相位偏移調(diào)制和解調(diào)。
高斯頻移鍵控調(diào)制與解調(diào)(GFSK Mod/Demod) - 高斯頻移鍵控調(diào)制和解調(diào)。
高斯最小頻移鍵控調(diào)制與解調(diào)(GMSK Mod/Demod) - 高斯最小頻移鍵控調(diào)制和解調(diào)。
正交振幅調(diào)制調(diào)制與解調(diào)(QAM Mod/Demod) - 進(jìn)行正交振幅調(diào)制和解調(diào)。
寬帶調(diào)頻接收(WBFM Receive) - 寬帶調(diào)頻調(diào)制的接收端。
窄帶調(diào)頻接收(NBFM Receive) - 窄帶調(diào)頻調(diào)制的接收端。
界面(GUI)
星座圖(Constellation Sink) - 可視化星座圖。
頻域圖(Frequency Sink) - 顯示信號頻譜的頻域圖。
時(shí)域圖(Time Sink) - 顯示信號的時(shí)域波形圖。
直方圖(Histogram Sink) - 顯示信號的直方圖。
瀑布圖(Waterfall Sink) - 顯示頻譜隨時(shí)間變化的瀑布圖。
數(shù)學(xué)運(yùn)算(Math Operators)
絕對值(Abs)
相加(Add)
復(fù)數(shù)共軛(Complex Conjugate)
相除(Divide)
積分(Integrate)
取對數(shù)(Log10)
相乘(Multiply)
均方根(RMS)
信道模型
衰落信道模型(Fading Model) - 模擬信號在信道中的衰落效應(yīng)。
動(dòng)態(tài)信道模型(Dynamic Channel Model) - 模擬動(dòng)態(tài)變化的信道特性。
頻率選擇性衰落模型(Frequency Selective Fading Model) - 模擬頻率選擇性衰落的信道。
濾波器(Filters)
帶通/帶阻濾波器(Band Pass / Reject Filter)
低通/高通濾波器(Low / High Pass Filter)
無限沖激響應(yīng)濾波器(IIR Filter)
均方根余弦濾波器(Root Raised Cosine Filter)
抽取有限沖激響應(yīng)濾波器(Decimating FIR Filter)
傅里葉分析
快速傅里葉變換(FFT) - 執(zhí)行快速傅里葉變換以分析信號的頻譜。
克斯塔斯環(huán)(Costas Loop) - 一種相位同步技術(shù),通常用于解調(diào)PSK調(diào)制的信號。
實(shí)驗(yàn):制作一個(gè)FM receiver流程圖
該實(shí)驗(yàn)我們使用osmocom_source 模塊來接收FM信號,設(shè)置中心頻率center_freq=97.9MHz,設(shè)置了一個(gè)滑塊channel_freq,默認(rèn)頻率為97.9MHz。這里需要注意,channel_freq是收聽廣播的頻率,center_freq是接收信號的中心頻率。其中采樣率設(shè)置為變量samp_rate=10MHz(采樣率決定了接收信號的范圍,以中心頻率為中心左右各5MHz。),Ch0:Frequency (Hz)設(shè)置為變量center_freq=97.9MHz。用一個(gè)Signal Source產(chǎn)生一個(gè)頻率為center_freq-channel_freq的余弦波來與osmocom Source模塊的輸出相乘,進(jìn)行頻譜搬移。流程圖中低通濾波器(低通濾波器就是只允許頻率低于截止頻率的波通過的濾波器,高于截止頻率的波會(huì)被直接消除)的截止頻率設(shè)置為75kHz,過渡帶寬為25kHz,Decimation抽取值為int(samp_rate/channel_width)=50,經(jīng)過此模塊后的采樣率由10MHz變?yōu)榱?00kHz。使用Rational Resampler模塊來繼續(xù)調(diào)整采樣率,以此來滿足后續(xù)Audio Sink模塊需要的48kHz做準(zhǔn)備。經(jīng)過Rational Resampler模塊作用,采樣率變化過程為200k*12/5=480kHz。使用WBFM接收模塊來進(jìn)行WBFM解調(diào),其中Audio Decimation為10,表示將采樣率480kHz要變?yōu)?80k/10=48kHz,以此來適應(yīng)Audio Sink所要求的48kHz。Quadrature Rate表示的是WBFM Receive模塊所期望的輸入采樣率為480kHz。
點(diǎn)擊運(yùn)行后,即可收聽97.9MHz頻率的波段。這里雖然可以收聽到FM電臺(tái),但是聲音一樣有斷續(xù),左下角控制終端一直輸出aUaU...。經(jīng)過查閱相關(guān)資料后發(fā)現(xiàn)是虛擬機(jī)音頻欠載的原因,目前該問題未解決,切換至windows實(shí)體機(jī)則不會(huì)出現(xiàn)該問題。該流程圖后續(xù)優(yōu)化將frequency設(shè)置為滑塊并設(shè)置初始和結(jié)束值,便可以很方便的修改收聽頻率。
總結(jié)
這一小節(jié),我們簡單使用了GNU Radio軟件,我們通過GNU Radio Companion(GRC)創(chuàng)建了簡單的流程圖,展示了信號生成、處理和輸出的流程。最后通過制作一個(gè)FM receiver來加深對GNU Radio的了解。
審核編輯:湯梓紅
-
無線通信
+關(guān)注
關(guān)注
58文章
4755瀏覽量
145221 -
軟件無線電
+關(guān)注
關(guān)注
10文章
197瀏覽量
29204 -
開源
+關(guān)注
關(guān)注
3文章
3690瀏覽量
43839 -
GNU
+關(guān)注
關(guān)注
0文章
143瀏覽量
17880
原文標(biāo)題:軟件無線電安全之GNU Radio基礎(chǔ) -上
文章出處:【微信號:蛇矛實(shí)驗(yàn)室,微信公眾號:蛇矛實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Software Defined Radio Handbook,軟件無線電手冊
深入學(xué)習(xí)GNU Radio你需要知道些什么
開源軟件無線電(GNU Radio)基礎(chǔ)教程
了解GNU Radio
軟件無線電之SWR基礎(chǔ)知識(shí)及實(shí)際應(yīng)用
軟件無線電基礎(chǔ)知識(shí)概述
如何在Linux下搭建GNU Radio平臺(tái)及它的應(yīng)用分析

學(xué)習(xí)GNU Radio需要應(yīng)該如何準(zhǔn)備

GNU Radio開源軟件無線電平臺(tái)的簡介

DIY無線電遙控器基礎(chǔ)知識(shí)

軟件定義無線電(SDR)基礎(chǔ)知識(shí)

評論