2012-09-20 249 views
1

我有一個一般的工作函數,我將使用GNU Radio的歷史記錄功能。在塊的構造函數中,我打電話set_history(m)。我投的輸入緩衝區以標準方式:GNU Radio歷史記錄

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

我的問題是wheere in[0]是指在緩衝區中。對我來說,noutput_items新的項要消耗的塊的數量,ninput_items[0]是指緩衝區中的數據總數。因此,in[noutput_items-1]是數組的最後一個元素,in[0]項的開始,而in[-m]是指歷史塊的開始。因此,ninput_items[0]大於或等於m + noutput_items

我不知道這個假設是否屬實,如果有人知道這是如何工作,會很高興。 GNU Radio API在這方面有些模糊。提前致謝!

回答

1

Tom Rondeau在GNU Radio wiki的幫助下回答了這個問題。 in[0]指的是歷史的開始。爲了使in[0]指的數據的開始,申報in這樣:

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

只是爲了@克里斯的完整性,set_history()項目數量,就像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];