3

我有一个通用的工作功能,我将使用 GNU Radio 的历史功能。在块的构造函数中,我调用set_history( m ). 我以标准方式转换输入缓冲区:

  const float *in = (const float *) input_items[0];

我的问题是in[0]缓冲区中的位置。对我来说,这noutput_items是块要消耗的项目的数量,ninput_items[0]是指缓冲区中的数据总数。因此,in[noutput_items-1]是数组的最后一个元素,in[0]项目in[-m]的开始, 是指历史块的开始。因此,ninput_items[0]大于或等于m + noutput_items

我不知道这个假设是否正确,如果有人知道这是如何工作的,我会很高兴。GNU Radio API 在这方面有些模糊。提前致谢!

4

2 回答 2

2

Tom Rondeau 在GNU Radio wiki上帮助回答了这个问题。in[0]指历史的开端。为了使in[0]引用数据的开始,in这样声明:

const float *in = (const float *) &((const float*)input_items[0])[history()-1]; 
于 2012-09-21T17:53:56.983 回答
1

只是为了@Chris 的完整性,set_history()指的是items的数量,就像noutput_itmes参数一样。

in[0]指历史的第一项。为了跳过历史并获得第一个新项目,这是正确的方法:

const <TYPE> *in = (const <TYPE> *) &((const <TYPE>*)input_items[0])[(history()-1) * VEC_SIZE];

VEC_SIZE指在输入签名处指定的类型的样本数。

例如,如果一个块的输入签名是

io_signature::make(1, 1, vec_len * sizeof(float))

每个项目都是由vec_len浮点数构成的。可以通过以下方式正确跳过历史记录:

const float *in_new = (const float *) &((const float*)input_items[0])[(history()-1) * vec_len];

于 2015-07-08T15:59:06.767 回答