測試USRP發送接收的時候完整的程式在benchmark_tx.py 和 benchmark_rx.py裡面。其中調用了很多外面的分支如transmit_path.py.exe和 ofdm.py等。
在USRP發送端,執行的是benchmark_tx.py程式,在該程式裡定義了發送資料包的相關參數,包括USRP發送頻率、增益、天線、時鐘源等,通過調用send_pkt函數來發送資料包。在程式中調用transmit_path和uhd_transmitter函數,它們分别定義在transmit_path.py和uhd_interface.py子產品。調用ofdm_mod函數進行OFDM調制,然後将生成的基帶調制信号傳送給uhd_transmitter函數,即USRP射頻子產品,每成功發送一個資料包,螢幕上會輸出一個‘.’。
在USRP接收端,執行的是benchmark_rx.py程式,在該程式中定義了接收資料包的相關參數,包括USRP接收頻率、增益、天線、時鐘源等,定義了rx_callback函數,當接收到資料包就會觸發該函數,每調用一次rx_callback函數,變量n_rcvd加1;再通過CRC檢驗收到的資料包,如果無誤則變量n_right加1。在程式中調用receive_path和uhd_receiver函數,它們分别定義在receive_path.py和uhd_interface.py子產品。調用ofdm_demod函數進行相應的OFDM解調,資料包接收成功後,會顯示接收端接收情況,在螢幕上輸出目前資料包的編号(pktno)、已接收到的資料包的數量(n_rcvd)和其中正确的資料包的數量(n_right)。
(在gnuradio3.4中确實有文中的例子,而且也在相應的目錄下,在gnuradio3.7.1中,基于GMSK的是在/usr/local/share/gnuradio/examples/digital/narrowband目錄下,基于OFDM的是在/usr/local/share/gnuradio/examples/digital/ofdm目錄下,本文講的應該是在3.4下的,但看了3.7的感覺大同小異)
OFDM Tunnel是GNU Radio中很經典的例子。Tunnel有兩個,一個是基于GMSK 調 制 的 (gnuradio-examples\python\digital) , 另 一 個 基 于 OFDM 調 制 的 (gnuradio-examples\python\ofdm)。它們都由實體層和MAC層構成,提供一個虛 拟的Ethernet接口,使得基于IP的各種應用程式都可以加載在這個tunnel 上面, 它的主要作用是負責資料的傳輸。我們主要研究後者。因為MIMO/OFDM 在目前最 新一代的通信系統中,幾乎是必選的兩個關鍵技術,是以很多做實體層研發的GNU Radio使用者都會從這兩個例子開始着手。
系統框圖和MAC幀的構成
下圖是Tunnel的系統框圖。Tunnel的實體層由發射機,接收機和一個載波偵 聽(sensing probe)三部分構成,完成由資訊比特到基帶波形之間的轉換,以 及通過能量檢測判斷目前信道是否空閑。MAC 層是一個基于CSMA的簡單的MAC。 MAC 層與PHY 層之間傳遞的是一個在IP包的基礎上加了一些標頭和包尾的資料 包。
了解了Tunnel的系統框圖,我們來看一下MAC幀的結構和資料打包過程。圖2 說明了一個IP資料包是如何打包成MAC資料包的。
首先,IP包被加上了4位元組的校驗比特,算法是CRC32。然後資料部分,加上 CRC比特和尾比特(X55),都被白化處理,使得資料具有随機均勻分布的特性。 最後,加上一個4位元組的標頭。標頭包含兩個資訊:白化參數4 比特和資料包長 度12比特。標頭采用了重複發送的方法,以增加可靠性。到此,一個完整的MAC 資料包就包裝完成了。
OFDM Tunnel 發射部分解讀
下面以ofdm tunnel為例來解讀一下實體層。Ofdm tunnel的代碼除了在 gnuradio-examples\python\ofdm 目 錄 下 以 外 , 還 有 一 些 在 gnuradiocore\src\python\gnuradio\blks2impl目錄下。
先來看發射機,如圖3所示。在transmit_path.py中,語句 self.connect(self.ofdm_tx,self.amp,self)
說明其中包含兩個子產品,ofdm_tx是一個ofdm_mod類,amp是一個乘法器。 進入ofdm_mod類看一下,其代碼在檔案ofdm.py中。Ofdm_mod中,資料包首
先經過一個send_pkt函數,完成MAC包的打包過程。 send_pkt(self,payload='',eof=False)
然後MAC包被放進一個隊列 self._pkt_input.msgq().insert_tail(msg)
後面的ofdm_mapper_bcv子產品從隊列中取出資料包,根據OFDM調制的參數映 射成一個個OFDM symbol,再送到後續子產品,添加preamble,IFFT變換,添加cyclic prefix,最後調整一下幅度,發送出去。這裡想特别提一下的是,在ofdm_mapper 之後是流圖的形式,在這之前是通過一個message queue與MAC層聯系在一起。這 種連接配接方式使得“異步的”MAC層資料(而且資料包長不定),跟與系統時鐘“同 步的”實體層連接配接在一起。這種連接配接方式是一個很好的例子,值得參考。
OFDM Tunnel 接收部分解讀
接收機部分如圖4所示。receive_path.py包含了ofdm_demod和probe兩個模 塊。Ofdm_demod顯然就是ofdm接收機部分。而probe是一個信号檢測子產品,當usrp 收到的信号幅度大于門限時,就認為無線信道已經被其他使用者占用。Ofdm_demod類的代碼在檔案ofdm.py中,主要分成同步子產品(ofdm_receiver),解調子產品 (ofdm_frame_sink),和MAC幀拆包部分。與發射部分類似,實體層與MAC層也是 通過一個隊列self._rcvd_pktq連接配接在一起的。Ofdm_receiver部分比較複雜,是 用python寫的,完成了幀同步,頻偏估計,頻偏糾正,FFT的功能。ofdm_frame_sink是一個C寫成的子產品,完成了從調制符号到比特的解映射過程。
下面就詳細介紹一下接收解調框圖中各個子產品的具體作用。
1)OFDM Receiver 部分。Filter(gr_fft_filter_ccc.cc)子產品完成對 USRP 接收信号的比對濾波功能;sync(gr_ofdm_sync_pn.py)子產品的主要功能是完成 接收符号的視窗比對,比對成功時發送比對成功标志給 sampler 子產品;Nco (gr_frequency_modulator_fc.cc)子產品完成細頻偏糾正功能,相當于鎖相環 PLL;Sig_mix(gr_multiply_cc.cc)子產品對接收到的 OFDM 符号進行處理(将輸 入符号相乘後輸出),然後送給 sampler 子產品;sampler(gr_ofdm_sampler.cc)
子產品根據 sync 子產品的比對标志信号尋找 preamble,将 preamble 和 data 分離, 并給出二者的邊界标志,然後把每個幀前面的循環字首(Cycle Prefix)去除, 最後将 OFDM 符号送給 fft 子產品,同時發送幀時序信号(Frame timing signal) 給 Frame acquisition 子產品;fft(gr_fft_vcc.cc)子產品對接收到的資料進行 fft 變換後輸出給 Frame acquisition 子產品(當檢視 gr_fft_vcc.cc 時,你會發 現 該 模 塊 并 沒 有 做 實 際 的 fft 變 換 , 而 真 正 的 fft 和 ifft 變 換 在 gr_fft_vcc_fftw.cc 中進行);Frame acquisition(gr_ofdm_frame_acquisition)子產品接收來自 FFT 的星座映射點向量,使用已知的 pn 碼和接收到的 pn 碼序列進 行比較得到信道增益,然後使用的到的增益修正其後的資料幀,進行相關和均衡。
2)ofdm_frame_sink(解調)子產品。該子產品接收 OFDM 符号,把他們接映射 成 0、1 比特流資料,再将這些比特流打包發送到接收消息序列,完成從調制的 OFDM 信号到實際發送比特資料的解映射過程。
3)MAC 幀拆包部分。主要功能是對解映射後的資料(還是幀結構的)進行幀 拆包,最終獲得實際的有用資料資訊。
開發和調試方法
整個ofdm tunnel 的實體層還是比較簡單的。它模仿了802.11 的實體層, 在不定長的burst 前面添加一個定長的preamble,依靠這個preamble 完成時間 同步和頻率同步。但它沒有信道編碼,是以抗噪聲性能較差。
gnuradio-examples\python\ofdm 目錄下,除了tunnel 調用的函數外,還
有許多其他的函數。這些函數都是程式的開發過程中需要用到的,它們教會了我 們如何一步步的進行程式開發。特别是對于利用GNU Radio 做實體層研發的人來 說,是很好的參考。下面簡單說明一下。
ofdm_mod_demod_test.py——用于實體層收發子產品的仿真測試。
benchmark_ofdm.py——加上MAC 層以後,做收發的仿真測試。
benchmark_ofdm_tx.py,benchmark_ofdm_rx.py——加上USRP 之後,做單 向收發的測試。分别測試了連續的資料包傳輸,和不連續的突發資料包傳輸。
當單向傳輸沒有問題之後,就可以實驗雙向的傳輸了:tunnel.py。
另外,還有一些matlab程式,幫助調試程式。當我們把log标志設為True時, 就會産生很多.dat檔案。這些檔案把各個block的輸出都記錄下來:同步之前, 頻率同步之後,FFT之後,解映射之後等等。然後用Matlab程式一一檢查,就可 以發現究竟哪一步出了問題。
總結這個例子的開發方法,要建立一個自定義的無線連接配接程式,
第一步:用Matlab寫一個實體層收發程式,設計各個功能子產品,确定參數等。
第二步:用GNU Radio寫一個不包括USRP 的收發程式,與Matlab程式一緻, 友善把GNU Radio中的資料導入Matlab 中調試。
第三步:當實體層沒有問題之後,再添加MAC層。
第四步:加入USRP。先調試單向通信,再調試雙向的。
GNURadio預設提供的OFDM調制解調子產品見下面的清單。
- OFDM Carrier Allocator / OFDM載波配置設定器
- 由複數值建立頻域的OFDM符号,添加導頻。
- 該塊将複雜的标量調制符号流轉換為向量,該向量是OFDM發射機中的IFFT的輸入。 它還支援将導頻符号放置在載波上的可能性。
- 可以自由配置設定載波,如果未配置設定載波,則将其設定為零。 這允許進行OFDMA樣式的載波配置設定。
- OFDM Channel Estimation / OFDM信道估計
- Estimate channel and coarse frequency offset for OFDM from preambles
- 輸入:OFDM符号(在頻域中)。 期望前一個(或兩個)符号是同步符号,其用于估計粗略頻率偏移和初始均衡器抽頭(這些符号從流中移除)。 以下n_data_symbols通過未修改傳遞(實際均衡必須在其他地方完成)。 輸出:資料符号,沒有同步符号。 通過的第一個資料符号有兩個标簽:'ofdm_sync_carr_offset'(整數),粗略頻率偏移量作為載波數量,'ofdm_sync_eq_taps'(複矢量)。 附加到同步符号的任何标記都附加到第一個資料符号。 所有其他标記按預期傳播。
- OFDM Cyclic Prefixer / OFDM循環字首
- Adds a cyclic prefix and performs pulse shaping on OFDM symbols.
- 輸入:OFDM符号(在時域中,即在IFFT之後)。 可選地,可以處理整個幀。 在這種情況下,必須指定len_tag_key,其儲存标記的密鑰,該密鑰表示幀中有多少OFDM符号。 輸出:(标量)複數符号流,包括循環字首和脈沖整形。 注意:如果處理完整幀,并且rolloff_len大于零,則最後的OFDM符号後面跟着脈沖整形的延遲線。
- 脈沖形狀是時域中的升餘弦.
- OFDM Demod / OFDM解調
- OFDM Frame Acquisition / OFDM幀采集
- take a vector of complex constellation points in from an FFT and performs a correlation and equalization.
- OFDM Frame Equalizer / OFDM幀均衡器
- OFDM frame equalizer.
- 在标記的OFDM幀上執行一維或二維的均衡。
- 這樣做有兩件事:首先,它消除了粗略的載波偏移。 如果在具有鍵'ofdm_sync_carr_offset'的第一項上找到标簽,則将其解釋為載波數量的粗略頻率偏移。 接下來,它在标記的OFDM幀上執行一維或二維的均衡。 實際的均衡是由塊外的ofdm_frame_equalizer對象完成的。
- OFDM Insert Preamble / OFDM插入前同步碼
- insert "pre-modulated" preamble symbols before each payload.
- OFDM Mod / OFDM調制
- OFDM Receiver / OFDM接收機
- OFDM Sampler / OFDM 采樣器
- OFDM Serializer / OFDM 序列化
- Serializes complex modulations symbols from OFDM sub-carriers.
- OFDM Sync PN /
- Schmidl & Cox OFDM synch.
- OFDM Transmitter / OFDM 發射機
下圖是ofdm_loopback.grc,實作了一個簡單的OFDM回環。
更詳細的示例可以參見/usr/local/share/gnuradio/examples/digital/ofdm/裡的其它框圖。
---------------------
作者:天一涯
來源:CSDN
原文:https://blog.csdn.net/yuan1164345228/article/details/17584045
版權聲明:本文為部落客原創文章,轉載請附上博文連結!