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
Vous devez vous connecter pour publier un commentaire.
Regardant le grand de la documentation pour les fonctions que vous utilisez, vous verrez que vous sont à l'aide de FFT_FORWARD et FFT_BACKWARD, et exactement où il est destiné. Par conséquent, la mise à l'échelle informations que vous avez trouvé précédemment s'applique également ici.
OriginalL'auteur rubenvb
Désolé d'être pointilleux, mais la taille de votre pour out_cpx est incorrect. au lieu d'être longues, il convient de taille/2 + 1. C'est parce que FFT d'un signal réel est Hermitian. Vous pouvez vérifier ce que je dis par l'initialisation de la out_cpx à certains de nombre aléatoire (tous les 3.14159). Exécuter à la fois vers l'avant et vers l'arrière, puis d'imprimer out_cpx à partir de la taille/2 + 1 à la taille. Il n'aura pas changé.
http://www.fftw.org/fftw3_doc/Real_002ddata-DFT-Array-Format.html#Real_002ddata-DFT-Array-Format
OriginalL'auteur engineerchuan
r2c et c2r font essentiellement la même que la transformée de Fourier. La seule différence est que l'entrée et la sortie de la matrice de besoin pour tenir la moitié des nombres. Veuillez prendre un coup d'oeil au dernier paragraphe du manuel de FFTW r2c et c2r. Ainsi, le facteur de normalisation est précisément le nombre d'éléments de la vrai tableau, ou la variable
size
(== 12) dans votre cas.OriginalL'auteur hbp