三個基本概念:
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(
的浮點數,在編寫程序時,我們要注意其取值范圍。如果輸入信號是整形,gnuradio會報錯,但是如果輸入幅度大於1確不會報錯,但是我們會得到一個錯誤的結果。 sample_rate, analog.GR_SIN_WAVE, frequency,ampl
)函數,而創建信宿則調用了 audio.sink中的模塊。 值得主要的是audio.sink 只接受幅度為-1到+1
Line 16-17 負責連接各個模塊,。
最后5行,就負責啟動這個模塊。
python構建流圖總結:
1. 在最開始,需要導入Import 一些gnuradio模塊,其中gr通常是必須的。
2. 流圖保存在一個 以gr.top_block 為父類的類里面。
3. 在創建模塊是,一般會調用一個函數
4. block 通過在流圖類里面調用self.connect()來進行連接