在GNURadio软件上⾃定义开发信号源模块(C++版)
⽬录
在GNU Radio软件上⾃定义开发信号源模块(C++版)
在⾃定开发之前,默认已在Linux上安装GNU Radio软件,在安装该软件时会默认安装gr_modtool脚本⼯具,使⽤该脚本⼯具可以⾃动⽣成模块的样板代码、makefile⽂件等,这样开发者就可以专注于模块的核⼼代码编写。在本篇中将基于matlab的sin函数在GNU Radio软件上通过⾃定编写信号源模块(source)实现函数功能,⽣成⼀个正弦波形。
⼀、前期准备
1、编写MATLAB版的Sin函数。程序如图1-1所⽰:
图1-1
2、函数在matlab上的运⾏结果图。
图1-2
3、由于该函数相对简单,可以直接开发该模块,不必要在linux上编写C++函数进⾏验证。
⼆、正式开发
1.使⽤gr_modtool创建模块框架。
图2-1
如图2-1所⽰,使⽤指令gr_modtool newmod mysource在⽬录下创建了⼀个名为gr-mysoure的⽂件夹(GNU Radio 会⾃动帮我们创
如图2-1所⽰,使⽤指令gr_modtool newmod mysource在⽬录下创建了⼀个名为gr-mysoure的⽂件夹(GNU Radio 会⾃动帮我们创建所需要的⽂件及⽂件夹),⽂件夹的内容如下:
图2-2
如图2-2所⽰可以看,gr-mysource中有多个⼦⽬录。其中:
1)⽤C/C++写的程序都将放在lib⽂件夹中,⽽C/C++的头⽂件放在include⽂件夹中(如果它们是接⼝),或者放在lib⽂件夹中(如果它们只在编译时⽤到,在安装之后⽤不到,如*_impl.h⽂件)。
2)⽤python写的程序都将放在python⽂件夹中,包括未安装的测试单元和已安装的python模块。
3)虽然GNU Radio的模块是⽤C++写的,但这些模块可以在python中调⽤,这是通过SWIG(the simplified wrapper and interface generator)的帮助。SWIG的相关⽂件放在swig⽂件夹中。
4)如果想让⾃定义模块在GNU Radio图形界⾯(GRC)中也是可⽤的,就需要在grc⽂件夹中添加.xml描述⽂件。
5)在docs⽂件夹中包含⼀些说明,可以使⽤Doxygen和Sphinx从C++⽂件和python⽂件中提取⽂件的说明。
6)在apps⽂件夹中包含⼀些完整的已安装到系统的应⽤程序(包括在GRC中执⾏或单独执⾏的⽂件)。
7)examples⽂件夹⽤来保存例⼦,供其他开发者查看模块如何使⽤。
这个构建系统还带来了⼀些其它独⽴的包,⽐如⽂件(存在于每⼀个⼦⽬录中)和cmake的⽂件夹。
2、添加模块
图2-3
如图2-3所⽰,使⽤指令gr_modtool add source_sin添加了⼀个名为source_sin的模块,其模块类型为source。模块类型根据输⼊输出关系还可以选择general、sink、sync、decimator、interpolator、tagged_stream、hier、noblock等。⽐如,信源模块(只有输出)的类型可以选择source;输⼊输出数量相等的模块(1个输⼊对应1个输出)的类型可以选择sync。
能运行python的软件由于该模块需要输出3个参数,所以在Enter valid argument list⼀栏添加3个形参:float SampleRate,float Frequency,float Amplitude;在添加模块时,可以选择代码类型(python或C++)、
参数列表(默认⽆参数)、是否需要测试代码等,gr_modtool会⾃动⽣成必要的⽂件以及修改。⽐如,gr_modtool在lib⽂件夹中⽣成了source_sin_impl.h⽂件和source_⽂件,这2个⽂件也是我们接下来需要修改的⽂件。
3.编辑代码
a)编辑source_
打开⾃动⽣成的source_⽂件,⾸先修改构造函数,在这⾥需要定义模块的输⼊输出以及模块的参数,修改如图2-4所⽰:
图2-4
接下来修改work函数,修改如图2-5所⽰
图2-5
b)编辑source_sin_impl.h
打开source_sin_impl.h⽂件,修改如图2-6所⽰:
图2-6
三、模块编译与⽣成
4、代码编译
依次执⾏图3-1和3-2所⽰的操作命令:
图3-1
图3-2
5.模块⽣成
截⽌到⽬前,⾃定义模块还不能在GRC中使⽤,这是因为gr_modtool⽆法在开发者编写模块之前创建有效的xml⽂件(创建模块时调⽤gr_modtool加载⽣成的xml代码只是⼀些框架代码)。当模块编译完成之后,可以运⾏图3-3所⽰的指令让gr_modtool⾃动⽣成xml⽂件,将blokc添加到GRC中。
图3-3
此时⾃定义模块已创建有效的xml⽂件,但仍需回到build⽬录中更新⽂件库。操作指令如图3-4和3-5所⽰。
图3-4
图3-5
6、模块显⽰
打开GRC,在模块列表中可以看到⾃定义模块Source sin,如图3.6所⽰。
图3-6
⾄此模块已添加⾄GRC中。
四、测试该模块的功能
1)下⾯创建⼀个流图来测试模块的功能,流图如图4-1所⽰:
图4-1
2)运⾏结果如图4-2:
图4-2
运⾏结果与matlab运⾏结果相同。
五、⼩结
基于C++⾃定义开发的信号源模块,其功能验证成功。存在问题:定义noutput_items =5000,在调试过程中发现,GNU Radio每次调⽤source_sin_impl::work()函数每秒处理5000个输⼊输出(noutput_items 最⼤值为 8192),但noutput_items 参数输出并不固定在(8192,8184)两个数循环变化,其原因后续需研究。且将此参数设⼩后,输出波形会出错,后续需要研究。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论