1-2.4Python Block Tags
本教程演示了如何创建两个嵌入式 Python 块,其中一个模块用于检测输入信号是否超过阈值并超过时为其写入标签,然后在另一个单独的模块中读取该标签并使用自上次检测以来的时间更新输出。
内容
1 标签概述
2 创建测试信号
3 阈值检测器:定义块
4 阈值检测器:编写标签
5 检测计数器:定义块
6 检测计数器:读取标签
7 标签传播
1.Tags Overview
标签是一种以时间同步方式伴随数字化RF样本一起传递信息的方式。应用场景:当下游模块想知道在哪个样本需要调谐到新频率时;或者特定样本需要包含时间戳。(即给样本打上标记以便下游模块进行特别处理)
相比于消息以异步方式传递信息,没有基于时钟的时间保证,标签是与特定 RF 样本相关联的信息。标签与数据流或矢量中的数字化RF样本同步传送,包括Complex Float 32、Float 32、Byte和所有其他格式。
使用以下行代码添加标签:
outputPortNumber决定将标签添加到哪个输出流。absoluteIndex是索引被添加标签的样本。流程图对每一个样本进行计数,生成的第一个样本位于绝对样本索引0处。key是一个PMT类型,包含要存储的变量名称。value是另一个 PMT 类型,包含要存储信息的。(流出图中的每个块都可被视为一个线程,对其输出的samplel流添加标签需要一些参数,如输出的端口号,样本索引,关于添加的标签的信息)
可以使用如下函数能读取标签:
在窗口中读取标签会根据当前input_items向量中的相对索引来读取它们。获取与当前input_items样本对应的所有标签的最简单方法是使用函数调用:
2. Creating Test Signal
如图所示,创建并连接流程图,注意所有模块的输入和输出都是float类型
运行流程图。生成过滤后的0和1的伪随机序列:
3.Threshold Detector: Defining the Block
拖入一个嵌入式Python 模块并双击它以编辑源代码。
更改example_param变量名称并添加一个新参数report_period:
更改模块名称:
将模块的输入输出数据类型改为float
将默认变量名更改,默认为self.example_param:
移除默认的乘法操作:
保存代码,返回GRC得到:
如果模块没有正确更新,则 Python 语法可能存在问题。双击嵌入式 Python 块查看任何潜在的语法错误。下图给出了语法错误所在位置的示例:
将Virtual Sink和Virtual Source块添加到流程图。更改以下块属性:
根据下图连接流程图:
4.Threshold Detector: Writing Tags
导入pmt库:
在__init()__函数下添加两个新变量self.timer和self.readyForTag:
随后,work()函数需要加以修改。
创建一个 for 循环以遍历所有输入样本:
需要编写三段代码。首先,一旦达到或超过阈值时,第一部分代码将幅度电平写入名为检测的标签。仅当self.readyForTag状态变量为 True 时才写入标签。写入标签后,状态变量self.readyForTag将设置为 False。
第二部分代码用于运行计时器。只要self.readyForTag为 False,每个输入样本的计时器都会增加 1:
第三部分代码块控制状态变量self.readyForTag。一旦self.timer达到最大值,计时器就会重置,状态变量self.readyForTag设置为 True:
运行流程图。标签显示在QT GUI Time Sink中:
5.Detection Counter: Defining the Block
创建一个新的嵌入式 Python 块来读取标签,计算自上一个标签以来的样本数,并将该数字作为输出生成。
将一个新的Python块拖放到 GRC 工作区中。不要复制和粘贴现有的python 块,它只会创建Threshold Detector的第二个副本。
双击嵌入式 Python 块并编辑代码。
将Detection Counter连在Threshold Detection之后:
6.Detection Counter: Reading Tags
为了使Detection Counter模块正常读取标签需要修改代码,
导入pmt库:
在__init()__下添加一个新变量:
修改work()函数以读取标签:
使用key检测遍历所有标签,计算它们的相对偏移量并将其存储在列表中:
将列表中相对偏移量按从小到大的顺序排列:
循环遍历所有输出样本:
对于每个输出样本,产生一个输出,它是自上次检测标签以来的样本数:
如果当前输出样本索引大于或等于当前检测标签的索引,则从列表中移除偏移值并重置样本计数器self.samplesSinceDetection。否则,将样本计数器增加 1。
删除输出分配:
work()函数最终如下所示:
保存代码 (CTRL + S)。运行流程图。输出如下所示:
注意到,所有Detection Counter输入流上的标签会保持到输出流,并不会自动消失。
7.Tag Propagation
默认情况下,所有输入标签都传送到所有输出标签。在某些场景下需要从特定流中减少或完全删除标签。Tag Gate模块可用于从输出流中删除标签。在检测计数器块之后连接Tag Gate:
NU
运行流程图。这些标签已从QT GUI Time Sink中删除: