GNU无线电输入和输出缓冲区如何工作?

问题描述:

我是GNU Radio的新手,对理解输入和输出缓冲区如何工作有问题。GNU无线电输入和输出缓冲区如何工作?

我想做一个有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收音机让那些零和为什么它调用的顺序预测方法? :)

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