将标签和延迟放在一起时,如下例所示,来自Guided Tutorials:
当延迟为0时,一切正常。但是,当延迟大于1(例如10)时,输出中的标签有时会丢失;没有传播。
制作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)读取所有标签?如何确保所有标签都传播到输出?
答案 0 :(得分:1)
关于延迟块,这似乎是一个错误。
我通过使用最小流量图并比较延迟后标记的偏移来验证这一点:
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。这里的要点是块默认为直接传播,应该处理声明的样本延迟而没有任何问题。所以这可能是一个潜在的问题。