如何編寫pythonGNURADIO應用


三個基本概念:

flow graph

很大一部分GNURADIO程序就是一個流圖。流圖包括若干信號處理模塊(BLock),以及一些用表示數據流的邊。

BLock

所有信號處理過程在block中進行。在最好情況下,每個block只包含一項功能,這回使得GNURADIO程序更加靈活。

Block由c++書寫,據說不是很難。

Data

在block間傳遞的數據可以是c++中的任何數據,在實際上,大多數數據類型都是復數,短實數,長整型,浮點數等。傳遞的數據可以是比特,也可以是樣本。

 

流圖的總結:

gnuradio 中所有的信號處理是通過流圖的

一個流圖由若干模塊組成,每個模塊會執行一個操作,例如:過濾,信號疊加,變化,解碼,連接到硬件等。

信號在模塊之間以多種方式傳遞,復數或者實整型,浮點數,或者其他我們定義的數據類型。

 

python

每一個流圖需要至少一個信宿和信號源。

 

 

python 中一個流圖的例子。

代碼的位置在 : gr-audio/examples/python/dial_tone.py.

 

 1 #!/usr/bin/env python
 2 
 3 from gnuradio import gr
 4 from gnuradio import audio, analog
 5 
 6 class my_top_block(gr.top_block):
 7     def __init__(self):
 8         gr.top_block.__init__(self)
 9 
10         sample_rate = 32000
11         ampl = 0.1
12 
13         src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 350, ampl)
14         src1 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl)
15         dst = audio.sink(sample_rate, "")
16         self.connect(src0, (dst, 0))
17         self.connect(src1, (dst, 1))
18 
19 if __name__ == '__main__':
20     try:
21         my_top_block().run()
22     except [[KeyboardInterrupt]]:
23         pass

line 1: 告訴操作系統這是一個python文件,需要使用python解釋器來運行。如果想要直接在命令行中運行該程序,則需要這一行。

line 3,lin4: 導入需要的模塊,來運行gnuradio. 其作用和c語言中的 #include很想。

gr 模塊,是最基本的gnuradio 模塊。每一個運行gnuradio程序時都需要導入這一個模塊。audio 模塊, 音頻設備模塊

analog, 和模擬信號有關的功能和模塊。

line 6-17 定義了一個類,繼承於gr.top_block, 這個類可以認為是該流圖的一個容器。繼承於 gr.top_block的方法可以使我們方便的添加和鏈接模塊。

我們注意到,該類中只包含一個初始化函數,用來創建這個類。 在初始化函數的第一行line8,父類

的初始化函數被調用。在python中很多類似的操作都需要顯示的調用。

接下來Line10-11 定義了兩個變量,用來控制采樣頻率和信號幅度。

 

Line 13-15 定義了3個block, 信號源src0,src1 和信宿 dst.

創建信號源時調用了 analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, frequency,ampl)函數,而創建信宿則調用了 audio.sink中的模塊。 值得主要的是audio.sink 只接受幅度為-1到+1的浮點數,在編寫程序時,我們要注意其取值范圍。如果輸入信號是整形,gnuradio會報錯,但是如果輸入幅度大於1確不會報錯,但是我們會得到一個錯誤的結果。

Line 16-17 負責連接各個模塊,。

 

最后5行,就負責啟動這個模塊。

python構建流圖總結:

1. 在最開始,需要導入Import 一些gnuradio模塊,其中gr通常是必須的。

2. 流圖保存在一個 以gr.top_block 為父類的類里面。

3. 在創建模塊是,一般會調用一個函數

4. block 通過在流圖類里面調用self.connect()來進行連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM