我正在尝试实现一个处理 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 循环没有运行,所以该块没有告诉调度程序它处理了多少项目。问题是,我尝试解析数据文件,但该块也没有收到任何要处理的内容
有人可以指出这个实现中的缺陷吗?
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++ 块示例)”一章,而没有详细阅读基础知识。