2016-04-28 2 views
2

J'essaie de faire ifft et fft sur un tableau à virgule flottante. Cependant, le résultat est le même pour les deux. Avez-vous une idée? Pourquoi les résultats sont-ils les mêmes, même si j'utilise FFTW_FORWARD pour un et FFTW_BACKWARD pour un autre?FFT et IFFT avec FFTW

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); 

Répondre

4

Vous affichez uniquement les parties réelles des réceptacles de sortie et ignorez les composants imaginaires. Il se trouve que les parties réelles correspondent, mais les composants imaginaires sont différents (ils sont conjugués réellement complexes):

#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; 
} 

compilez et exécutez:

$ 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 

Il est intéressant de noter que la FFT et IFFT sont mathématiquement presque identiques. Ils sont souvent tous deux implémentés comme une seule routine, avec un drapeau indiquant la direction (avant ou inverse). Typiquement, ce drapeau affecte juste le signe de la partie imaginaire des facteurs de twiddle.

+1

génial! Merci beaucoup! –