Gnuradio创建OOT自定义模块的三种方式

2024-01-20 23:50

本文主要是介绍Gnuradio创建OOT自定义模块的三种方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文内容、所用开发板、配件等仅限与研发和学习使用,如有侵权,请联系我们进行删除!

目录

一、概要

二、实验环境

三、实验内容

1、方式一:grc 中直接添加“Python Block”

2、方式二:使用gr_modtool添加python定义的OOT block

3、方式三:使用gr_modtool添加C++定义的OOT block

4、实验结果

四、参考链接


一、概要

OOT模块是指Gnuradio中并不包含的模块资源,用户根据需求自己定义来制作。编写OOT模块的方法多种,下面用简单的例子分别进行介绍。

二、实验环境

ubuntu 20.04 ; gnuradio 3.8 ; uhd 4.1.0

三、实验内容

下面以自定义一个2倍乘法器的grc oot block,即将输入的每个数据值都乘以2为例,简单介绍一下如何生成OOT block。

1、方式一:grc 中直接添加“Python Block”

打开gnruadio,在右边的模块搜索栏中直接搜索“Python Block”,然后添加到流图中。然后双击该模块,并对代码进行自定义的修改。

import numpy as np
from gnuradio import grclass blk(gr.sync_block):  # other base classes are basic_block, decim_block, interp_blockdef __init__(self):  # only default arguments heregr.sync_block.__init__(self,name='mult_2_grc',   in_sig=[np.complex64],out_sig=[np.complex64])def work(self, input_items, output_items):"""example: multiply with 2"""output_items[0][:] = input_items[0] * 2return len(output_items[0])

2、方式二:使用gr_modtool添加python定义的OOT block

打开终端,收入一下命令,使用gr_modtool创建一个molude,即许多blocks的集合目录,然后进入该目录中,添加一个python block。

1. gr_modtool newmod ootBlocks  //添加新的modlue
2. cd gr-ootBlocks/             //进入产生的目录
3. gr_modtool add mult_2_py     //添加oot blockGNU Radio module name identified: ootBlocks('sink', 'source', 'sync', 'decimator', 'interpolator', 'general',     'tagged_stream', 'hier', 'noblock')Enter block type: sync    Language (python/cpp): python  //这里使用pythonLanguage: PythonBlock/code identifier: mult_2_pyPlease specify the copyright holder: Enter valid argument list, including default arguments: Add Python QA code? [Y/n] nAdding file 'python/mult_2_py.py'...Adding file 'grc/ootBlocks_mult_2_py.block.yml'...Editing grc/CMakeLists.txt...
4. cd python/                    CMakeLists.txt  __init__.py  mult_2_py.py
5. gedit mult_2_py.py          //编辑后代码如下图所示
6. cd ../grc
7. gedit  ootBlocks_mult_2_py.block.yml  //编辑后的代码如下图所示
8. mkdir build/ && cd build/ && cmake ../ && make 
9. sudo make install && sudo ldconfig     //编译安装

编辑后的python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy
from gnuradio import grclass mult_2_py(gr.sync_block):def __init__(self):gr.sync_block.__init__(self,name="mult_2_py",in_sig=[np.complex64],out_sig=[np.complex64])def work(self, input_items, output_items):in0 = input_items[0]out = output_items[0]out[:] = in0 * 2return len(output_items[0])

编辑后的yml文件

id: ootBlocks_mult_2_py
label: mult_2_py
category: '[ootBlocks]'templates:imports: import ootBlocksmake: ootBlocks.mult_2_py()inputs:
- label: indomain: streamdtype: complexoutputs:
- label: outdomain: streamdtype: complexfile_format: 1

3、方式三:使用gr_modtool添加C++定义的OOT block

在gr-ootBlocks中再添加一个用C++实现的OOT block.

1. gr_modtool add mult_2_cpp   //再添加一个oot block('sink', 'source', 'sync', 'decimator', 'interpolator', 'general',  'tagged_stream', 'hier', 'noblock')Enter block type: syncLanguage (python/cpp): cpp  //这里选择cppLanguage: C++Block/code identifier: mult_2_cppPlease specify the copyright holder: Enter valid argument list, including default arguments: Add Python QA code? [Y/n] nAdd C++ QA code? [Y/n] nAdding file 'lib/mult_2_cpp_impl.h'...Adding file 'lib/mult_2_cpp_impl.cc'...Adding file 'include/ootBlocks/mult_2_cpp.h'...Editing swig/ootBlocks_swig.i...Adding file 'grc/ootBlocks_mult_2_cpp.block.yml'...Editing grc/CMakeLists.txt...
2. gedit lib/mult_2_cpp_impl.cc  //修改实现自定义的功能,代码如下
3. gedit grc/ootBlocks_mult_2_cpp.block.yml //代码如下
4. 然后再次编译安装

修改后的cpp文件

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif#include <gnuradio/io_signature.h>
#include "mult_2_cpp_impl.h"namespace gr {namespace ootBlocks {mult_2_cpp::sptrmult_2_cpp::make(){return gnuradio::get_initial_sptr(new mult_2_cpp_impl());}mult_2_cpp_impl::mult_2_cpp_impl(): gr::sync_block("mult_2_cpp",gr::io_signature::make(1, 1, sizeof(gr_complex)),gr::io_signature::make(1, 1, sizeof(gr_complex))){}mult_2_cpp_impl::~mult_2_cpp_impl(){}intmult_2_cpp_impl::work(int noutput_items,gr_vector_const_void_star &input_items,gr_vector_void_star &output_items){const gr_complex *in = (const gr_complex *) input_items[0];gr_complex *out = (gr_complex *) output_items[0];for(int index = 0; index < noutput_items; index++) {out[index] = in[index] * (gr_complex)2;}return noutput_items;}} /* namespace ootBlocks */
} /* namespace gr */

修改后的yml文件

id: ootBlocks_mult_2_cpp
label: mult_2_cpp
category: '[ootBlocks]'templates:imports: import ootBlocksmake: ootBlocks.mult_2_cpp()inputs:
- label: indomain: streamdtype: complexoutputs:
- label: out    domain: streamdtype: complexfile_format: 1

4、实验结果

可见,三组图都是一模一样的幅度为2的正弦波重合在一起,相较与收入的幅度扩大了2倍。实验结果符合预期!

四、参考链接

1、http://www.highmesh.cn/

2、 OutOfTreeModules - GNU Radio

3、https://blog.csdn.net/qq_41300075/article/details/121411905

这篇关于Gnuradio创建OOT自定义模块的三种方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627750

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进