2016-04-28 94 views
2

我想在浮点数组上做ifft和fft。然而,两者的结果是相同的。你有什么主意吗? 为什么结果是相同的,即使我使用FFTW_FORWARD而使用另一个FFTW_BACKWARD?用FFTW FFT和IFFT

int N=16; 
    fftwf_complex in[N], out[N]; 
    fftwf_plan p1, q; 

    /* prepare a cosine wave */ 
    for (i = 0; i < N; i++) { 
    in[i][0] = cos(3 * 2*M_PI*i/N); 
    in[i][1] = 0; 
    } 

    /* forward Fourier transform, save the result in 'out' */ 
    p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwf_execute(p1); 
    for (i = 0; i < N; i++) 
    cout << out[i][0] << endl; 
    fftwf_destroy_plan(p1); 

    printf("\nInverse transform:\n"); 
    q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwf_execute(q); 
    for (i = 0; i < N; i++) 
    cout << out[i][0] << endl; 
    fftwf_destroy_plan(q); 

回答

4

您只显示输出箱的实际部分,而忽略虚部。碰巧的是,真正的零件匹配,但虚部不同(它们实际上是共轭复数):

#include <iostream> 
#include <cmath> 
#include "fftw3.h" 

using namespace std; 

int main() 
{ 
    int N=16; 
    fftwf_complex in[N], out[N]; 
    fftwf_plan p1, q; 

    for (int i = 0; i < N; i++) { 
     in[i][0] = cos(3 * 2*M_PI*i/N); 
     in[i][1] = 0; 
    } 

    p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftwf_execute(p1); 
    for (int i = 0; i < N; i++) 
     cout << out[i][0] << " + j" << out[i][1] << endl; // <<< 
    fftwf_destroy_plan(p1); 

    printf("\nInverse transform:\n"); 
    q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); 
    fftwf_execute(q); 
    for (int i = 0; i < N; i++) 
     cout << out[i][0] << " + j" << out[i][1] << endl; // <<< 
    fftwf_destroy_plan(q); 

    return 0; 
} 

编译并运行:

$ g++ -Wall fftwf.cpp -lfftw3f && ./a.out 

3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
-3.67394e-16 + j0 
8 + j-7.34788e-16 
3.67394e-16 + j0 
2.38419e-07 + j7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
-3.67394e-16 + j0 
2.38419e-07 + j-7.34788e-16 
3.67394e-16 + j0 
8 + j7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 

Inverse transform: 
3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
8 + j7.34788e-16 
3.67394e-16 + j0 
2.38419e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 
3.67394e-16 + j0 
1.19209e-07 + j-7.34788e-16 
-3.67394e-16 + j0 
2.38419e-07 + j7.34788e-16 
3.67394e-16 + j0 
8 + j-7.34788e-16 
-3.67394e-16 + j0 
1.19209e-07 + j7.34788e-16 

有趣的是要注意的是,FFT和IFFT在数学上几乎相同。它们通常都是作为一个单一的例程来实现的,其中一个标志指示方向(正向或反向)。通常这个标志只影响旋转因子的虚部的符号。

+1

太棒了!非常感谢! –