基于GNU Radio和USRP的認(rèn)知無線電平臺研究
X400 子板,它的接收范圍是 400M-500MHz,可以在 400M-500M 內(nèi)選定任意范圍進(jìn)行檢測,對所檢測頻段使用情況,能在可控制的時間內(nèi)記錄到文件中,并可通過圖形顯示出來。
4.2 能量檢測 FFT 方法
FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域。有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了。這就是很多信號分析采用 FFT 變換的原因。另外,F(xiàn)FT 可以將一個信號的頻譜提取出來,這在頻譜分析方面也是經(jīng)常用的。得到了信號的頻域變換后,就可以對其進(jìn)行模值運(yùn)算得出某頻率值下的幅度特性。
一個模擬信號,經(jīng)過 ADC 采樣之后,就變成了數(shù)字信號。采樣得到的數(shù)字信號,就可以做 FFT 變換了。N 個采樣點(diǎn),經(jīng)過 FFT 之后,就可以得到 N 個點(diǎn)的 FFT 結(jié)果。為了方便進(jìn)行 FFT 運(yùn)算,通常 N 取 2 的整數(shù)次方。假設(shè)采樣頻率為 Fs,信號頻率 F,采樣點(diǎn)數(shù)為 N。那么 FFT 之后結(jié)果就是一個為 N 點(diǎn)的復(fù)數(shù)。每一個點(diǎn)就對應(yīng)著一個頻率點(diǎn)。這個點(diǎn)的模值,就是該頻率值下的幅度特性。具體跟原始信號的幅度有什么關(guān)系呢?假設(shè)原始信號的峰值為 A,那么 FFT 的結(jié)果的每個點(diǎn)(除了第一個點(diǎn)直流分量之外)的模值就是 A 的 N/2 倍。而第一個點(diǎn)就是直流分量,它的模值就是直流分量的 N 倍。而每個點(diǎn)的相位,就是在該頻率下的信號的相位。第一個點(diǎn)表示直流分量(即 0Hz),而最后一個點(diǎn) N 的再下一個點(diǎn)(實(shí)際上這個點(diǎn)是不存在的,這里是假設(shè)的第 N+1 個點(diǎn),也可以看做是將第一個點(diǎn)分做兩半分,另一半移到最后)則表示采樣頻率 Fs,這中間被N-1 個點(diǎn)平均分成 N 等份,每個點(diǎn)的頻率依次增加。例如某點(diǎn) n 所表示的頻率為:Fn=(n-1)*Fs/N。由上面的公式可以看出,F(xiàn)n 所能分辨到頻率為為 Fs/N,如果采樣頻率Fs 為 1024Hz,采樣點(diǎn)數(shù)為 1024 點(diǎn),則可以分辨到 1Hz。1024Hz 的采樣率采樣 1024 點(diǎn),剛好是 1 秒,也就是說,采樣 1 秒時間的信號并做 FFT,則結(jié)果可以分析到 1Hz,如果采樣 2 秒時間的信號并做 FFT,則結(jié)果可以分析到 0.5Hz。如果要提高頻率分辨力,則必須增加采樣點(diǎn)數(shù),也即采樣時間。頻率分辨率和采樣時間是倒數(shù)關(guān)系。
假設(shè) FFT 之后某點(diǎn) n 用復(fù)數(shù) a+bi 表示,那么這個復(fù)數(shù)的模就是
,相位就是 Pn=atan2(b,a)。根據(jù)以上的結(jié)果,就可以計(jì)算出 n 點(diǎn)(n≠1,且 n<=N/2)對應(yīng)的信號的表達(dá)式為:An/(N/2)*cos(2*pi*Fn+Pn),即 2*An/N*cos(2*pi*Fn+Pn)。對于 n=1 點(diǎn)的信號,是直流分量,幅度即為 A1/N。
由于 FFT 結(jié)果的對稱性,通常我們只使用前半部分的結(jié)果,即小于采樣頻率一半的結(jié)果,即可以是前向 FFT 也可以是后向 FFT,前向、后向各一半結(jié)果。
由此可知:假設(shè)采樣頻率為 Fs,采樣點(diǎn)數(shù)為 N,做FFT 之后,某一點(diǎn) n(n 從 1 開始)表示的頻率為:Fn=(n-1)*Fs/N;該點(diǎn)的模值除以 N/2 就是對應(yīng)該頻率下的信號的幅度(對于直流信號是除以 N);該點(diǎn)的相位即是對應(yīng)該頻率下的信號的相位。相位的計(jì)算可用函數(shù) atan2(b,a)計(jì)算。atan2(b,a)是求坐標(biāo)為(a,b)點(diǎn)的角度值,范圍從-pi 到 pi。要精確到 xHz,則需要采樣長度為 1/x 秒的信號,并做 FFT。要提高頻率分辨率,就需要增加采樣點(diǎn)數(shù),這在一些實(shí)際的應(yīng)用中是不現(xiàn)實(shí)的,需要在較短的時間內(nèi)完成分析。解決這個問題的方法有頻率細(xì)分法,比較簡單的方法是采樣比較短時間的信號,然后在后面補(bǔ)充一定數(shù)量的 0,使其長度達(dá)到需要的點(diǎn)數(shù),再做 FFT,這在一定程度上能夠提高頻率分辨力。
4.3 能量檢測實(shí)現(xiàn)
4.3.1GNU Radio 的 USRP 初始化設(shè)置
需要搭建基于GNU Radio的FFT頻譜檢測器,我們就需要正確的初始化配置USRP,建立流圖,搭建起 FFT 運(yùn)算的軟件無線電結(jié)構(gòu)。
初始化配置 USRP,需要使用 GNU Radio 中的 usrp.py 模塊,這個模塊包含輸入輸出初始化設(shè)置、ADC 采樣速率、功率、增益、載頻等。基本上所有關(guān)于配置 USRP 的子函數(shù)都需要重載 usrp.py 來配置。具體見下表:
usrp.py函數(shù)是所有 GNU Radio 控制 USRP 的程序都要用到的初始化函數(shù),它們控制 usb 接口、fpga 程序、ADC、DAC、子板,跟硬件打交道的程序都可以從這個函數(shù)的子函數(shù)找到控制方法。
source_x()和 sink_x()則是 usrp.py 中最基本的子函數(shù),它們是流圖的開始或者結(jié)束,由它們我們可以初始化 USRP 為接受器或者發(fā)射器,而且一個 USRP 通過時分復(fù)用可以復(fù)用為雙工收發(fā)器。
按照表的函數(shù)應(yīng)用舉例,我們設(shè)置 USRP 為接收狀態(tài),nchan=2 這樣我們可以同時獲得兩個子板的信息,同時對 400M 和 2.4G 頻段進(jìn)行掃頻。其余設(shè)置均為默認(rèn)狀態(tài),由此可得知:
adc_rate= 64 MS/s
usrp_decim= 64
usrp_rate= adc_rate / usrp_decim = 1 MS/s
4.3.2 FFT 能量檢測流圖
由上一小節(jié) FFT 的原理,我們可以得出 FFT 計(jì)算結(jié)果的意義,可對其進(jìn)一步處理達(dá)到我們的需求。GNU Radio 自帶庫有 FFT 模塊,在設(shè)置好 USRP 并正確的建立流圖,然后將得到的結(jié)果通過計(jì)算途徑處理,最終得到我們需要的功能——大范圍的能量檢測。
因?yàn)?nbsp;USRP 帶寬的限制,一個時間內(nèi)前端只能檢測到 8MHz 的射頻信號如果要檢測大于 8MHz 帶寬的信號我們需要通過不斷的 RF 前端步進(jìn)調(diào)頻以達(dá)到檢測大范圍頻譜的目的,雖然檢測到的頻譜并不是實(shí)時的。USRP(或者程序)每個時刻對一段范圍的頻率進(jìn)行檢測,然后步進(jìn)調(diào)頻到下一段頻率,這樣就能掃頻掃過大段的頻率。
要是頻率調(diào)頻已經(jīng)完成步進(jìn)調(diào)頻,我們需要在每一個步進(jìn)時刻結(jié)束時——即已獲得這段頻率的數(shù)值時,發(fā)送一個調(diào)頻指令到 USRP。調(diào)頻控制由 gr.bin_statistics_f sink 程序?qū)崿F(xiàn),bin_statistics 在以下的函數(shù)解釋中有詳細(xì)解釋。
當(dāng)我們命令 USRP 的 RF 子板改變中心頻率時,我們必須等待 ADC 的采樣到達(dá) FFT處理器并判斷完是否屬于需要的中心頻率。在這個過程中需要經(jīng)過很多重的延時比如從FPGA,USB,計(jì)算延時。這樣我們必須在調(diào)節(jié)到下一步進(jìn)頻率時進(jìn)行延時,以保證上一步進(jìn)頻率的采樣能正確的被 FFT 處理器處理。
程序主要驅(qū)動部分由 bin_statistics sink 函數(shù)組成。整個流程如圖 4-3
bin_statistics主要控制 USRP 的調(diào)頻控制,并根據(jù)步進(jìn)頻率帶寬的大小決定延時時間即 FFT 處理器忽略掉 N 個向量(向量長度由計(jì)算決定)這里也可以詳細(xì)解釋,當(dāng)進(jìn)行完 FFT 處理后,bin_statistics 將處理后的信息組合成 message,并將此 message 插入message queue。message 的每個內(nèi)容由 FFT 后的每個最大頻率的向量組成。
每一步進(jìn)的延時需要計(jì)算得出,延時包括調(diào)頻延時和計(jì)算延時,其中調(diào)頻延時是最主要的延時。
調(diào)頻延時由 RF 前端的 PLL 到主板的時間再加上管道中排隊(duì)的時間,我們所用的RFX 系列延時差不多是 1ms。
調(diào)頻延時轉(zhuǎn)化為 FFT 計(jì)算時忽略的向量個數(shù)的計(jì)算公式是
tune_delay_passed_to_bin_statistics=
int(round(required_tune_delay_in_sec*usrp_rate/fft_size))
其中:
required_tune_delay_in_sec= 10e-3 ;usrp_rate = 1M (decimation =64);
fft_size= 256
可得出tune_delay_passed_to_bin_stats = 4 (FFT Frames)
這表示,我們延時 1ms 我們將跳過 4 個輸入的 FFT 向量個數(shù),來獲得真實(shí)的向量數(shù)據(jù)。延時時間還包括計(jì)算延時,我們需要收集處理 N 個 FFT 采樣,如果 DR=8 那將用時 128us,還應(yīng)該加上計(jì)算機(jī)處理這 N 個采樣的時間,這個需要根據(jù)實(shí)際計(jì)算機(jī)的處理能力通過實(shí)驗(yàn)測得。
本實(shí)驗(yàn)平臺設(shè)置步進(jìn)頻率為 3MHz,設(shè)置 3M 是為了能盡可能精確的對小范圍的頻率進(jìn)行能量測算,而我們通信時占用的頻寬也大概是 2M 多,加上半衰保護(hù),差不多即是 3M。而且步進(jìn)頻率 3M 可節(jié)省每一步進(jìn)的運(yùn)算時間,是個均衡的選擇。這樣 USRP及相關(guān)程序的初始化就完成了。
以下是完成 FFT 運(yùn)算的流圖,其搭建一個完整的軟件無線電結(jié)構(gòu),數(shù)據(jù)最終寫入message。流圖如下圖:
4.3.3 實(shí)現(xiàn)結(jié)果
總結(jié)如下,受制于 USB 總線的約束,USRP 不能檢測超過 8MHz 的帶寬(USRP 的USB2.0 最大數(shù)據(jù)傳輸速率為 32M Bytes/S,每個實(shí)采樣點(diǎn)占用 2 個 B