c++ - Fftw3 库和计划重用

标签 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

最佳答案

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/

相关文章:

c++ - 如何从主线程(从中创建)停止和销毁线程

python - 在 python 中获取用于执行使用多个线程的进程的实时输出?

c++ - fft 的逆 fft 不返回预期数据

c++ - 如何获取 vector 队列的前端或顶部元素?

c++ - 如何在不导致内存泄漏的情况下使用 QSGGeometryNode 并确保正确清理

c++ - boost::trim std::vector<std::string> 中的每个字符串

c++ - 创建不带 PIPE_REJECT_REMOTE_CLIENTS 的NamedPipe

c - Mac OSX - 启动 Shell 和工作目录

c - 在 C 中,在结束前包含 NULL 的内存块上调用 free() 是否安全?

c++ - 如何在Qt中使用fftw库