programmation de la fft en langage C - C - Programmation
Marsh Posté le 24-05-2013 à 15:44:29
Je ne sais pas d'où tu as eu ce code, mais il y a un paquet de trucs qui ne collent pas :
Il y a des bibliothèques toute faite pour calculer la FFT... veux-tu vraiment réinventer la roue carrée ?
Marsh Posté le 24-05-2013 à 15:59:34
c'est mon tuteur qui a récupéré ces codes apparemment avec d'autres personnes ; il m'en a donné des tonnes afin que j'y puise les ressources nécessaires à mon projet.
Oui je suis justement en train de récupérer ces bibliothèques FFT pour les utiliser, merci beaucoup tpierron !
Marsh Posté le 24-05-2013 à 13:51:47
Bonjour à tous,
Je suis actuellement stagiaire dans une petite start up, et je dois réaliser l'acquisition de spectres d'absorption à partir d'un capteur ;
...Mais pour l'instant j'en suis encore à la simulation, et un j'ai un probleme concernant le calcul de la fft de mon tableau de valeurs, qui je précise m'a été donné et que je devais utiliser et réajuster selon mes besoins ;
Donc ci-dessous je vous ai mis le code, sur lequel ( sur codeblock ) il ne m'affiche 2 erreurs sur "*in" et sur "*out" en me disant : "error : invalid type argument of unary '*' (have 'int')".
=> J'ai donc remplacé par les tableaux vers lesquels ces pointeurs pointent mais ça ne marche toujours pas.
Est ce que l'un d'entre vous saurait la raison de mon probleme ( en sachant que normalement mon printf dans le main doit m'afficher le résultat de la fft.
Merci d'avance pour votre aide.
/* ****** CODE FFT ****** */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
fft_(n,pw,in,out);
float x[]= {
0.058239,
0.05822,
0.058966,
0.05928,
0.061801,
0.062823,
0.064514,
0.065286,
0.066999,
0.064993,
0.069892,
0.070769,
0.070767,
0.073237,
0.073739,
0.076339,
0.074125
};
float y[];
float re[], im[];
float *in, *out;
int n=20;
int pw=2;
int i, count;
int main()
{
in=x;
out=y;
fft_(n,pw,in,out);
for(i=0;i<n;i++)
printf("%f\n", *out++);
return 0;
}
fft_(n,pw,in,out)
{
float a,c,e,s,re_,im_;
int i,j,k,l,n1,n2;
for(i=1;i<=n;i++)
{ re[i]=*in;
im[i]=0.0;
in++;
}
n2=n;
for(k=1;k<=pw;k++)
{ n1=n2;
n2=n2/2;
e=6.2831853071795865/n1;
a=0.0;
for(j=1;j<=n2;j++)
{ c=cos((float)a);
s=sin((float)a);
a=j*e;
for(i=j;i<=n;i+=n1)
{ l=i+n2;
re_ =re[i]-re[l];
re[i]=re[i]+re[l];
im_ =im[i]-im[l];
im[i]=im[i]+im[l];
re[l]=c*re_+s*im_;
im[l]=c*im_-s*re_;
}
}
}
j=1;
n1=n-1;
for(i=1;i<=n1;i++)
{ if(i<j)
{ re_=re[j];
re[j]=re[i];
re[i]=re_;
im_ =im[j];
im[j]=im[i];
im[i]=im_;
}
k=n/2;
while(k<j)
{ j=j-k;
k=k/2;
}
j=j+k;
}
for(i=1;i<=n;i++)
{
*out=sqrt((float)(re[i]*re[i]/((float)n*(float)n)+im[i]*im[i]/((float)n*(float)n)));
out++;
}
}