【轉載】第一個GNURadio應用程序心得
目錄:
前言
一.準備學習
二.針對性逐行研究代碼
三.構建自己的應用流圖,編寫程序,調試通過
四、small tips
前言:學習背景:電子通信專業,相關專業課程都有學習,沒學過python(大多數都沒有學過)C++學習過,隻學過C的話最好對麵向對象編程的類,封裝,重構有所了解,學習,有助於學習python編程。
一、 準備學習
步驟:入門中文文檔——> 登陸gnuradio/wiki網站查看入門英文相關手冊——>根據wiki在電腦上手動安裝GNURadio平台(首先在電腦上安裝虛擬機,虛擬機上安裝LINUX係統)——>了解linux係統的基本操作指令,會運行安裝好後的gnuradio源代碼。
1.入門中文文檔:
重點:[1]GNU_Radio入門_V0.99,黃琳著。
[2] Python簡明教程
其他:對軟件無線電基本概念,發展曆史,隨便找本書,有所了解。
2.https://gnuradio.org/redmine/projects/gnuradio/wiki,關於gnuradio的介紹這個網站是最全麵的,入門時可以看看安裝步驟介紹和FAQ。
3.安裝最好參見上麵網站的說明,因為其版本更新是最迅速的,中文文檔版本過時,不便參考。
4.推薦論壇:https://www.ruby-forum.com/forum/gnuradio這個英文論壇確實有很多東西可以看,學會用搜索;https://gnuradio.cc/index.php?m-bbs.html這個中文論壇比較冷清,但是有牛人解答,尤其是meteor,很熱心,很牛,幾乎有問必答。
5.有問題時針對性在論壇和網站FAQ上都搜索不到時,可以直接google(英文學術搜索比百度好),或者直接聯係牛人。(加群,郵件聯係)
二、針對性逐行研究代碼
根據課題要求,在下載的gnuradio包中查看相應源代碼,找到主程序。
這裏以我的OFDM舉例,相關程序涉及一個隻有數據發送的benchmark代碼,一個ofdm收發的benchmark ofdm。
●理解程序第一步:重點理解python程序的流圖機製,頂層文件都是python程序,底層C++寫的信號處理模塊可暫時不了解,可通過在GRC裏查找相應模塊了解其接口參數即可。先從簡單程序入手,GNURadio入門文檔的第四章在這一階段要重新重點看。
另外,由於python編程的重要性,個人認為簡明教程還是不太夠,最好再看一本厚一點的編程入門。推薦清華大學出版的james payne的python編程入門經典,其他也行。
●Benchmark代碼詳細解析有gnuradio中文論壇版大meteor的解釋非常詳細,對讀懂這個程序有很大幫助。因為gnuradio就是為了實現各種無線電應用,也就是一個收發通信係統,所以在閱讀其他程序之前也非常有必要先把這個物理層的收發程序讀懂。
●其他程序的閱讀我認為大框架就是要搞懂流圖的建立,一個大的應用一般自己編寫了幾個python文件,流圖流向涉及好幾個自己編寫的文件,一個辦法就是在該主程序頂頭用from…import引入模塊的句子中找到從當前路徑引入的模塊,再在當前路徑中找到對應.py文件,聯係起來即可知道流圖去向。其他引入模塊若為from gnuradioimport…則為從gnuradio中引入的模塊,直接import則為調用的python的內嵌模塊。
▲TIPS:
◆查找gnuradio的模塊:為了讀懂程序,不需要在閱讀到前幾句引入模塊的時候就趕緊到gnuradio包中去搜索對應模塊,而是讀到具體語句的時候,確定是引用了gnuradio中模塊的相關函數的時候再去查找其作用,一般格式舉例:gr.sizeof_gr_complex 規律:所有gnuradio的模塊調用前綴都是gr.後麵有橫杠表示類的私有函數。
查找方法:在gnuradio包下,例如gnuradio- 3.5.0文件夾下,選擇“搜索”,注意鍵入關鍵字搜索方法:例如gr.sizeof_gr_complex就可以鍵入sizeof而不是全部鍵入,可斷句鍵入搜索,一般我們要找的是CC文件和H文件,其他文件不用看。
◆查找python函數:程序中沒有任何前後聲明的一般為python的內嵌函數,舉例: data =source_file.read(pkt_size - 2),這裏source_file為前麵定義的一個文件變量,python把其當做對象,read()函數沒有任何說明,即可分析其為python內嵌函數。查找方法:安裝一個python編輯調試器IDLE非常有必要!!!安裝IDLE以後會有一個強大的幫助文檔,類同matlab的幫助文檔,可以直接在安裝目錄裏打開,也可以打開編輯器以後按F1調出文檔,要學會用其搜索功能,所有python函數都可以搜索到,對理解程序非常有幫助,另外,也可以嚐試用編輯器編寫一些小的python程序,幫助理解其編程原理。在GNURadio平台上構建自己的無線應用,初期階段其已有C++編寫的信號處理模塊絕對已經足夠,所以python編程就非常重要。也不需要單純對python了解太深,脫離了gnuradio個人認為得不償失。
三、構建自己的流圖,編寫程序,調試通過
●GRC的運用:初期學習構建簡單通信係統可以嚐試用grc,構建成功後仔細分析其生成的.py文件,對python程序的流圖機製理解很有幫助。這一步甚至可以放在逐行閱讀程序(第二步)之前。GRC的使用非常簡單,不用細說,就是拖動模塊過來連線,剛開始用的時候不知道怎麼連線,有人告訴就是把兩個端點各單擊一次即可,若有問題則主要是原理的問題,對於模塊接口參數的設計理解了原理根據提示修改一般沒有問題,不過還是建議自己的程序不要用GRC,自己編寫會好得多,參考模版也建議不要參考GRC生成的程序,參考源代碼為好。
●在心中構建了一個流圖以後,一個當然是可以用GRC仿真檢驗後再自己編程,如果GRC不能完成,則可以自己編程實現了。由於python是腳本語言,不需編譯,所以目前作為仍然是新手級別,我隻知道在終端直接運行,根據錯誤提示調試,新手遇到的問題多於縮進有關:indentation error:unexpected indent
或者變量定義位置:attribute error:”str” object has no attribute“read”(屬性錯誤),這個錯誤在於我把變量寫在了一個if語句下麵,後麵else又用了,總之都是基礎錯誤,python語言對於變量不需要事先聲明,所以對於新手理解程序有點障礙,必須慢慢習慣。再有莫名其妙的問題在各個論壇問了也沒人理的時候就有可能是你的流圖接口有問題了,這個必須就要自己慢慢的把自己用到的各個模塊的接口搞懂然後再更改就行了。這個時候也可以求助於GRC看能不能解決。
四、small tips
1、USRP采樣率(sample rate)問題:
USRPN係列時鍾為100MSPS(samples persecond):可調範圍為masterclock/4----masterclock/512範圍,通過調節比特率(bitrate)和每符號樣值率(samples per symbol),公式如下:
采樣率=符號速率(symbol rate)*每符號樣值數=時鍾頻率(masterclock)/2的n次冪(n屬於2-9)
符號速率=比特率/每符號比特數
2.python中的數值類型和長度:重點:complex型。查找文檔費了點時間,這裏直接貼出吧,複數complex是按照(實部,虛部)存儲的,實部,虛部都是按浮點型float存儲的,python沒有double型,與matlab接口時要注意,由於文檔中說數據類型的長度與版本和機器都有關,所以建議在python編輯器IDLE上編寫一個小程序測試一下,一般float是4個字節,所以complex就是8個字節。
Gnuradio編程就是python編程,所以其數據類型是相通的。
這裏注意python操作的數據對象(據我看的程序貌似都是)string,所以其函數一般都把得到的數據轉成了string型,這裏不用緊張,收發是匹配的,會有還原。典型函數如:chr();ord();
最後更新:2017-04-03 14:53:50