基于GNU Radio和USRP的認(rèn)知無(wú)線電平臺(tái)研究
能和計(jì)算機(jī)硬件實(shí)現(xiàn)等多方面的內(nèi)容,提出的認(rèn)知模型也能較好地反映認(rèn)知無(wú)線電的概念和內(nèi)涵。
2.4 本章小結(jié)
結(jié)合無(wú)線電平臺(tái)的發(fā)展背景介紹軟件無(wú)線電和認(rèn)知無(wú)線電等方面背景理論知識(shí)。介紹了基于軟件無(wú)線電的認(rèn)知無(wú)線電平臺(tái)的基本結(jié)構(gòu)和原理。
第三章 基于 GNU Radio 和 USRP 的認(rèn)知無(wú)線電平臺(tái)
3.1 選擇 GNU Radio 和 USRP 作為實(shí)驗(yàn)平臺(tái)的原因
廣義上的軟件無(wú)線電分為三類:
(1)將多種不同制式的設(shè)備集成在一起,例如 GSM-CDMA 雙模手機(jī)。這方式只能在預(yù)置的幾種制式下切換,要增加對(duì)新的制式的支持則意味著集成更多的電路,重配置能力十分有限。
(2)基于現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)和數(shù)字信號(hào)處理器(DSP),這類可編程硬件,重配置的能力得到了很大提高。但是用于 FPGA 的 VERILOG、VHDL 等語(yǔ)言以及DSP 的匯編語(yǔ)言都是針對(duì)特定廠商的產(chǎn)品,使得這種方式下的軟件過(guò)分依賴于具體的硬件,可移植性較差。此外,對(duì)廣大技術(shù)人員來(lái)說(shuō), FPGA 和 DSP 開(kāi)發(fā)的門(mén)檻依然較高,開(kāi)發(fā)過(guò)程也相對(duì)比較繁瑣。
(3)第三類軟件無(wú)線電設(shè)備采用通用硬件(例如:商用服務(wù)器、普通 PC 以及嵌入式系統(tǒng))作為信號(hào)處理軟件的平臺(tái),具有以下幾方面的優(yōu)勢(shì): 純軟件的信號(hào)處理具有很大的靈活性; 可采用通用的高級(jí)語(yǔ)言(如 C/C++)進(jìn)行軟件開(kāi)發(fā),擴(kuò)展性和可移植性強(qiáng),開(kāi)發(fā)周期短;基于通用硬件的平臺(tái),成本較低,并可享受計(jì)算機(jī)技術(shù)進(jìn)步帶來(lái)的各種優(yōu)勢(shì)[13]。
GNURadio 是一個(gè)開(kāi)源的可以構(gòu)建軟件無(wú)線電平臺(tái)的軟件包。它是由 Eric Blossom發(fā)起的、完全開(kāi)放的軟件無(wú)線電項(xiàng)目,旨在鼓勵(lì)全球技術(shù)人員在這一領(lǐng)域協(xié)作與創(chuàng)新,目前已經(jīng)具有一定的影響力。GNU Radio 主要基于 Linux 操作系統(tǒng), 也可以移植到其他操作系統(tǒng)上, 采用 C++結(jié)合 Python 腳本語(yǔ)言進(jìn)行編程,其代碼完全開(kāi)放[18]。
USRP,即 Universal Software RadioPeripheral 通用軟件無(wú)線電平臺(tái),是 Matt Ettus的杰作,它是一個(gè)開(kāi)源的低價(jià)格的專門(mén)為 GNU Radio 設(shè)計(jì)的硬件平臺(tái)。USRP 是一個(gè)非常靈活的 USB 設(shè)備,它把 PC 連接到 RF 世界,可以在 0-5.9G 載頻上實(shí)現(xiàn)最高 16M 的帶寬信號(hào)收發(fā)。[19]
基于 GNU Radio 和 USRP 的軟件無(wú)線電平臺(tái)正是屬于第三類的軟件無(wú)線電系統(tǒng),它除了具有第三類軟件無(wú)線電系統(tǒng)的優(yōu)點(diǎn)外,還具有如下優(yōu)勢(shì):
(1)成本較低。軟件免費(fèi),USRP 的價(jià)格為 700 美元,相當(dāng)于一臺(tái) PC 的價(jià)格;帶寬可滿足目前多數(shù)音視頻廣播和無(wú)線通信制式的要求, 支持雙工和多天線應(yīng)用。
(2)技術(shù)門(mén)檻較低, 具有一定編程經(jīng)驗(yàn)和 Linux 使用經(jīng)驗(yàn)的用戶可在較短時(shí)間內(nèi)掌握其配置、使用和開(kāi)發(fā)。
(3)開(kāi)源軟件,獲得來(lái)自全世界眾多 GNU RADIO 擁護(hù)者以及 Eric Blossom 和Matt Ettu(分別是 GNU RADIO 和 USRP 的發(fā)明者)本人的技術(shù)支持[12]。
GNU Radios 和USRP 的功能是將信息和無(wú)線射頻信號(hào)互相轉(zhuǎn)化,其過(guò)程以及各部分功能如圖 3-1,信息流圖。
3.2 GNU Radio 軟件無(wú)線電介紹
3.2.1 GNU Radio 概述
在當(dāng)今無(wú)線電領(lǐng)域中,由 Eric Blossom 發(fā)起的、完全開(kāi)放的軟件無(wú)線電項(xiàng)目 GNURadio 倍受關(guān)注。GNU Radio 是一個(gè)開(kāi)源、免費(fèi)的可以構(gòu)建軟件無(wú)線電平臺(tái)的軟件包。這是一種能運(yùn)行于普通 PC 上的開(kāi)放的軟件無(wú)線電平臺(tái),其軟件代碼完全公開(kāi)。它具備智能處理信號(hào)、擁有可重配置無(wú)線電硬件設(shè)備的特點(diǎn)。基于該平臺(tái),用戶能夠以軟件編程的方式靈活地構(gòu)建各種無(wú)線應(yīng)用,進(jìn)而很好地實(shí)現(xiàn)認(rèn)知無(wú)線電的認(rèn)知任務(wù)[13]。
GNURadio 旨在鼓勵(lì)全球技術(shù)人員在這一領(lǐng)域協(xié)作與創(chuàng)新,目前已經(jīng)具有一定的影響力。GNU Radio 可以被理解為開(kāi)源軟件的自由精神在無(wú)線領(lǐng)域的延伸,開(kāi)放性和低成本是其最大的特點(diǎn)。低成本使得技術(shù)人員以及資金不那么充裕的機(jī)構(gòu)可以像購(gòu)買 PC 機(jī)一樣擁有一套能自由進(jìn)入頻譜空間的軟硬件系統(tǒng),從而為更廣泛的技術(shù)創(chuàng)新打下基礎(chǔ)。在 GNU Radio 的郵件討論組中每天都有來(lái)自世界各地的用戶對(duì)各種相關(guān)技術(shù)問(wèn)題的討論,這些用戶包括學(xué)生、大學(xué)教師、軟硬件工程師、無(wú)線工程師、業(yè)余無(wú)線電愛(ài)好者,正是這些人推動(dòng)了新技術(shù)的發(fā)展進(jìn)步。
GNURadio 的開(kāi)放特性也是其具有廣泛吸引力的重要因素,同時(shí)也是其生命力的源泉。由于代碼和技術(shù)資料完全開(kāi)放,人們可以了解到其運(yùn)作的所有細(xì)節(jié),并可自由地對(duì)其進(jìn)行修改和開(kāi)發(fā)。在這種開(kāi)放的氛圍之下,人們?nèi)〉玫闹R(shí)、成果可以得到充分的交流共享,更有益于創(chuàng)新。
3.2.2 GNU Radio 的軟件結(jié)構(gòu)
GNURadio 提供一個(gè)信號(hào)處理模塊的庫(kù),這個(gè)庫(kù)包含多種調(diào)制模式(GMSK、 PSK、QAM、OFDM 等),多種糾錯(cuò)編碼(Reed-Solomon、Viterbi、Turbo Codes 等),多種信號(hào)處理結(jié)構(gòu)(任意濾波器、FFT、量化器等),并且有個(gè)機(jī)制可以把單個(gè)的處理模塊連接在一起形成一個(gè)系統(tǒng)。編程者通過(guò)建立一個(gè)流向圖(flow graph)就能搭建成一個(gè)無(wú)線電系統(tǒng)。
GNURadio 的編程基于 Python 腳本語(yǔ)言和 C++的混合方式。C++由于具有較高的執(zhí)行效率,被用于編寫(xiě)各種信號(hào)處理模塊,如:濾波器、FFT 變換、調(diào)制/解調(diào)器、信道編譯碼模塊等,GNU Radio 中稱這種模塊為 block。GNU Radio 提供了超過(guò) 100 個(gè)的信號(hào)處理塊,并且擴(kuò)展新的處理模塊也是非常容易的。
Python是一種新型的腳本語(yǔ)言,具有無(wú)須編譯、語(yǔ)法簡(jiǎn)單以及完全面向?qū)ο蟮奶攸c(diǎn),因此被用來(lái)編寫(xiě)連接各個(gè) block 成為完整的信號(hào)處理流程的腳本,GNU Radio 中稱其為flow graph 流向圖。這是一個(gè)相當(dāng)強(qiáng)大的語(yǔ)言,新的 libraries 和功能經(jīng)常被加進(jìn)來(lái)。在某種程度上看,GNU Radio 用一個(gè)實(shí)時(shí)有效的信號(hào)處理庫(kù)來(lái)擴(kuò)展 Python。結(jié)合這些庫(kù),我們將擁有大量的功能。比如說(shuō),結(jié)合 GNU Radio 和 SCIPY(Python 科學(xué)計(jì)算庫(kù)),可以實(shí)時(shí)記錄 RF 信號(hào),并且可以離線做大量的數(shù)學(xué)操作,保存統(tǒng)計(jì)數(shù)字到一個(gè)數(shù)據(jù)庫(kù)當(dāng)中,等等。結(jié)合這些庫(kù),不用使用 MATLAT 這樣的軟件都可以實(shí)現(xiàn)了。
編程者通過(guò)建立一個(gè)流向圖(flow graph),如下圖 3.1 所示,就能搭建一個(gè)無(wú)線電系統(tǒng)。形象地說(shuō),flow graph 就像一塊電路板,在 flow graph 基礎(chǔ)上的 blocks 就如電路板上的電路模塊,而我們需要做的就是如何將這些模塊很好地連接起來(lái)。
如上圖所示,信號(hào)數(shù)據(jù)流不停的從信號(hào)處理模塊的輸入端口流入,再?gòu)南鄳?yīng)信號(hào)處理模塊的輸出端口流出。信號(hào)處理塊 (blocks)的屬性包括輸入和輸出的端口數(shù)以及流過(guò)端口的數(shù)據(jù)的類型,經(jīng)常使用的數(shù)據(jù)流的類型是短整型(short),浮點(diǎn)型(float),和復(fù)數(shù)(complex)類型。一些處理模塊僅僅有輸入端口或者輸出端口,它們分別成為信號(hào)源(data source)和信號(hào)接收器(data sink)。有的信號(hào)源從文件或者 ADC 讀入數(shù)據(jù),信號(hào)接收器把數(shù)據(jù)寫(xiě)入文件或者 DAC、PC 的多媒體接口。
信號(hào)處理模塊不僅能處理輸入和輸出的采樣速率是整數(shù)倍關(guān)系的同步模塊,也能處理異步模塊。同步模塊通常繼承自 gr_sync_block(輸入輸出 1:1 的采樣比)或者gr_sync_interpolator (1:N)或者 gr_sync_decimator (N:1)。異步模塊通常直接繼承自 gr模塊。當(dāng)模塊已經(jīng)實(shí)現(xiàn),Python 通過(guò)把各個(gè)模塊的輸入輸出連接在一起形成信號(hào)流圖,在 main class 上把它們連接起來(lái),這樣即可運(yùn)行了。
在用戶用 block 和 graph 構(gòu)造的應(yīng)用程序下面是 GNU Radio 的運(yùn)行支持環(huán)境,主要包括緩存管理、線程調(diào)度以及硬件驅(qū)動(dòng)。GNU Radio 中巧妙地設(shè)計(jì)了一套零拷貝循環(huán)緩存機(jī)制,保證數(shù)據(jù)在 block 之間高效的流動(dòng)。
在運(yùn)行著的 GNU Radio 實(shí)例中,GNU Radio 通過(guò)其特有的線程調(diào)度控制模塊和模塊之間的數(shù)據(jù)流采樣速率。除此之外還需要 forecast()的輔助,它由編程者告訴線程調(diào)度一個(gè)模塊需要多少種輸入采樣速率來(lái)產(chǎn)生需要數(shù)量的輸出采樣速率。
實(shí)際信號(hào)處理是在函數(shù) general_work()或者 resp.work()中實(shí)現(xiàn)。這些函數(shù)被線程調(diào)度調(diào)用并被賦予若干個(gè)輸入采樣速率,然后進(jìn)行信號(hào)處理并返回輸入采樣處理量和輸出采樣的產(chǎn)生量。
GNURadio 也處理數(shù)據(jù)的緩存。信號(hào)處理模塊通常以它們被輸入的速率來(lái)處理,但有時(shí)候因?yàn)?CPU 的處理速率或者其它因素,數(shù)據(jù)處理的速度不夠快,就需要緩存(buffer)來(lái)緩沖。這就要求編程者要注意:當(dāng)數(shù)據(jù)傳送的速率大于處理速度時(shí),有些緩存有可能會(huì)溢出并導(dǎo)致數(shù)據(jù)丟失;而當(dāng)數(shù)據(jù)傳送速率小于處理速度時(shí),緩存經(jīng)常是空的,有可能會(huì)產(chǎn)生脈沖。