Fftw3库和计划重用

时间:2016-03-22 14:42:00

标签: c++ c fftw

我即将在我的特定任务中使用fftw3库。

我有一个具有可变帧大小的重负载数据包流,其产生方式如下:

while(thereIsStillData){
   copyDataToInputArray();
   createFFTWPlan();
   performExecution();
   destroyPlan();
}

由于创建计划相当昂贵,我想将我的代码修改为:

while(thereIsStillData){
  if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan();
  copyDataToInputArray(); // e.g. `memcpy` or `std::copy`;
  performExecution();
}

我可以这样做吗?我的意思是,计划是否包含一些基于数据的重要信息,即为一个大小为N的数组创建的计划,执行时将为同一大小N的另一个数组提供不正确的结果。

1 个答案:

答案 0 :(得分:1)

fftw_execute()函数不会修改呈现给它的计划,并且可以使用相同的计划多次调用。但请注意,该计划包含指向输入和输出数组的指针,因此如果copyDataToInputArray()涉及创建不同的输入(或输出)数组,那么之后您无法使用fftw_execute()中的旧计划来转换新数据。

然而,

FFTW确实有一组" New-array Execute Functions"这可能对此有所帮助,假设新数组满足一些额外的相似性标准(详见链接文档)。

文档建议:

  

如果您想要使用新数组执行接口,因为您想要转换相同大小的已知数组,您可能应该使用高级接口

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

另请注意,如果你的可变帧大小不是变量 - 也就是说,如果它总是一个相对较少的选择之一 - 那么你可以考虑保持一个单独的计划每个帧大小的内存,而不是每当一帧的大小与前一帧的大小不同时重新计算一个计划。