制作 GNURADIO C++ OOT 同步块时出现问题

问题描述 投票:0回答:1

我正在尝试实现一个处理 512 字节块并返回 480 字节块的块。首先,我尝试使用 512 输入/512 输出来掌握 GNUradio 的输入/输出机制。

这是我的工作功能实现:

int cycle = 0;
int test_sync_impl::work(int noutput_items,
    gr_vector_const_void_star &input_items,
    gr_vector_void_star &output_items)
{
  auto in = static_cast<const input_type*>(input_items[0]);
  auto out = static_cast<output_type*>(output_items[0]);

  int in_index = 0;
  int out_index = 0;

  std::cout <<"input amount: " <<  nitems_read(0) << "\n";

  while(in_index + 512 <= nitems_read(0) && out_index + 512 <= noutput_items)
  {
    std::vector<uint8_t> burst(512);
    std::copy(in+in_index, in+in_index + 512, out + out_index);
    in_index += 512;
    out_index += 512;
    cycle++;
    std::cout<<"cycle: " << cycle << "\n";
  }
  consume_each(in_index);

  std::cout <<"output amount" << out_index << "\n";
  // Tell runtime system how many output items we produced.
  return out_index;
}

但目前,该块似乎不起作用。我假设因为 while 循环没有运行,所以该块没有告诉调度程序它处理了多少项目。问题是,我尝试解析数据文件,但该块也没有收到任何要处理的内容

有人可以指出这个实现中的缺陷吗?

c++ signal-processing gnuradio
1个回答
0
投票
int test_sync_impl::work(int noutput_items,
   gr_vector_const_void_star &input_items,
   gr_vector_void_star &output_items)

这是一个整数速率块(

sync_block
,插值器或抽取器块)。然而,您尝试消耗和生产不同数量的样品。

您为应用程序选择了错误的块类型!

您需要使用源自

gr::block
的块,而不是
gr::sync_block

你的其余代码看起来也很糟糕

int cycle = 0;

这是一个全局范围的变量。在这种情况下绝对是错误的。

  std::cout <<"input amount: " <<  nitems_read(0) << "\n";

不,

nitems_read(0)
之前工作调用已经消耗的样本量,不是“输入量”。

    std::vector<uint8_t> burst(512);

您每次迭代都会创建(并本质上销毁)该对象

burst
,但从不使用它。

恐怕我不清楚你想做什么。您是否可能尝试重新实现 “将 M 保留在 N”块? 这里的块?

总而言之,我认为您可能在 GNU Radio 教程 上略过一些,并且可能直接进入“创建 OOT(C++ 块示例)”一章,而没有详细阅读基础知识。

© www.soinside.com 2019 - 2024. All rights reserved.