le calcul de la fft et ifft avec fftw.h en C

Salut à tous
Je suis l'aide de la fftw bibliothèques C pour calculer le spectre de fréquence pour certaines applications de traitement du signal sur des systèmes embarqués. Cependant, dans mon projet, j'ai couru dans une légère hinderence.

Ci-dessous un simple programme que j'ai écrit pour m'assurer que je suis la mise en œuvre de la fftw fonctionne correctement. Fondamentalement, je veux calculer la fft d'une séquence de 12 numéros, puis de faire de la ifft et obtenir la même séquence de nombres à nouveau. Si vous avez fftw3 et gcc installé ce programme devrait fonctionner si vous compilez avec:

gcc -g -lfftw3 -lm fftw_test.c -o fftw_test

Actuellement mon fft la longueur est la même taille que le tableau d'entrée.

#include <stdio.h>
#include <stdlib.h>
#include <sndfile.h>
#include <stdint.h>
#include <math.h>
#include <fftw3.h>

int main(void)
{
double array[] = {0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1,0};
//double array2[] = {1, 6, 1, 4, 5, 0, 8, 7, 8, 6, 1,0};
double *out;
double *err;
int i,size = 12;

fftw_complex *out_cpx;

fftw_plan fft;
fftw_plan ifft;
out_cpx = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*size);
out = (double *) malloc(size*sizeof(double));
err = (double *) malloc(size*sizeof(double));

fft = fftw_plan_dft_r2c_1d(size, array, out_cpx, FFTW_ESTIMATE);  //Setup fftw plan for fft
ifft = fftw_plan_dft_c2r_1d(size, out_cpx, out, FFTW_ESTIMATE);   //Setup fftw plan for ifft

fftw_execute(fft);
fftw_execute(ifft);

//printf("Input:    \tOutput:    \tError:\n");
printf("Input:    \tOutput:\n");
for(i=0;i<size;i++)
{
err[i] = abs(array[i] - out[i]);    
printf("%f\t%f\n",(array[i]),out[i]);
//printf("%f\t%f\t%f\n",(array[i]),out[i],err[i]);
}

fftw_destroy_plan(fft);
fftw_destroy_plan(ifft);
fftw_free(out_cpx);
free(err);
free(out);
return 0;
}

Qui Produit la sortie suivante:

Input:      Output:
0.100000    1.200000
0.600000    7.200000
0.100000    1.200000
0.400000    4.800000
0.500000    6.000000
0.000000    0.000000
0.800000    9.600000
0.700000    8.400000
0.800000    9.600000
0.600000    7.200000
0.100000    1.200000
0.000000    0.000000

Alors, évidemment, la ifft est la production de certains mis à l'échelle de résultat. Dans le fftw docs trouvés ici:
fftw docs sur l'extension de.
Il mentionne à propos de certains d'échelle, cependant, je suis en utilisant le "r2c" et "c2r" transforme plutôt que de la FFT_FORWARD et FFT_BACKWARD. Aucune information serait appréciée.

OriginalL'auteur digiphd | 2011-04-28