我将在我非常确定的任务中使用 fftw3 库。
我有一个具有可变帧大小的重负载数据包流,其生成方式如下:
while(thereIsStillData){
copyDataToInputArray();
createFFTWPlan();
performExecution();
destroyPlan();
}
由于创建计划相当昂贵,我想将代码修改为如下所示:
while(thereIsStillData){
if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan();
copyDataToInputArray(); // e.g. `memcpy` or `std::copy`;
performExecution();
}
我可以这样做吗?我的意思是,计划是否包含一些基于数据的重要信息,例如为大小为 N
的一个数组创建的计划,执行时将为相同大小的其他数组提供不正确的结果 N
。
最佳答案
fftw_execute()
函数不会修改提供给它的计划,并且可以使用同一计划多次调用。但请注意,该计划包含指向输入和输出数组的指针,因此如果 copyDataToInputArray()
涉及创建不同的输入(或输出)数组,则您之后无法在 中使用旧计划fftw_execute()
转换新数据。
但是,FFTW 确实有一组“New-array Execute Functions ”可以在这里提供帮助,假设新数组满足一些相对于旧数组的附加相似性标准(有关详细信息,请参阅链接文档)。
文档确实建议:
If you are tempted to use the new-array execute interface because you want to transform a known bunch of arrays of the same size, you should probably go use the advanced interface instead
但这指的是同时转换内存中的多个数组,并以规则的方式排列。
还要注意,如果您的可变帧大小不太可变——也就是说,如果它始终是相对较少的选择之一——那么您可以考虑保留一个单独的为每个帧大小在内存中进行计划,而不是每次一帧的大小与前一帧的大小不同时重新计算计划。
关于c++ - Fftw3 库和计划重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36157465/