东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2534|回复: 4
打印 上一主题 下一主题

[课堂笔记] 利用GNU Radio的gr_modtool工具来编写自定义C++信号处理block

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
跳转到指定楼层
楼主
发表于 2021-5-21 16:14:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


利用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

  1. jiang@jiang-Ubuntu:~/c_c++_works$ gr_modtool
  2. Usage: gr_modtool [OPTIONS] COMMAND [ARGS]...

  3.   A tool for editing GNU Radio out-of-tree modules.

  4. Options:
  5.   --help  Show this message and exit.

  6. Commands:
  7.   add       Adds a block to the out-of-tree module.
  8.   disable   Disable selected block in module.
  9.   info      Return information about a given module
  10.   makeyaml  Generate YAML files for GRC block bindings.
  11.   newmod    Create new empty module, use add to add blocks.
  12.   rename    Rename a block inside a module.
  13.   rm        Remove a block from a module.
  14.   update    Update the grc bindings for a block

  15.   Manipulate with GNU Radio modules source code tree. Call it without
  16.   options to run specified command interactively
复制代码




编写一个自定义模块,可依照如下步骤:
1、新建一个项目模块ai111  gr_modtool newmod ai111
  1. jiang@jiang-Ubuntu:~/c_c++_works$ gr_modtool newmod ai111
  2. Creating out-of-tree module in ./gr-ai111...
  3. Done.
  4. 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


  1. jiang@jiang-Ubuntu:~/c_c++_works/gr-ai111$ gr_modtool add add_const_f
  2. GNU Radio module name identified: ai111
  3. ('sink', 'source', 'sync', 'decimator', 'interpolator', 'general', 'tagged_stream', 'hier', 'noblock')
  4. Enter block type: sync
  5. Language (python/cpp): cpp
  6. Language: C++
  7. Block/code identifier: add_const_f
  8. Please specify the copyright holder: dfy_88888
  9. Enter valid argument list, including default arguments:
  10. float c
  11. Add Python QA code? [Y/n] Y
  12. Add C++ QA code? [y/N] N
  13. Adding file 'lib/add_const_f_impl.h'...
  14. Adding file 'lib/add_const_f_impl.cc'...
  15. Adding file 'include/ai111/add_const_f.h'...
  16. Editing swig/ai111_swig.i...
  17. Adding file 'python/qa_add_const_f.py'...
  18. Editing python/CMakeLists.txt...
  19. Adding file 'grc/ai111_add_const_f.block.yml'...
  20. 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
  1. jiang@jiang-Ubuntu:~/c_c++_works/gr-ai111$ gr_modtool makeyaml add_const_f
  2. GNU Radio module name identified: ai111
  3. Warning: This is an experimental feature. Don't expect any magic.
  4. Searching for matching files in lib/:
  5. Making GRC bindings for lib/add_const_f_impl.cc...
  6. 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,此文件保存已排好序的动态链接库名字列表。






01.png (56.47 KB, 下载次数: 166)

01.png

02.png (64.56 KB, 下载次数: 164)

02.png

03.png (102.16 KB, 下载次数: 167)

03.png

04.png (48.78 KB, 下载次数: 166)

04.png

05.png (105.54 KB, 下载次数: 163)

05.png

06.png (70.14 KB, 下载次数: 168)

06.png

07.png (33.83 KB, 下载次数: 165)

07.png

08.png (61.23 KB, 下载次数: 171)

08.png

int转float.png (127.83 KB, 下载次数: 170)

int转float.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
沙发
 楼主| 发表于 2021-5-24 09:14:44 | 只看该作者
d_c(c)   //这不是语句,变量当函数名 这里没想通
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
板凳
 楼主| 发表于 2021-5-24 09:38:07 | 只看该作者
std::cout << "noutput_items=" << noutput_items << std::endl;
std::cout << "输入in缓冲区数组长度:sizeof(in)=" << sizeof(in) / sizeof(in[0]) << std::endl;
std::cout << "输出out缓冲区数组长度:sizeof(out)=" << sizeof(out) / sizeof(out[0]) << std::endl;
noutput_items=8191或8192
输入in缓冲区数组长度:sizeof(in)=2
输出out缓冲区数组长度:sizeof(out)=2
samp_rate调小,并没有改变noutput_items的大小,只是速度变慢了
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
地板
 楼主| 发表于 2021-5-24 10:09:41 | 只看该作者
字节比特操作相关模块的分析。这类模块在数字信号调制、信道编码等方面有较多应用
1.Pack K Bits  比特组包
2.Unpack K Bits  比特解包
3.Pack to Unpacked
4.Unpacked to Packed
5.Repack Bits
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
5#
 楼主| 发表于 2021-6-24 09:52:59 | 只看该作者
东方耀 发表于 2021-5-24 09:14
d_c(c)   //这不是语句,变量当函数名 这里没想通

这是c++的语法,构造函数的初始化列表,对变量初始化,也可以放到构造函数里面
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-18 08:31 , Processed in 0.183893 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表