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_ffclass qa_square3_ff(gr_unittest.TestCase):def setUp(self):self.tb = gr.top_block()def tearDown(self):self.tb = Nonedef 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 dataif __name__ == '__main__':gr_unittest.run(qa_square3_ff)

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

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

import numpy
from gnuradio import grclass 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/buildwsx@wsx:~/temp/gr-mymod/build$ make test
Running tests...
Test project /home/wsx/temp/gr-mymod/buildStart 1: qa_square1_ff
1/3 Test #1: qa_square1_ff ....................   Passed    0.52 secStart 2: qa_square2_ff
2/3 Test #2: qa_square2_ff ....................   Passed    0.50 secStart 3: qa_square3_ff
3/3 Test #3: qa_square3_ff ....................   Passed    0.55 sec100% tests passed, 0 tests failed out of 3Total 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 mymodmake: mymod.square3_ff()
inputs:
- label: indomain: streamdtype: float
outputs:
- label: outdomain: streamdtype: 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 stuffdef general_work(self, input_items, output_items):# Do stuff

参考:

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

OutOfTreeModules - GNU Radio

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

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

    GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...

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

    GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...

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

    GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...

  4. 最适合新手看的平衡二叉搜索树(BBST)的创建,包含详细过程,一看就会(C++版)

    写在前面:本人大二小白,本篇文章是我第一次写博客,用来记录我的学习过程,我想将我在学习中遇到的各种的问题和困难写下来,希望大家能够不要犯同样的错误.我会尽可能的详细的把每一个步骤都解释清楚,那么废话不 ...

  5. socket:内核初始化及创建流(文件)详细过程

    socket中文名称为套接字,属于传输协议及功能接口的封装.socket首先初始化注册(socket)文件系统,然后由使用它的模块传入具体的地址族(类型)family,如ipv4模块中的(void)s ...

  6. MySQL中关于临时表的创建到删除详细过程

    1.临时表的创建: CREATE TEMPORARY TABLE SalesSummary (product_name VARCHAR(50) NOT NULL, total_sales DECIMA ...

  7. Oracle 创建表空间详细过程

    此空间是用来进行数据存储的(表.function.存储过程等),所以是实际物理存储区域. 主要用途是在数据库进行排序运算[如创建索引.order by及group by.distinct.union/ ...

  8. mingw版本下qt与HTML,QT5.10开发(2) 在Windows 10下使用MinGW编译 静态Qt 5.10 release版 详细过程...

    Qt建议安装动态链接Dbug版和编译安装静态链接release版 前提: 先安装动态链接Dbug版,方法:QT5.10开发(1)安装QT5.10 地址:http://blog.csdn.net/qq_ ...

  9. Hive创建表的过程详细过程

    Hive创建表的过程详细过程 Demo 第一个demo CREATE TABLE db.testTable(id string COMMENT 'id',name string COMMENT '姓名 ...

最新文章

  1. 转:读AD里特殊的属性in C#
  2. centos7 harbor 单机搭建
  3. VS2008的网页报表可以直接打印了
  4. StringGrid数据导出到Excel
  5. 通域消化内镜Android患者版,市中心医院消化内科Ⅰ病区开创超声内镜治疗新领域...
  6. (计算机组成原理)第七章输入和输出系统-第四节3:I/O方式之DMA方式
  7. vector::erase()的那些事儿
  8. Java全网最全面试题(2022年VIP典藏版)
  9. 【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡
  10. 如何使用Android模拟器创建Android虚拟设备
  11. 海昇智 :拼多多直通车开车需要分时间吗?
  12. uniapp音乐播放器
  13. 我手机上常用的app和常访问的网站
  14. C语言入门题库——计算圆面积和周长
  15. 浏览器性能和兼容性测试
  16. 【Python】 1051 复数乘法 (15 分)
  17. 一次使用wxcharts做微信小程序图表功能采到的坑
  18. Linux sysfs文件系统
  19. C++的OpenCV边缘检测代码
  20. Unreal多播委托

热门文章

  1. DLT(Direct Linear Transform)算法
  2. LM324运放过流延时自锁电路
  3. 朝曦建筑建材租赁管理系统
  4. C语言移位运算(<<)
  5. 遇到Redis server went away报错解决
  6. 你永远不会有足够的奶酪
  7. ubuntu16.04 制作系统镜像(系统、软件备份)
  8. SAS Base基本操作
  9. jquery validation engine ajax验证,jQuery Validation Engine 表单验证
  10. Flash CS3制作Fla形式的组件