GNU Radio输入和输出缓冲区如何工作?

时间:2017-07-06 09:36:47

标签: python c++ buffer gnuradio

我是GNU Radio的新手,在理解输入和输出缓冲区如何工作方面遇到了问题。

我希望用1个输入和2个输出端口组成一个块。此外,我想将固定大小的输入划分为2个具有相同项目数的输出流。

在一开始,我创建了一个具有1个输入和1个输出端口的块。它接收4个元素并且应该把所有其他元素放在输出端口上,即对于输入值1,2,3和4,它应该输出1和3.我按以下方式覆盖了预测和一般工作方法(添加printf函数以便更容易地进行调试):

void test_block_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
    {
      printf("Forcast, number of noutput_items %d\n", noutput_items);
      ninput_items_required[0] = noutput_items * 2;
      printf("Forcast, required input items %d\n", ninput_items_required[0]);
    }


int test_block_impl::general_work (int noutput_items,
                       gr_vector_int &ninput_items,
                       gr_vector_const_void_star &input_items,
                       gr_vector_void_star &output_items)
    {
      const float *in = (const float *) input_items[0];
      float *out = (float *) output_items[0];
      int num_inputitems = ninput_items[0];

      printf("General work, number of input items %d, number of output items %d\n", num_inputitems, noutput_items);
      for (int i = 0; i < num_inputitems ; i++)
      {
        if (i % 2 == 0)
        {
          out[ i/2 ] = in[i];
          printf("out %f, in %f\n", out[i/2], in[i]);
        }
      }
      consume_each (noutput_items*2); // or should I put num_inputitems

      // Tell runtime system how many output items we produced.
      return noutput_items*2;
    }

我还在构造函数中调用了set_max_noutput_items(2)。 我希望预测函数能告诉块它需要一个大小为4的输入,然后一般的工作函数将处理这些项目,并且每隔一秒输出一次。

不幸的是,在编写Python测试之后,我得到了很多意想不到的结果,所以我认为我没有正确理解缓冲区的概念。 对于测试:

    src_data = array ( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0])

    expected_result1 = (1.0, 3.0, 5.0)

    src = blocks.vector_source_f(src_data)
    dmx = tutorial.test_block(number)
    dst1 = blocks.vector_sink_f()

    self.tb.connect(src, dmx)
    self.tb.connect(dmx, dst1)
    self.tb.run (4)

我收到了:

4: Forcast, number of noutput_items 2
4: Forcast, required input items 4
4: Forcast, number of noutput_items 1
4: Forcast, required input items 2
4: Forcast, number of noutput_items 2
4: Forcast, required input items 4
4: General work, number of input items 6, number of output items 2
4: out 1.000000, in 1.000000
4: out 3.000000, in 3.000000
4: out 5.000000, in 5.000000
4: Forcast, number of noutput_items 2
4: Forcast, required input items 4
4: Forcast, number of noutput_items 1
4: Forcast, required input items 2
4: General work, number of input items 2, number of output items 1
4: out 5.000000, in 5.000000
4: Forcast, number of noutput_items 2
4: Forcast, required input items 4
4: Forcast, number of noutput_items 1
4: Forcast, required input items 2
4: (1.0, 3.0, 5.0, 0.0, 5.0, 0.0)

如果有人可以帮我理解GNU Radio从哪里获得那些零,为什么它会按顺序调用预测方法? :)

1 个答案:

答案 0 :(得分:0)

我已经意识到general_work应该返回此方法调用中产生的输出数量,consume应该接收它将处理的数字或输入元素。所以在我获得预期结果的情况下,我应该使用ninput_items(consume_each(ninput_items))和return ninput_items/2

调用consume_each