GNU Radio3.8创建OOT的详细过程(python)

2023-05-16

GNU Radio 学习使用 OOT 系列教程:

GNU Radio3.8创建OOT的详细过程(基础/C++)

GNU Radio3.8创建OOT的详细过程(进阶/C++)

GNU Radio3.8创建OOT的详细过程(python)

GNU Radio自定义模块:Embedded Python Block的使用

GNU Radio3.8:编辑yaml文件的方法

GNU Radio3.8:创建自定义的QPSK块(C++)

----------------------------------------------------------------------------------------

在 GNU 3.8创建OOT的详细过程(基础/C++) 以及 GNU 3.8创建OOT的详细过程(进阶/C++) 中,我们详细介绍了如何使用 C++ 来创建自定义模块,这里我们将继续介绍如何使用 python 来进行自定义模块的创建。python 因其简介的代码可以大大曾快开发的效率 但是 python 固有的执行效率慢的问题使其不适用于复杂功能模块的编写,因此对于复杂的模块编写还是建议使用 C++,一些功能简单的模块使用 python 编写。

使用 python 编写模块的过程相比 C++ 简直不要太人性化!同样是创建一个具有平方功能的块,我们在 mymod 模块中 创建一个 python 块:

gr_modtool add -t sync -l python square3_ff

注意这里的命令行参数 -l 后是 python

wsx@wsx:~/temp/gr-mymod$ gr_modtool add -t sync -l python square3_ff
GNU Radio module name identified: mymod
Language: Python
Block/code identifier: square3_ff
Please specify the copyright holder: 
Enter valid argument list, including default arguments: 
Add Python QA code? [Y/n] y
Adding file 'python/square3_ff.py'...
Adding file 'python/qa_square3_ff.py'...
Editing python/CMakeLists.txt...
Adding file 'grc/mymod_square3_ff.block.yml'...
Editing grc/CMakeLists.txt...

首先,还是编写测试文件 python/qa_square3_ff.py :

from gnuradio import gr, gr_unittest
from gnuradio import blocks
from square3_ff import square3_ff

class qa_square3_ff(gr_unittest.TestCase):

    def setUp(self):
        self.tb = gr.top_block()

    def tearDown(self):
        self.tb = None

    def test_001_square3_ff (self):
        src_data = (-3, 4, -5.5, 2, 3)
        expected_result = (9, 16, 30.25, 4, 9)
        src = blocks.vector_source_f (src_data)
        sqr = square3_ff ()
        dst = blocks.vector_sink_f ()
        self.tb.connect (src, sqr)
        self.tb.connect (sqr, dst)
        self.tb.run ()
        result_data = dst.data ()
        self.assertFloatTuplesAlmostEqual (expected_result, result_data, 6)
        # check data


if __name__ == '__main__':
    gr_unittest.run(qa_square3_ff)

与之前 C++ 块的 python 测试代码相比,主要是 square3_ff 的 import 方式 发生了变化。

接下来是 python 文件 python/square3_ff.py 的编写:

import numpy
from gnuradio import gr

class square3_ff(gr.sync_block):
    """
    docstring for block square3_ff
    """
    def __init__(self):
        gr.sync_block.__init__(self,
            name="square3_ff",
            in_sig=[numpy.float32],  # 输入端口
            out_sig=[numpy.float32])  # 输出端口


    def work(self, input_items, output_items):
        # <+signal processing here+>
        output_items[0][:] = input_items[0][:] * input_items[0][:]  # 平方
        return len(output_items[0])

看了这代码的简洁程度,真想说,python 还是大爷(— . —)

昂,不扯了哈哈,来看下与之前的C++代码的对比吧:

同样是 sync 类型的块,因此信号处理的主函数为 work() , 在 python 中是继承自父类 gr.sync_block ,这在 C++ 版本中是 gr::sync_block 。

与 C++ 不同,这里的输入输出端口 in_sig/out_sig 的设置使用列表形式来列举 ,列表中的每一个元素都代表这个端口的数据流中包含的 item 的数量。这里的定义为:

in_sig = [numpy.float32],
out_sig = [numpy.float32],

代表着输入输出端各有一个端口,端口的数据类型为 numpy.float32 。另外,如果想让端口可以输入/输出 vectors 或其他复杂的数据,则可以像这样定义

in_sig = [(numpy.float32, 4), numpy.float32] 

这个定义意味着输入有两个端口,第一个端口是具有 4 个单精度浮点型类型数据的 vector ,第二个端口是一个单精度浮点型的标量。

