天天看點

[轉]幾個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.io_signature(min, max, size):

min 最小的連接配接端口數,max 最大的連接配接端口數,一般子產品都是min,max都是一樣的,但也可以設計不一樣的,這時候就是子產品有些端口可以連接配接,也可以不連接配接

先是定義輸入接口,然後是定義輸出接口,如果子產品不存在輸入接口,如source子產品,就可以将輸入端口的簽名寫成gr.io_signature(0, 0, 0), 同理對于不存在輸出的sink 子產品也可以将輸出端口的簽名寫成gr.io_signature(0, 0, 0)

3) 内部子產品的連接配接

這個就非常簡單了 直接connect 即可。 實際構造子產品往往沒有這麼簡單,中間會有比較複雜的運算或者連結關系。我們為了說明問題,是以例子盡量最簡化。

步驟二,新的子產品的使用

file example2.py

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) 定義連接配接關系

為了比較,這裡用了兩個scope

scop1,顯示原信号

scope2,顯示經過ma 處理以後的信号

運作的結果如圖所示

運作結果

[轉]幾個python 入門程式--例2( 如何将多個子產品打包成一個子產品)