Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Soucis d'implantation d'une fonction FFT dans un microcontrolleur



  1. #1
    transti

    Soucis d'implantation d'une fonction FFT dans un microcontrolleur


    ------

    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 :
    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];
    	}
    }
    Et voici comment la fonction est intégré dans le main :
    Code:
    	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;
        }
    Merci

    -----
    Dernière modification par transti ; 10/03/2014 à 09h51.

  2. #2
    luc_1049

    Re : Soucis d'implantation d'une fonction FFT dans un microcontrolleur

    Bonjour

    Quelques idées dans mes souvenirs :
    -Je suppose que vour respectez la condition de shanon fe/2 max,
    -Quelle fenêtre d'échantillonage avez vous paramétré c'est elle qui crée des rebonds,
    -Peut être avez vous des arrondis selon la déclaration des variables faites et la possibilité de votre micro contrôleur.

    cdlt

  3. #3
    transti

    Re : Soucis d'implantation d'une fonction FFT dans un microcontrolleur

    Hello,

    Bon après avoir creusé le truc à fond j'ai réussi à la faire fonctionner cette FFT.
    J'arrive, lorsque je crée ma sinus de 32, 64,128, .....points à obtenir les valeurs exactes des harmoniques que j'injecte dans la sinus de base.

    Cependant, mon application ne fonctionnera pas avec cette sinusoïde que j'ai créé de toute pièce mais avec une sinus venant de l'extérieur que j'aurais échantillonné. J'obtiens 39 échantillons pour une alternance ( et je ne peux pas changer). 39 étant bien différent de 32 ou de 64 j'ai donc eu l'idée de faire une extrapolation linéaire pour diminuer mon nombre de points à 32 mais dans ce cas là, lorsque je fais la FFT, j'obtiens des valeurs d'harmonique erronées. L'erreur augmente plus le rang augmente (ex : rang 2 = 1%d'erreur, rang 3 = 2% , rang 5 = 7%).
    J'ai vais donc fouiller du côté de l'interpolation par ajout de 0, vu qu'il s'agit d'une technique nommée dans plusieurs documents. On verra si ça fonctionne.

Discussions similaires

  1. implantation d'une fonction contenant une integrale sur matlab
    Par mecatunis dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 20/05/2011, 21h55
  2. Petit soucis avec une fonction...
    Par FanatiC972 dans le forum Mathématiques du collège et du lycée
    Réponses: 8
    Dernier message: 12/04/2010, 01h33
  3. soucis avec l'étude d'une fonction trigonométrique
    Par Mathildaa dans le forum Mathématiques du collège et du lycée
    Réponses: 15
    Dernier message: 20/10/2007, 18h15
  4. Réponses: 6
    Dernier message: 03/03/2007, 15h23
  5. pas d implantation ..
    Par okinawasz dans le forum Électronique
    Réponses: 2
    Dernier message: 15/09/2006, 14h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.