另外,这里的 input_items 和 output_items 都是 numpy 数组,可以使用 numpy 方法进行操作。

wsx@wsx:~/temp/gr-mymod/build$ cmake ../
-- Build type not specified: defaulting to release.
-- Using GMP.
-- User set python executable /usr/bin/python3
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.8.so (found suitable exact version "3.8.10") 
-- Using install prefix: /usr/local
-- Building for version: v1.0-compat-xxx-xunknown / 1.0.0git
-- No C++ unit tests... skipping
-- 
-- Checking for module SWIG
-- Found SWIG version 4.0.1.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.8.so (found version "3.8.10") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wsx/temp/gr-mymod/build

wsx@wsx:~/temp/gr-mymod/build$ make test
Running tests...
Test project /home/wsx/temp/gr-mymod/build
    Start 1: qa_square1_ff
1/3 Test #1: qa_square1_ff ....................   Passed    0.52 sec
    Start 2: qa_square2_ff
2/3 Test #2: qa_square2_ff ....................   Passed    0.50 sec
    Start 3: qa_square3_ff
3/3 Test #3: qa_square3_ff ....................   Passed    0.55 sec

100% tests passed, 0 tests failed out of 3

Total Test time (real) =   1.57 sec

使用 python 来写 block 就没有C++那样复杂的编译安装等步骤了,遇到 bug 的概率也少了不少,开发效率直接上天!

然后是编写 yaml 文件,由于 gr_modtool makeyaml ××× 命令是针对 C++ 的,因此这里就只能手动修改 yaml 文件了,不过有了前面的基础,这一步也很容易完成,有关 yaml 代码的 修改 可以看这篇博客,修改后的 yaml 文件如下:

id: mymod_square3_ff
label: square3_ff
category: '[Mymod]'
templates:
  imports: import mymod
  make: mymod.square3_ff()
inputs:
- label: in
  domain: stream
  dtype: float
outputs:
- label: out
  domain: stream
  dtype: float
file_format: 1

可以发现,除了命名,其他的与之前的一模一样。

最后一步,同样是回到 build/ 文件夹中,重新 cmake 一下,然后不需要再编译(make)了,直接运行 make test 进行测试,然后在 sudo make install 进行安装,这时再重新打开GRC,可以发现 square3_ff 模块:

 运行该流图,结果如下:

最后多提一嘴,如果有小伙伴使用过 GRC 中的 Embedded Python Block 的话就会发现这两个其实是同样的,只不过这里是从头开始编辑模块的,而 Embedded Python Block 中是创建好了 block,我们只用往里面填写代码就行了。

最后,如同使用 C++ 进行 block 的创建及编写一样,使用 python 也可以创建所有类型的 block,python 中的四种 blocks 如下:

  • gr.sync_block
  • gr.decim_block
  • gr.interp_block
  • gr.basic_block - (这里对应 C++ 中的  gr::block)

另外,与 C++ 中的一样,python 中也会根据 block 的类型来选择是否需要重写 forecast()、 work()、以及 general_work() 函数。

def work(self, input_items, output_items):
    # Do stuff

def general_work(self, input_items, output_items):
    # Do stuff

参考:

GNU Radio自定义模块:Embedded Python Block的使用_Flag_ing的博客-CSDN博客

OutOfTreeModules - GNU Radio

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU Radio3.8创建OOT的详细过程(python) 的相关文章

  • 在 Django 中定义视图和 url。为什么调用函数时不使用括号?

    我已经在经历 Python速成课程 目前正在进行 Django Web应用程序项目 学习日志 阶段 有些东西与我已经学到的相矛盾 views py file from django shortcuts import render def i
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有

