我有一个具有多种功能的 GRC 项目,但并非所有功能都必须同时调用。将它分成几个独立的项目将是一个解决方案,但我更喜欢一个更灵活的解决方案,它可以动态激活/停用顶级流程图中的一些块。
所以我的想法是根据变量的值启用/禁用块。这可能吗?或者有没有其他类似的解决方案?
我有一个具有多种功能的 GRC 项目,但并非所有功能都必须同时调用。将它分成几个独立的项目将是一个解决方案,但我更喜欢一个更灵活的解决方案,它可以动态激活/停用顶级流程图中的一些块。
所以我的想法是根据变量的值启用/禁用块。这可能吗?或者有没有其他类似的解决方案?
如果您使用的是 GNU Radio 3.8.0.0 或更高版本:我们已将上述机制替换为简单的点对点复制,这种复制更加健壮(但存在复制开销)。因此,从 3.8-techpreview 开始,选择器可以安全使用。
尝试“选择器”块。您可以使用两个变量设置活动输入/输出端口。
在内部,选择器是一个分层块,它将暂停您的流程图,断开以前活动的输入和输出块连接现在活动的块,然后继续流程图的操作。
以这种方式,它不是样本精确的,并且可能不是首选工具。您可能想研究消息传递而不是使用变量,然后选择“乘(与)矩阵”块。
您可以使用具有一个输入和 n 个输出的 epy 块。在工作函数中,您可以根据需要映射输入。example_parameter(可以由流程图中的变量设置)可以确定输出索引。在流程图中插入一个 python 块,双击它,在编辑器中打开,ctrl+a ,ctrl+v。祝你好运!
import numpy as np
from gnuradio import gr
import time
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='EPY demux', # will show up in GRC
in_sig=[np.complex64],
out_sig=[np.complex64,np.complex64] # ADD HERE HOW MANY OUTPUTS YOU WANT
)
# 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[int(self.example_param)][:] = input_items[0]
return len(input_items[0])`