Bonjour à tous,
Je suis en train d'implanter un algorithme de FFT dans un microcontrôleur infineon. Je travaille avec le compilateur C166.
Pour ce qui est de l'algo utilisé, il s'agit d'une fonction que j'ai dégoté sur le net dans le "Numerical Recipes".
Pour ce qui est des premiers tests, j'ai intégré un tableau contenant les valeurs d'une sinus plus ou moins déformé (les valeurs sont réels).
Lorsque je test ma fonction je me retrouve avec une valeur moyenne égale à 0. Un fondamental égal à une certaine valeur (élevé). Puis après alors que je devrais passer à mon rang 2,3, ..... ( qui sont égal à 0 dans le cas d'une sinus pure) j'ai une autre valeur qui est environ d'1/5 de mon fondamental. Je n'arrive pas à identifier ce qu'est cette valeur. Peut être pouvez vous m'en dire plus à se sujet?
Par la suite, lorsque je déforme ma sinus ( en intégrant du rang 2 et 3 par exemple) je ne suis pas super précis dans les valeurs que j'obtiens en sortie de la FFT. Si vous pouviez m'en dire plus afin que j'améliore mes résultats? Pour l'instant sur mes premiers essais je faisais une FFT sur 32 points avec une seule sinusoïde dans le tableau de valeur.
Voici le code que j'utilise :
Et voici comment la fonction est intégré dans le main :Code:void FFT(unsigned long nn, int isign) { unsigned long n,mmax,m,j,istep,ie; double wtemp,wr,wpr,wpi,wi,theta; float tempr,tempi; n=nn << 1; j=1; for (ie=1;ie<n;ie+=2) { if (j > ie) { SWAP(tabValeurFFT_FOURIER[j],tabValeurFFT_FOURIER[ie]); SWAP(tabValeurFFT_FOURIER[j+1],tabValeurFFT_FOURIER[ie+1]); } m=nn; while (m >= 2 && j > m) { j-=m; m >>= 1; } j+=m; } mmax=2; while (n > mmax) { istep=mmax << 1; theta=isign*(6.28318530717959/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m<mmax;m+=2) { for (ie=m;ie<=n;ie+=istep) { j=ie+mmax; tempr=wr*tabValeurFFT_FOURIER[j]-wi*tabValeurFFT_FOURIER[j+1]; tempi=wr*tabValeurFFT_FOURIER[j+1]+wi*tabValeurFFT_FOURIER[j]; tabValeurFFT_FOURIER[j]=tabValeurFFT_FOURIER[ie]-tempr; tabValeurFFT_FOURIER[j+1]=tabValeurFFT_FOURIER[ie+1]-tempi; tabValeurFFT_FOURIER[ie] += tempr; tabValeurFFT_FOURIER[ie+1] += tempi; VisuVariable2=tempi; } wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax=istep; } for(ie=0;ie<1024;ie++) { VisuTabFFT[ie]=tabValeurFFT_FOURIER[ie]; } }
MerciCode:for (i=0; i<32; i++) { sample= 32000*(1-K2xJPN-K3xJPN)*sin(((float)i/32)*2*3.141592653589793)+32000*K2xJPN*sin(((float)i/32)*2*2*3.141592653589793)+32000*K3xJPN*sin(((float)i/32)*3*2*3.141592653589793)+32000; tabValeurFFT_FOURIER[2*i]=sample; tabValeurFFT_FOURIER[2*i+1]=0; } nbSample=32; isigne= 1; four1(nbSample,isigne); while(i<255) { tabMiseForme[i] = sqrt((tabValeurFFT_FOURIER[i]*tabValeurFFT_FOURIER[i])+(tabValeurFFT_FOURIER[i+1]*tabValeurFFT_FOURIER[i+1])); i=i+2; }
-----