2010-12-12 51 views
5

Je suis en train de faire un filtrage avec FFT. J'utilise le plan r2r_1d et je ne sais pas comment faire la transformation inverse ...Comment faire réel inverse FFT réelle dans la bibliothèque FFTW

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

} 

que je fais toutes les choses? Je suis confus parce que dans ce complexe FFTW DFT vous pouvez définir une direction par transform drapeau comme ceci:
p = fftw_plan_dft_1d (N, dedans, dehors, FFTW_FORWARD, FFTW_ESTIMATE);

ou p = fftw_plan_dft_1d (N, IN, OUT, FFTW_BACKWARD, FFTW_ESTIMATE);

Répondre

1

Vous l'avez fait correctement. FFTW_REDFT00 signifie la transformée en cosinus, qui est son propre inverse. Il n'y a donc pas besoin de distinguer "en avant" et "en arrière". Cependant, faites attention à la taille du tableau. Si vous souhaitez détecter une fréquence de 10 et que vos données contiennent 100 points significatifs, le tableau data doit contenir points de données et définir n = 101 au lieu de 100. La normalisation doit être 2*(n-1). Voir l'exemple ci-dessous, compiler avec gcc a.c -lfftw3.

#include <stdio.h> 
#include <math.h> 
#include <fftw3.h> 
#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; 
}