Fftw3 库和计划重用

Fftw3 library and plans reuse

我即将在我的特定任务中使用 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

但那是在谈论转换同时在内存中并以规则方式排列的多个数组。

还要注意,如果您的可变帧大小不是 可变的——也就是说,如果它始终是相对较少的选择之一——那么你可以考虑在内存中为每个帧大小保留一个单独的计划,而不是每次一个帧的大小与前一个帧的大小不同时重新计算计划。