[转]几个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 处理以后的信号
运行的结果如图所示
运行结果

时间: 2024-09-08 11:40:37

[转]几个python 入门程序--例2( 如何将多个模块打包成一个模块)的相关文章

《Python 3程序开发指南(第2版•修订版)》——第1章 过程型程序设计快速入门 1.1 创建并运行Python程序

第1章 过程型程序设计快速入门 本章提供了足以开始编写Python程序的信息.如果此时尚未安装Python,强烈建议读者先行安装Python,以便随时进行编程实践,获取实际经验,巩固所学的内容. 本章第1节展示了如何创建并执行Python程序.你可以使用自己最喜欢的普通文本编辑器来编写Python代码,但本节中讨论的IDLE程序设计环境提供的不仅是一个代码编辑器,还提供了很多附加的功能,包括一些有助于测试Python代码.调试Python程序的工具. 第2节介绍了Python的8个关键要素,通过

一篇不错的Python入门教程_python

原文 http://www.hetland.org/python/instant-hacking.php Instant Hacking[译文] 译者: 肯定来过                                       这是一篇简短的关于python程序设计语言的入门教程,原文在这里,翻着词典翻译了来! 这是一份对编程艺术的简短介绍,其中的例子是用python写成的.(如果你已经知道了该如何编程,但是想简单了解一下python,你可以查阅我的另一篇文章Instant Pyth

Python入门之modf()方法的使用

 这篇文章主要介绍了Python入门之modf()方法的使用,是Python学习当中的基础知识,需要的朋友可以参考下     modf()方法返回两个项的元组x的整数小数部分.这两个元组具有相同x符号.则返回一个浮点数的整数部分. 语法 以下是modf()方法的语法: ? 1 2 3 import math   math.modf( x ) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数. 参数 x -- 这是一个数值表达式 返回值 这种方

给Python入门者的一些编程建议

 这篇文章主要介绍了给Python入门者的一些编程建议,包括对集合初始化和GIL理解等一些需要注意的地方,需要的朋友可以参考下     Python是一种非常富有表现力的语言.它为我们提供了一个庞大的标准库和许多内置模块,帮助我们快速完成工作.然而,许多人可能会迷失在它提供的功能中,不能充分利用标准库,过度重视单行脚本,以及误解Python基本结构等.本文是一个关于Python新手可能会陷入的一些陷阱的不完全列表. 不知道Python版本 这是一个在StackOverflow上反复出现的问题.许

《 Python树莓派编程》——3.3 Python入门

3.3 Python入门 让我们开始学习Python吧.在树莓派上运行Python有3种不同的方法:使用内置的IDLE解释器,在终端内运行,或者用作脚本文件.我们先介绍IDLE. 3.3.1 通过IDLE运行Python IDLE编辑器类似于一个"沙盒",你无需编写全部脚本内容便可同Python进行交互,并观测它所做的事情.IDLE代表"Integrated DeveLopment Environment",集成开发环境,它也代表了对Eric Idle的一种尊敬,E

适合Java开发者学习的Python入门教程

编者按:在Java文章频道里,我们大部分人应该对该语言都非常的了解,而且在该生态圈内至少已经呆了好几年了.这让我们有常规和专业的知识,但是也同时也让我们一些井蛙之见. 在Outside-In Java系列文章中,一些非Java开发人员会给我们讲讲他们对于我们这个生态圈的看法. 从哲学的角度来讲,Python几乎是与Java截然相反.它抛弃了静态类型和刚性结构,而是使用了一个松散的沙盒,在这里面你可以自由的做任何你想做的事情.也许Python是关于你能够做什么,而Java则是关于你可以做什么. 然

使用NetBeans IDE开发Python应用程序详解

本教程的目的是向您介绍在 NetBeans IDE 中使用 Python 编程语言的http://www.aliyun.com/zixun/aggregation/22929.html">基础知识.这样,程序员就可以继续深入了解该语言的功能.NetBeans 添加了对多种 JVM 语言和非 JVM 语言的支持,从而为程序员开辟了新的编程途径,同时也为他们以多种不同的语言(包括 Python)进行开发提供了易于使用的环境.在本教程中,您将从头开发一个小型应用程序 (hockeyRoster.

【人生苦短,我用Python】Python免费精品课连载(1)——Python入门

课程学习:零基础入门学习Python - 阿里云大学 上图中T恤上印着"人生苦短,我用Python"的大牛就是Python的创始人Guido van Rossum.其实这句话来自Bruce Ecke(C++标准委员会成员,<Thinking in Java>作者),原话是"Life is short, you need Python". 为什么这么说呢?我们先来了解一下Python的设计哲学: 优雅 明确 简单 相对于Perl语言中"总是有多种

《Python 3程序开发指南(第2版•修订版)》——2.2 Integral类型

2.2 Integral类型 Python提供了两种内置的Integral类型,即int与bool1.整数与布尔型值都是固定的,但由于Python提供了增强的赋值操作符,使得这一约束极少导致实际问题.在布尔表达式中,0与False表示False,其他任意整数与true都表示true.在数字表达式中,True表示1,False表示0.这意味着,有些看起来很怪异的表达式也是有效的.例如,我们可以使用表达式i += True来对整型变量i进行递增操作,当然,最自然的方法还是i+=1. 2.2.1 整数