1006
技術社區[雲棲]
[轉]幾個python 入門程序--例2( 如何將多個模塊打包成一個模塊)
將多個模塊封裝成一個新的模塊可以提高開發的效率,減少很多重複的工作,在gnuradio的例子裏麵也被廣泛的應用這裏用一個非常簡單的例子加以說明,希望能給有需要的朋友有點點幫助
比如 我們希望將信號放大一個倍數,然後加上一個常數,這時候可以通過一個乘法模塊和加法模塊來完成,如果這種計算我多次要使用到,我則會希望將這兩個模塊合成一個模塊,這樣程序編寫起來就會更加方便,同時閱讀起來也更加清晰。
+++++++++++ +++++++++++ ++++++++++++
---+ 乘法 +----+ 加法 +------ ------+ 乘加法 +----------
+++++++++++ +++++++++++ ++++++++++++
步驟一,設計新的乘加法模塊 mul_add
###File myblock.py
################################
#!/usr/bin/env python
from gnuradio import gr
class mul_add(gr.hier_block2):
def __init__(self,a1,a2):
gr.hier_block2.__init__(self, "mul_add",
gr.io_signature(1, 1, gr.sizeof_float), # Input signature
gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
mul = gr.multiply_const_ff (a1)
add = gr.add_const_ff (a2)
self.connect(self,mul,add,self)
1)我們需要用到gr.hier_block2類
我們的新的類模塊mul_add 是繼承hier_block2 模塊
然後定義初始化函數
def __init__(self,a1,a2):
a1,a2是我們要用到的參數,a1放大倍數,a2 是需要加上的常數
2)然後就是輸入,輸出接口的定義
gr.hier_block2.__init__(self, "mul_add",
gr.io_signature(1, 1, gr.sizeof_float), # Input signature
gr.io_signature(1, 1, gr.sizeof_float)) # Output signature
gr.io_signature(min, max, size):
min 最小的連接端口數,max 最大的連接端口數,一般模塊都是min,max都是一樣的,但也可以設計不一樣的,這時候就是模塊有些端口可以連接,也可以不連接
先是定義輸入接口,然後是定義輸出接口,如果模塊不存在輸入接口,如source模塊,就可以將輸入端口的簽名寫成gr.io_signature(0, 0, 0), 同理對於不存在輸出的sink 模塊也可以將輸出端口的簽名寫成gr.io_signature(0, 0, 0)
3) 內部模塊的連接
mul = gr.multiply_const_ff (a1)
add = gr.add_const_ff (a2)
self.connect(self,mul,add,self)
這個就非常簡單了 直接connect 即可。 實際構造模塊往往沒有這麼簡單,中間會有比較複雜的運算或者鏈接關係。我們為了說明問題,所以例子盡量最簡化。
步驟二,新的模塊的使用
File example2.py
#!/usr/bin/env python
from gnuradio import gr, gru, blks2
from gnuradio.wxgui import stdgui2, fftsink2, scopesink2
from gnuradio.eng_option import eng_option
from optparse import OptionParser
from myblock import mul_add
import wx
import sys
class test_graph (stdgui2.std_top_block):
def __init__(self, frame, panel, vbox, argv):
stdgui2.std_top_block.__init__(self, frame, panel, vbox, argv)
parser = OptionParser (option_class=eng_option)
(options, args) = parser.parse_args ()
Fs=2e5
Fc=2e4
#fft.win.set_baseband_freq(freq)
sinwav=gr.sig_source_f (Fs, gr.GR_SIN_WAVE, Fc, 100)
scop1 = scopesink2.scope_sink_f(frame, sample_rate=Fs)
scop2 = scopesink2.scope_sink_f(frame, sample_rate=Fs)
vbox.Add(scop1.win,1,wx.EXPAND)
vbox.Add(scop2.win,1,wx.EXPAND)
ma=mul_add(4,400);
thr1 = gr.throttle(gr.sizeof_float, Fs)
self.connect(sinwav,thr1)
self.connect(thr1,scop1)
self.connect(thr1,ma,scop2)
def main ():
app = stdgui2.stdapp (test_graph, "Test Window")
app.MainLoop ()
if __name__ == '__main__':
main ()
example2.py裏麵是將一個產生的正弦波,放大4倍,然後加上400
1)首先需要在引用裏麵聲明
from myblock import mul_add 從myblock 裏麵調用 mul_add 模塊
2)
得到一個模塊類mul_add的一個實體
ma=mul_add(4,400)
此時 a1=4,a2=400
3) 定義連接關係
self.connect(sinwav,thr1)
self.connect(thr1,scop1)
self.connect(thr1,ma,scop2)
為了比較,這裏用了兩個scope
Scop1,顯示原信號
Scope2,顯示經過ma 處理以後的信號
運行的結果如圖所示
運行結果

最後更新:2017-04-03 14:53:48