动态更改输出项的数量

Change the number of output items dynamically

本文关键字:输出 动态      更新时间:2023-10-16

在gr块的work()函数中,是否可以动态更改输出项的数量,从而保留相同数量的输入项?

在我的情况下,我需要两个基于条件的案例:1) 4096英寸:0英寸2) 4096输入:4096输出

感谢

是的,您希望您的块继承自gr::block(而不是更常见的sync_block等),并使用general_work来处理样本。

general_work中,您可以调用this->consume()来报告要从输入缓冲区中丢弃的样本数量,return [int]将动态地告诉调度程序这次要传递给下一个块的样本数量。

https://gnuradio.org/redmine/projects/gnuradio/wiki/BlocksCodingGuide#Basic-阻止

这是他们在wiki上的代码示例,不过请注意,这个示例的编码风格与gnuradio块当前的编码方式并不完全匹配,但它为您提供了如何使用general_work的想法。对于最新的示例,我建议关闭gnuradio源并为general_work:进行grepping

#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;
  }
};