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

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注