随机推荐

  • OSMWebWizard无法使用(Address family not supported by protocol)

    根据报错信息依次打开osmWebWizard py SimpleWebSocketServer py 查看对应行号的内容 xff0c 发现Simple py中有一个socket net6 可能是网络协议的问题 xff0c 查了一下 xff0
  • 粤嵌实训笔记二

    目录 20230227 20230303 xff08 第二周 xff09 main clcd clcd hbmp cbmp hgame cgame h 20230227 20230303 xff08 第二周 xff09 1 在Linux下
  • Arduino学习笔记:FreeRTOS——ESP32多任务处理

    Arduino学习笔记 xff1a FreeRTOS ESP32多任务处理 Demo span class token comment 创建任务一和任务二的句柄 xff0c 并初始化 span TaskHandle t TASK Handl
  • JAVA-信号量

    信号量 xff1a 信号量一般都有以下几个变量 xff1a count xff1a 记录可以使用的资源数wait list xff1a 等待信号量的队列 获取信号量需要判断count是否大于零 xff0c 即if count gt 0 若c
  • (程序猿专属)1024-我用代码写成浪漫情话表白你

    今天1024 xff0c 程序员节 xff01 不祝你们节日快乐了 xff0c 祝你们穿着拖鞋和裤衩去相亲吧 xff01 祝你们和甜蜜的爱情撞个满怀 xff01 一 我是你的什么啊 xff1f 你是我的bug啊 因为 xff0c 我每时每刻
  • C++中构造函数后的冒号

    C 43 43 中构造函数后的冒号 在C 43 43 中离不开类的定义 xff0c 而构造函数则是类的定义中很重要的一环 我们在构造函数中常常见到如下定义 xff1a span class token keyword class span
  • 论C语言没有输出的可能问题

    论C语言没有输出的可能问题 1 今天帮别人找bug xff0c 说是程序没有输出 题目如下 xff1a 错误代码如下 xff1a span class token macro property span class token direct
  • 【VS2019】报错:E0349没有与这些操作数匹配的运算符

    报错 xff1a E0349没有与这些操作数匹配的运算符 调试程序遇到该错误 xff0c 特此记录 span class token macro property span class token directive keyword inc
  • 基于docker技术搭建hadoop与mapreduce分布式环境

    基于docker技术搭建hadoop与mapreduce分布式环境 一 安装doker 1 宿主环境确认 如果没有的话 安装lsb relaease工具 apt install lsb release 检查版本 lsb release a
  • GNU Radio3.8创建OOT的详细过程(进阶/C++)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • 基于docker构建spark运行环境

    基于docker构建spark运行环境 一 安装docker与docker compose 参考之前的实验进行docker和docker compose的安装 二 系统构架图 xff1a 三 安装相关镜像 使用docker hub查找我们需
  • HDFS基本操作

    HDFS基本操作 HDFS的基本命令格式 hdfs dfs cmd lt args gt 注意 xff1a 需要事先将HADOOP HOME bin目录配置进入环境变量 列出当前目录下的文件 hdfs dfs ls 在HDFS创建文件夹 h
  • 使用mllib完成mnist手写识别任务

    使用mllib完成mnist手写识别任务 小提示 xff0c 通过restart命令重启已经退出了的容器 sudo docker restart lt contain id gt 完成识别任务准备工作 从以下网站下载数据集 MNIST手写数
  • npm install 报错 Error: EPERM: operation not permitted, rename

    报错的解决方案 原因1 xff1a 权限不足原因2 xff1a 缓存出错方法1方法2 原因3 xff1a npm版本不够原因4 xff1a 网络不稳定方法1方法2 原因5 xff1a 杀毒软件问题方法1方法2 其他 xff1a 待补充 原因
  • 马原复习知识点背诵-《马克思主义基本原理概论》

    马概复习重点 绪论 1 什么是马克思主义 1 从创造者 继承者的角度讲 马克思主义是由马克思恩格 斯创立的 而由其后各个时代 各个民族的马克思主义者 不断丰富和发展的观点和学说的体系 2 从阶级属性讲 马克思主义是无产阶级争取自身解放和整
  • 深度学习 | 三个概念:Epoch, Batch, Iteration

    转自 xff1a https www jianshu com p 22c50ded4cf7 写在前面 xff1a 在训练神经网络的时候 xff0c 我们难免会看到Batch Epoch和Iteration这几个概念 曾对这几个概念感到模糊
  • OpenStack — Nova

    文章目录 NovaNova架构Nava组件nova apinova computenova conductornova schedulernova novncproxy 创建虚拟机流程 Nova Nova是OpenStack最核心的服务模块
  • 使用Object.key和delete来将对象中值为空的属性删除。

    有些时候 xff0c 我们在接口传值时 xff0c 不需要把值为空的属性传过去 xff0c 即可使用该方法来快速的删除属性 span class token comment 深拷贝对象 xff0c 避免影响页面显示 span span cl
  • docker启动关闭删除所有的容器命令

    1 启动所有容器 docker start docker ps a awk 39 print 1 39 tail n 43 2 2 关闭所有容器 docker stop docker ps a awk 39 print 1 39 tail
  • GNU Radio3.8创建OOT的详细过程(python)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程