[转]几个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 处理以后的信号
运行的结果如图所示
运行结果
目录
相关文章
|
2天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
2天前
|
存储 索引 Python
Python从入门到精通——1.3.1练习编写简单程序
Python从入门到精通——1.3.1练习编写简单程序
|
2天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
2天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
2天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
3天前
|
开发者 Python
Python的os模块详解
Python的os模块详解
15 0
|
6天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
7天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
8天前
|
测试技术 Python
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