可以在gr块的work()函数中动态更改输出项的数量,留下相同数量的输入项吗?
在我的情况下,我根据条件需要2个案例: 1)4096 IN:0 OUT 2)4096 IN:4096 OUT
谢谢
答案 0 :(得分:1)
是的,您希望您的广告块继承自gr::block
(而不是更常见的sync_block
等)并使用general_work
来处理示例。
在general_work
中,您可以调用this->consume()
报告您要从输入缓冲区中删除的样本数,return [int]
将动态告诉调度程序您有多少样本这次传递到下一个区块。
https://gnuradio.org/redmine/projects/gnuradio/wiki/BlocksCodingGuide#Basic-Block
这是来自wiki的代码示例,但请注意,此示例的编码样式与gnuradio块当前编码的方式并不完全匹配,但它为您提供了如何使用general_work
的概念。对于最新的示例,我建议修改gnuradio源并为general_work
加注:
#include <gr_block.h>
class my_basic_block : public gr_block
{
public:
my_basic_adder_block(...):
gr_block("another adder block",
in_sig,
out_sig)
{
//constructor stuff
}
int general_work(int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
//cast buffers
const float* in0 = reinterpret_cast<const float *>(input_items[0]);
const float* in1 = reinterpret_cast<const float *>(input_items[1]);
float* out = reinterpret_cast<float *>(output_items[0]);
//process data
for(size_t i = 0; i < noutput_items; i++) {
out[i] = in0[i] + in1[i];
}
//consume the inputs
this->consume(0, noutput_items); //consume port 0 input
this->consume(1, noutput_items); //consume port 1 input
//this->consume_each(noutput_items); //or shortcut to consume on all inputs
//return produced
return noutput_items;
}
};