我即将在我的特定任务中使用fftw3库。
我有一个具有可变帧大小的重负载数据包流,其产生方式如下:
while(thereIsStillData){
copyDataToInputArray();
createFFTWPlan();
performExecution();
destroyPlan();
}
由于创建计划相当昂贵,我想将我的代码修改为:
while(thereIsStillData){
if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan();
copyDataToInputArray(); // e.g. `memcpy` or `std::copy`;
performExecution();
}
我可以这样做吗?我的意思是,计划是否包含一些基于数据的重要信息,即为一个大小为N
的数组创建的计划,执行时将为同一大小N
的另一个数组提供不正确的结果。
答案 0 :(得分:1)
fftw_execute()
函数不会修改呈现给它的计划,并且可以使用相同的计划多次调用。但请注意,该计划包含指向输入和输出数组的指针,因此如果copyDataToInputArray()
涉及创建不同的输入(或输出)数组,那么之后您无法使用fftw_execute()
中的旧计划来转换新数据。
FFTW确实有一组" New-array Execute Functions"这可能对此有所帮助,假设新数组满足一些额外的相似性标准(详见链接文档)。
文档建议:
如果您想要使用新数组执行接口,因为您想要转换相同大小的已知数组,您可能应该使用高级接口
但那是在谈论转换同时存在于内存中的多个数组,并以常规方式进行排列。
另请注意,如果你的可变帧大小不是太变量 - 也就是说,如果它总是一个相对较少的选择之一 - 那么你可以考虑保持一个单独的计划每个帧大小的内存,而不是每当一帧的大小与前一帧的大小不同时重新计算一个计划。