GNURADIO:标签传播通过延迟(set_history())

时间:2015-12-03 15:03:56

标签: stream tags delay gnuradio

将标签和延迟放在一起时,如下例所示,来自Guided TutorialsFlow Graph

当延迟为0时,一切正常。但是,当延迟大于1(例如10)时,输出中的标签有时会丢失;没有传播。

见下文,缺少2的示例: Time signal sink showing two missing tags 是什么原因?

制作OOT似乎在使用n> 1的set_history(n)时,会发生以下情况:

1)get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0) + noutput_items);未检测到所有标签;

2)memcpy(output_items[0], input_items[0], noutput_items);不会将所有标签传播到输出(有些标签丢失,如上例所示)。

如何更正此问题并使用set_history(10)读取所有标签?如何确保所有标签都传播到输出?

1 个答案:

答案 0 :(得分:1)

关于延迟块,这似乎是一个错误。

我通过使用最小流量图并比较延迟后标记的偏移来验证这一点:

minimal test flow graph

lastoffset = 0
ok_count = 0
for tag in tb.ref_sink.tags():
    newoffset = tag.offset
    if not newoffset == lastoffset + 100:
        print "pre-delay error: this offset %d, last offset %d" % (newoffset , lastoffset)
    else:
        ok_count += 1
    lastoffset = newoffset

print "OK: %d of %d" % (ok_count , len(tb.ref_sink.tags()))
print "="*10

lastoffset = 100
ok_count = 0
for tag in tb.vector_sink.tags():
    newoffset = tag.offset
    if not newoffset == lastoffset + 100:
        print "post-delay error: this offset %d, last offset %d" % (newoffset , lastoffset)
    else:
        ok_count += 1
    lastoffset = newoffset

print "OK: %d of %d" % (ok_count , len(tb.vector_sink.tags()))

(完整的python代码here

您应该在the GNU Radio bug tracker上打开错误报告(带有问题的链接);你需要一个wiki帐户。我冒昧地为你开了一张票。我们非常欢迎您提供意见,因此请在the ticket上建立帐户并发表评论。

然而,一个小的误解:

memcpy没有对标记做任何事情 - 它实际上只是将输入带到输出缓冲区的正常内存复制操作。 GNU Radio中的标签处理既可以手动完成,也可以像延迟块一样使用标签传播策略自动完成。有关这些的更多信息,请参阅the GNU Radio doxygen documentation。这里的要点是块默认为直接传播,应该处理声明的样本延迟而没有任何问题。所以这可能是一个潜在的问题。