使用FFTW_EXHAUSTIVE标志进行2D复合FFTW后的结果错误

时间:2017-09-15 13:38:00

标签: 2d fftw

我正在使用FFTW使用此代码计算2D复合体以复合FFT:

#include <stdlib.h>
#include "defines.h"
#include <math.h>
#include <fftw3.h>


int main(void)
{
    fftw_complex *in,*out;
    fftw_plan plan;
    int rows=64;
    int cols=64;
    int i;
    in  = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*rows*cols);
    out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*rows*cols);

    for (i=0; i<rows*cols; i++)
    {
       in[i][0] = input_data[2*i];
       in[i][1] = input_data[2*i+1];;
    }
    printf("### Setting  plan  ###\n");
    plan = fftw_plan_dft_2d(rows, cols, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    printf("### Executing plan ###\n");
    fftw_execute(plan);
    for ( i = 0; i <rows*cols; i++ )
    {
       printf ( "RE = %f \t IM  = %f\n",in[i][0], in[i][1] );
    }
    fftw_destroy_plan(plan);
    fftw_free(in);
    fftw_free(out);
    return 0;
}

现在,我将FFTW标志从ESTIMATE更改为EXHAUSTIVE,以便让规划人员为此2D FFT选择最佳算法,但我得到了全零结果。谁能告诉我有什么问题?

1 个答案:

答案 0 :(得分:2)

使用标志FFTW_ESTIMATE,函数fftw_plan_dft_2d()尝试猜测哪个FFT算法最快,而不运行其中任何一个。使用标志FFTW_EXHAUSTIVE,该函数运行所有可能的算法并选择最快的算法。 问题是在此过程中输入被覆盖。

解决方案是在计划创建之后填充输入数组

请参阅documentation of planner flags

  

重要提示:计划程序会在计划期间覆盖输入数组,除非已为此问题提供已保存的计划(请参阅Wisdom),因此您应在创建计划后初始化输入数据。唯一的例外是FFTW_ESTIMATE和FFTW_WISDOM_ONLY标志,如下所述。