如何在FFTW库中实现逆实数FFT

我正在尝试用FFT进行一些过滤。 我正在使用r2r_1d计划,我不知道如何进行逆变换…

void PerformFiltering(double* data, int n) { /* FFT */ double* spectrum = new double[n]; fftw_plan plan; plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT00, FFTW_ESTIMATE); fftw_execute(plan); // signal to spectrum fftw_destroy_plan(plan); /* some filtering here */ /* Inverse FFT */ plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE); fftw_execute(plan); // spectrum to signal (inverse FFT) fftw_destroy_plan(plan); } 

我做的都是对的吗? 我很困惑,因为在FFTW复杂DFT中你可以通过这样的标志设置变换方向:
p = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
要么
p = fftw_plan_dft_1d(N,in,out,FFTW_BACKWARD,FFTW_ESTIMATE);

http://www.fftw.org/fftw3_doc/Real_002dto_002dReal-Transform-Kinds.html

http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html

“种类”指定方向。

(另请注意,您可能希望通过除以n来重新规范化信号.FFTW的归一化约定在变换后与n相乘。)

你做得对。 FFTW_REDFT00表示余弦变换,它是自己的逆变换。 所以没有必要区分“前进”和“后退”。 但是,请注意数组大小。 如果要检测频率为10,并且数据包含100个有意义的点,则数组data应保存101个数据点,并设置n = 101而不是100.标准化应为2*(n-1) 。 请参阅下面的示例,使用gcc ac -lfftw3编译。

 #include  #include  #include  #define n 101 /* note the 1 */ int main(void) { double in[n], in2[n], out[n]; fftw_plan p, q; int i; p = fftw_plan_r2r_1d(n, in, out, FFTW_REDFT00, FFTW_ESTIMATE); for (i = 0; i < n; i++) in[i] = cos(2*M_PI*10*i/(n - 1)); /* n - 1 instead of n */ fftw_execute(p); q = fftw_plan_r2r_1d(n, out, in2, FFTW_REDFT00, FFTW_ESTIMATE); fftw_execute(q); for (i = 0; i < n; i++) printf("%3d %9.5f %9.5f\n", i, in[i], in2[i]/(2*(n - 1))); /* n - 1 instead of n */ fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup(); return 0; }