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

本文介绍了如何在GNURadio 3.8中创建和使用OOT(Out-Of-The-Tree)模块,特别是通过EmbeddedPythonBlock来实现自定义功能。通过编辑Python代码,用户可以定义模块的行为,例如在示例中,创建了一个对输入信号进行幅度限幅的模块。此外,还展示了如何配置模块参数以在GUI中使用滑块调整值,增强了交互性。
部署运行你感兴趣的模型镜像

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++)

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

目录

1、简介

2、使用方式

3、举一个李子

1、简介

Embedded Python Block模块是gnu radio中的一个用Python实现的自定义功能块,可以使用Python来编程实现一些简单的功能。下面简单介绍下他的用法~

位置:Misc->Python Block

2、使用方式

双击拖出来的Embedded Python Block模块,点击General->Code中的 open in editor,如下图所示,可以自定义选择使用的Python编辑器,也可以使用默认的编辑器。

如果是自定义选择编辑器可能会发生找不到目标编辑器所在位置的情况(比如我使用的VSCode),这时可以随便找一个.py文件,右键选择“Properties”,然后在“open with”中选择默认打开应用,比如我这里选择vscode作为默认编辑器。

这些设置完成之后,就可以开始编辑该模块的Python代码啦。在初次打开编辑器时我们可以看到该模块中的预定义代码段如下:

"""
Embedded Python Blocks:

Each time this file is saved, GRC will instantiate the first class it finds
to get ports and parameters of your block. The arguments to __init__  will
be the parameters. All of them are required to have default values!
"""

import numpy as np
from gnuradio import gr


class blk(gr.sync_block):  # other base classes are basic_block, decim_block, interp_block
    """Embedded Python Block example - a simple multiply const"""

    def __init__(self, example_param=1.0):  # only default arguments here
        """arguments to this function show up as parameters in GRC"""
        gr.sync_block.__init__(
            self,
            name='Embedded Python Block',   # will show up in GRC
            in_sig=[np.complex64],
            out_sig=[np.complex64]
        )
        # if an attribute with the same name as a parameter is found,
        # a callback is registered (properties work, too).
        self.example_param = example_param

    def work(self, input_items, output_items):
        """example: multiply with constant"""
        output_items[0][:] = input_items[0] * self.example_param
        return len(output_items[0])

初始代码段中定义一个类blk,类初始化函数中需要定义用到的变量,并且这些变量必须要有默认值。代码中默认为example_block=1.0,该变量就是在前述General界面中看到的那个变量。

在下面代码是对模块的初始化定义。

        gr.sync_block.__init__(
            self,
            name='Embedded Python Block',   # will show up in GRC
            in_sig=[np.complex64],
            out_sig=[np.complex64]
        )

name是对模块的命名,可以看出原始命名为“Embedded python Block”。in_sig以及out_sig是输出信号的数据类型,可以根据需要自行修改。如果想使用向量格式的变量,则在方括号中可以使用例如(np.float, len),就是定义一个float类型长度为len的向量。下面的work函数是用来填写数据处理的主代码的,最终模块会调用该函数完成预设的功能。

3、举一个李子

这个流图很简单,其作用是对一个余弦波的幅度进行限幅,超过阈值的部分通过,否则就赋值为0。图中的Embedded python Block模块已改名为a sample

修改后的代码如下:

class blk(gr.sync_block):  # other base classes are basic_block, decim_block, interp_block
    """Embedded Python Block example - a simple multiply const"""
    # 定义增益系数与阈值
    def __init__(self, gain = 1.0, threshold = 0):  # only default arguments here
        """arguments to this function show up as parameters in GRC"""
        gr.sync_block.__init__(
            self,
            name='a sample',      # 模块命名
            in_sig=[np.float32],  # 输入数据类型
            out_sig=[np.float32]  # 输出数据类型
        )
        # if an attribute with the same name as a parameter is found,
        # a callback is registered (properties work, too).
        self.gain = gain  # 赋初值
        self.threshold = threshold

    # input_items:输入数据缓冲区
    # output_items:输出数据缓冲区
    def work(self, input_items, output_items):
        for i in range(len(input_items[0])):
            if(input_items[0][i] > self.threshold):  # 比较
                output_items[0][i] = input_items[0][i] * self.gain  # 乘增益系数
            else:
                output_items[0][i] = 0
        return len(output_items[0])

对照代码可知,模块中显示的两个变量gain和threshold就是在代码初始化中定义的两个变量,在代码的编辑过程中直接Ctrl+S保存代码,变量名就会实时地更新到模块中显示。运行流图就会得到以下结果:

如果想让变量gain和threshold能像samp_rate一样可以使用滑块来赋值,操作起来也很简单,本质上讲跟其他现成模块的操作是一样的,如下所示:

在重新生成流图并运行,结果如下:

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 创建 GNU Radio 自定义模块教程 #### 使用 `gr_modtool` 初始化新模块 为了创建一个新的 GNU Radio 外部树(Out-of-Tree, OOT)模块,推荐使用工具 `gr_modtool` 来简化流程。该命令会引导完成初始化过程并设置必要的文件结构[^1]。 ```bash $ source /path/to/gnuradio/install/setup_env.sh # 如果安装路径不在默认位置,则需先加载环境变量 $ mkdir ~/repos && cd ~/repos/ $ git clone https://github.com/gnuradio/gr-modtool.git $ pip install ./gr-modtool $ gr_modtool newmod mymodule ``` 这将在当前工作区创建名为 `mymodule` 的目录及其子组件框架,其中包含了构建OOT所需的基础配置和模板文件[^3]。 #### 添加 Python 嵌入式块 (Embedded Python Block) 对于希望利用 Python 编写的逻辑部分,可以通过嵌入式 Python 块轻松集成到流图中去。这类特殊类型的处理单元允许开发者编写纯 Python 代码作为信号处理器的一部分运行[^2]。 要向项目里加入这样的功能块: ```bash $ cd gr-t python embedded_python_block_name ``` 上述指令会在适当的位置生成样板代码以及相应的 XML 描述符,使得新的 Python 组件能够被图形界面识别并调用。 #### 修改 YAML 文件支持 GRC 调用 为了让自定义模块能够在 GNU Radio Companion 中显示出来,还需要编辑对应的 `.block.yml` 文件来描述参数接口等信息给前端应用解析。此操作通常涉及更新输入输出端口详情、数据类型声明等内容。 例如,在 `gr-mymodule/python/mymodule/embedded_python_block_name.block.yml` 中指定如下字段: ```yaml id: embedded_python_block_name label: 'My Custom Embedded PyBlock' category: '[Gr-Mymodule]' parameters: ... inputs: - domain: stream dtype: complex outputs: - domain: message_port id: out_msgport ... ``` 这样做的目的是确保当用户在设计时可以从侧边栏找到这个新增加的功能选项卡,并按照预设的方式连接上下游节点形成完整的通信链路。 #### 构建与测试 最后一步就是编译整个工程并将产物部署至本地环境中供后续实验验证之用了。进入顶层源码仓库执行常规的 CMake 和 Make 步骤即可达成目标;而对于仅含 Python 实现的部分来说,往往只需保证脚本本身无误就足够了。 ```bash $ mkdir build && cd build $ cmake ../ $ make $ sudo make install $ ldconfig ``` 现在应该可以在启动后的 GNU Radio Companion 应用程序内看到刚才建立好的自定义模块类别下的各个实例项了。
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球被支点撬走啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值