GNU Radio自定义OOT块输入输出长度不匹配问题求助
GNU Radio OOT块崩溃与输出长度问题的解决方法
核心问题分析与修复步骤
1. Forecast函数逻辑错误
你的forecast函数当前要求输入项数等于输出项数,但你的块是每100个输入生成32000个输出,需要明确告诉调度器:生成输出至少需要100个输入项。修改如下:
void testInAndOut_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) { // 生成32000个输出固定需要100个输入 ninput_items_required[0] = 100; }
2. 输出索引计算错误(导致越界崩溃)
原代码out[j + i * j]的索引逻辑混乱,会导致数组越界或输出顺序错误。正确索引应按i*100 + j填充,保证320组、每组100个数据连续排列:
for (int i = 0; i < 320; i++) { for (int j = 0; j < 100; j++) { out[i * 100 + j] = sig_data[j]; } }
3. 输入消耗数量错误
当前consume_each(noutput_items)会错误消耗与输出项数相同的输入,但你实际只读取了100个输入项,需明确指定消耗输入流0的100项:
// 替换consume_each(noutput_items)为: consume(0, 100);
4. 内存释放的大小写错误
原代码delete[] sig_Data;的变量名是sig_data(小写d),大小写不匹配会导致内存泄漏甚至崩溃,修正为:
delete[] sig_data;
5. 输出项数返回值错误
你需要返回实际生成的32000个输出项,而非noutput_items,让调度器正确处理输出:
// 替换return noutput_items;为: return 32000;
完整修正后的代码片段
void testInAndOut_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) { ninput_items_required[0] = 100; } int testInAndOut_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 *in0 = (const float *) input_items[0]; float *out = (float *) output_items[0]; float *sig_data = new float[100]; // 读取100个输入数据 for (int i = 0; i < 100; i++) { sig_data[i] = in0[i]; } // 生成320组(共32000个)输出数据 for (int i = 0; i < 320; i++) { for (int j = 0; j < 100; j++) { out[i * 100 + j] = sig_data[j]; } } // 消耗100个输入项 consume(0, 100); // 释放内存 delete[] sig_data; // 返回实际生成的输出项数 return 32000; }
额外说明
- GNU Radio调度器会根据
forecast的要求分配输入缓冲区,确保你能拿到足够的输入项; - 若需支持动态输入输出比例,可在
forecast中计算所需输入数,比如ninput_items_required[0] = noutput_items / 320;(需处理整除边界); - 避免在
general_work中频繁使用new/delete,可将内存作为类成员变量预先分配,提升运行性能。
内容的提问来源于stack exchange,提问作者MarkQi
相关产品推荐
相关产品推荐

