GNU Radio 模块扩展说明

来源:互联网 发布:投诉淘宝的电话是多少 编辑:程序博客网 时间:2024/05/16 08:12

1引言

GNU Radio是一个通过最小程度地结合硬件,用软件来定义无线电波发射和接收的方式,搭建无线电通信系统的开源软件系统。其应用程序用Python语言来编写,真实的信息处理过程是由C++浮点扩展库来实现。因此开发者可以获得实时高效的可复用的应用开发环境。GNU Radio不仅可以用于仿真,也可以在不用真实硬件,而使用预先记录或生成的数据来开发信号处理算法。

GNU Radio提供了所有通用软件无线电需要的库,包括各种调制方式(GMSK PSK QAM等)、信号处理模块(FFT、滤波器等)等。开发者通过调用需要的模块,建立相应的流向图,就能够搭建一个无线电系统。其灵活性和高效性使得复杂的数据生成过程变得简单,并被广泛地应用射频通信方面。

2 GNU Radio模块扩展分析

通常在项目的设计过程中,我们有时需要将几个现有模块级联生成一个新的模块,有时也需要生成一个全新的数字信号处理模块。前者比较简单,可以通过Python强大的粘合功能实现。对于后者,很多资料上介绍需要自己编写C++语言的源码程序,最后翻译成可以调用的Python模块,但是这样做非常繁琐,而且耗时。那如何才能快速便捷的扩展新模块呢?

我们知道Python的编程效率很高,如果仅用Python就能够扩展新模块,那问题就变得简单多了。GNU Radio3.6.3以上的版本都提供了相应的模块扩展库,存放在GNU Radio的安装目录下面。例如打开D:\gnuradio\lib\site-packages\gnuradio\gr文件夹下的gateway.py文件就能够查看相应的库函数,里面包含了四种不同类型的Python模块:Synchronous block、Decimation blockInterpolation blockBasic block

创建新模块时,首先依据需求,在程序入口处导入相应类型的Python模块;然后根据模块类型,选择信号处理函数(general_work ()work());最后在函数内部编写想要实现的功能。我们不禁会问:“四种不同类型的Python模块应如何选择? general_work ()work()这两个函数分别在哪种模块类型下使用?”下面将对上述问题进行详细阐述。

2.1 Python模块分析

Synchronous block(同步模块),应用于输入端口数据数量与输出端口数据数量相等的情况,例如单端口常数乘法器;Decimation block(抽取模块),应用于输入端口数据数量是输出端口数据数量固定倍数的情况,例如抽取滤波器;Interpolation block(插值模块),应用于输出端口数据数量是输入端口数据数量固定倍数的情况,例如插值滤波器;Basic block(基本模块),其输入端口数据数量与输出端口数据数量的比值是M:N,配置合理的比值,就可以转换为前三个模块中的一种,但是在gateway.py文件中默认设置Basic block的比值为1:1

2.2 模块函数分析

需要注意的是信号处理函数的选择与模块的选定与是一一对应的,选择Basic block时调用general_work ()函数,而选择另外三个模块时调用work()函数。

2.3 模块扩展程序分析

了解清楚了模块类型和信号处理函数的使用情况后,就可以使用Python语言来编写新模块了。文件夹中附带了module_test.py文件,内含四种不同类型的Python模块的简单测试,仅供参考。下面以Basic block创建加法器的实例进行说明。扩展程序如下:

import numpy

from gnuradio import gr, blocks

from gnuradio.gr import gateway

class Add(gateway.basic_block):

    def __init__(self):

        super(Add, self).__init__(name="Add",

                      in_sig=[numpy.float32, numpy.float32],

                            out_sig=[numpy.float32])

    def general_work(self, input_items, output_items):

        in0 = input_items[0][:len(output_items[0])]

        in1 = input_items[1][:len(output_items[0])]

        out = output_items[0]

        out[:] = in0 + in1

        return len(out)

def test_add():

    tb = gr.top_block()

    src0 = blocks.vector_source_f((1.25, 3.56, 5.75, 7, 9, 10), True, 1, [])
    src1 = blocks.vector_source_f((2.75, 2.44, 2.25, 3.5, 1.5), True, 1, [])
    head = blocks.head(gr.sizeof_float, 10)
    sink = blocks.vector_sink_f(1)

    adder = Add()

    tb.connect((src0, 0), (adder, 0))
    tb.connect((src1, 0), (adder, 1))
    tb.connect(adder, head, sink)

    tb.run()

    result_data = sink.data()
    return result_data

创建模块,需要考虑输入端口的数量,输出端口的数量,以及每个端口数据类型的大小这三个因素。这里定义加法器模块有两个输入端和一个输出端,数据类型是numpy.float32

函数general_work()内部用来实现加法器的功能。为了保证输入端口数据数量与输出端口数据数量的比值是1:1,利用切片符([:])截取与输出端口相同数量的输入数据进行算术处理。
0 0