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