我正在使用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选择最佳算法,但我得到了全零结果。谁能告诉我有什么问题?
答案 0 :(得分:2)
使用标志FFTW_ESTIMATE
,函数fftw_plan_dft_2d()
尝试猜测哪个FFT算法最快,而不运行其中任何一个。使用标志FFTW_EXHAUSTIVE
,该函数运行所有可能的算法并选择最快的算法。
问题是在此过程中输入被覆盖。
解决方案是在计划创建之后填充输入数组!
请参阅documentation of planner flags:
重要提示:计划程序会在计划期间覆盖输入数组,除非已为此问题提供已保存的计划(请参阅Wisdom),因此您应在创建计划后初始化输入数据。唯一的例外是FFTW_ESTIMATE和FFTW_WISDOM_ONLY标志,如下所述。