2010-12-12 16 views
5

Sto provando a fare un po 'di filtraggio con FFT. Sto usando r2r_1d piano e non ho idea di come fare l'inverso trasformare ...Come eseguire l'inverso reale a FFT reale nella libreria 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); 

} 

sto facendo tutte le cose giuste? Sono confuso perché nei DFT complessi FFTW è possibile impostare una direzione di trasformazione per flag in questo modo:
p = fftw_plan_dft_1d (N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
o
p = fftw_plan_dft_1d (N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);

risposta

1

avete fatto correttamente. FFTW_REDFT00 significa la trasformazione del coseno, che è la sua stessa inversa. Quindi non c'è bisogno di distinguere "avanti" e "indietro". Tuttavia, fai attenzione alle dimensioni dell'array. Se si desidera rilevare una frequenza di 10 e i dati contengono 100 punti significativi, l'array data deve contenere i punti di dati e impostare n = 101 anziché 100. La normalizzazione dovrebbe essere 2*(n-1). Vedere l'esempio di seguito, compilare con 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; 
}