|
利用GNU Radio的gr_modtool工具来编写自定义C++信号处理block
gnuradio|信号处理机
即一台PC,一般配置要求多核、主频2GHz以上,实时性要求很高时,CPU配置也得相应提升。
信号处理等功能靠纯软件实现:基于Linux开发环境,用Python脚本语言进行配置,由C++语言完成核心信号处理算法代码。
SWIG接口方便Python调用C++编写的模块,毕竟C++执行效率高。
在gnuradio中,已编译好的模块称为组件,一般具有输入端口、输出端口,具有特定功能,对外提供可变参数的输入接口,用YaML语言标识接口信息
组件一般分为变量组件和逻辑组件:
逻辑组件用来完成特定的逻辑功能,通过输入输出端口,与其他组件进行连接
逻辑组件分为设备组件、算法组件和虚拟仪器组件
多线程之间采取优先级调度或者轮询调度机制,系统默认为轮询调度机制
内核采用了基于缓冲区的组件间通信机制,为每个module组件分配了输入缓冲区和输出缓冲区,
当前一个组件输出缓冲区达到一定阈值,系统会通知当前组件从前一个组件输出缓冲区取出一定量数据到当前组件的输入缓冲区,
从而保证数据在各个组件间源源不断的传输,做到各个组件尽可能保持并行运行,提高系统运行的效率
gnuradio作为开源框架,除了预置的信号处理模块,像信号源、信宿、布尔运算、数据类型转换等等,
还提供第三方模块(out of tree module)的编写工具,方便研究人员开展算法设计和扩展工作
在linux下的命令,为 gr_modtool,通过在终端输入gr_modtool
- jiang@jiang-Ubuntu:~/c_c++_works$ gr_modtool
- Usage: gr_modtool [OPTIONS] COMMAND [ARGS]...
- A tool for editing GNU Radio out-of-tree modules.
- Options:
- --help Show this message and exit.
- Commands:
- add Adds a block to the out-of-tree module.
- disable Disable selected block in module.
- info Return information about a given module
- makeyaml Generate YAML files for GRC block bindings.
- newmod Create new empty module, use add to add blocks.
- rename Rename a block inside a module.
- rm Remove a block from a module.
- update Update the grc bindings for a block
- Manipulate with GNU Radio modules source code tree. Call it without
- options to run specified command interactively
复制代码
编写一个自定义模块,可依照如下步骤:
1、新建一个项目模块ai111 gr_modtool newmod ai111
- jiang@jiang-Ubuntu:~/c_c++_works$ gr_modtool newmod ai111
- Creating out-of-tree module in ./gr-ai111...
- Done.
- Use 'gr_modtool add' to add a new block to this currently empty module.
复制代码 2、cd进入上一步创建的空模块 添加一个自定义的信号处理block
给自定义的模块取个名字,命名时要注意命名规范,要能够体现出该模块要实现的功能
这里简单demo:加上一个常数的功能 add_const_f
gr_modtool add add_const_f
注意块的类型:
sink:只有输入没有输出(比如示波器,扬声器等);
source:只有输出没有输入(比如信号发生器,usrp信源等);
sync:有输入也有输出,输入输出采样关系是1:1,具体的可以在程序中定义;
decimator:有输入也有输出,输入:输出为抽取关系,输入输出采样比10:1(具体程序中定义);
interpolator:有输入也有输出,输入:输出为内插关系,输入输出是10:1的内插,具体程序中定义
general代表通用模块,这是主要、常用的几类模块
这里选择“sync”类型,然后选择编程语言C++
该功能块需要定义一个参数,也就是需要加的常量值,作为参数右界面配置提供
Enter valid argument list, including default arguments: float c
- jiang@jiang-Ubuntu:~/c_c++_works/gr-ai111$ gr_modtool add add_const_f
- GNU Radio module name identified: ai111
- ('sink', 'source', 'sync', 'decimator', 'interpolator', 'general', 'tagged_stream', 'hier', 'noblock')
- Enter block type: sync
- Language (python/cpp): cpp
- Language: C++
- Block/code identifier: add_const_f
- Please specify the copyright holder: dfy_88888
- Enter valid argument list, including default arguments:
- float c
- Add Python QA code? [Y/n] Y
- Add C++ QA code? [y/N] N
- Adding file 'lib/add_const_f_impl.h'...
- Adding file 'lib/add_const_f_impl.cc'...
- Adding file 'include/ai111/add_const_f.h'...
- Editing swig/ai111_swig.i...
- Adding file 'python/qa_add_const_f.py'...
- Editing python/CMakeLists.txt...
- Adding file 'grc/ai111_add_const_f.block.yml'...
- Editing grc/CMakeLists.txt...
复制代码
3、工具自动为我们生成了很多文件,需要继续修改,编程
修改头文件:gr-ai111/lib/add_const_f_impl.h
在这个类里的私有成员加定义变量的语句: float d_c;用于接收外部的参数值
修改cc文件:gr-ai111/lib/add_const_f_impl.cc
第一部分,定义输入端口数和端口的数据类型,输入输出端口数最大最小都是1,数据类型为浮点型,
d_c(c)表示把接收到的参数值保存到d_c变量
第二部分,也是最核心的部分,为信号处理代码。
work函数有3个形参,其中
noutputs_items表示模块最大能处理的采样点数,后边两个表示两组数组。
下面两行代码表示用const指针定义了两个变量并赋给其首地址,尾部的括号中的数字表示模块的端口数
指向模块的输入缓冲区 即input_items[0]表示第1个输入端口,input_items[1]表示第2个输入端口,依此类推
output_items[0]指向模块的输出缓冲区
信号处理部分的代码表示:每一个输出的采样点数等于相应的采样输入加上一个常数
修改完毕,看后面的截图所示
4、自动生成配置文件makeyaml Generate YAML files for GRC block bindings
- jiang@jiang-Ubuntu:~/c_c++_works/gr-ai111$ gr_modtool makeyaml add_const_f
- GNU Radio module name identified: ai111
- Warning: This is an experimental feature. Don't expect any magic.
- Searching for matching files in lib/:
- Making GRC bindings for lib/add_const_f_impl.cc...
- Overwrite existing GRC file? [y/N] y
复制代码
可以自己修改:gr-ai111/grc/ai111_add_const_f.block.yml
5、编译并安装工程
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig 记得运行它否则报错:
AttributeError: module 'ai111' has no attribute 'add_const_f'
6、测试与使用自定义block
打开gnuradio,就可以看到我们新建的模块了,如图所示
使用新建的模块,这里还用到信号发生器(signal source),限速器(throttle),示波器
报错:在界面上配置一个常数即可
TypeError: make() missing 1 required positional argument: 'c'
ldconfig命令的作用
ldconfig是一个动态链接库管理命令
安装完成某个工程后生成许多动态库,为了让这些动态链接库为系统所共享,
还需运行动态链接库的管理命令–ldconfig。(直接sudo ldconfig即可)。
ldconfig命令的用途:主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,
搜索出可共享的动态链接库(格式如前介绍,lib*.so*),
进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
|
|