Programmation Matlab
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Programmation Matlab



  1. #1
    invite8a011b82

    Programmation Matlab


    ------

    Bonjour,

    J'ai trouvé sur internet un algorithme permettant de calculer la FFT pour 2^n valeurs. Je souhaite l'améliorer afin qu'il puisse calculer la FFT si on à pas 2^n valeurs en entrée, en ajoutant soit des zéros soit des un. La condition que j'ai programmé modifie complètement le résultat final que je mette un 0 ou un 1.

    voici mon code:

    Code:
    if ~(N == 2^n)
        N=N+1;
        x(n+2)=0;
    end;
    Voici le résultat avec la fonction FFT de matlab :
    Code:
    >> y=[1 2 -2];
    >> fft(y)
    
    ans =
    
       1.0000             1.0000 - 3.4641i   1.0000 + 3.4641i

    Voici mes résultats:
    Code:
    >> myfft(y)           %x(n+2)=1
    
    ans =
    
       2.0000          
       3.0000 + 1.0000i
      -4.0000          
       3.0000 - 1.0000i
    
    >> myfft(y)         %x(n+2)=0
    
    ans =
    
       1.0000          
       3.0000 + 2.0000i
      -3.0000          
       3.0000 - 2.0000i

    Voici mon programme :

    Code:
    function X=myfft(x)
    N=length(x);
    n=nextpow2(N);
    
    if ~(N == 2^n)
        N=N+1;
        x(n+2)=1;
    end;
    x=x(:);
    % Classement
    x=classement_fft(x);
    X=zeros(size(x));
    %calcul des k étages 
    for k=1:n %indice des étages
        p=2^(k-1); % le pas entre chaque papillon
        Wb=(-1)^(1/p); % coefficient de base
        M=2^(n-k); % nombre de paquets de papillon
    %calcul des m paquets
        for m=1:M % indice paquet
            W=1; % coéficient de départ
            d=(m-1)*2*p+1; % indice debut paquet
     %calcul des p papillons
            for i=1:p % indice papillon dans paquet
                l=d+i-1; % indice 1er point du papillon
                x(l+p)=W*x(l+p);%multiplication par un coefficient
                X(l)=x(l)+x(l+p);%calcul sortie
                X(l+p)=x(l)-x(l+p);%papillon
                W=W*Wb; %coefficient du papillon suivant pour le prochain passage
            end;
        end;
        x = X; % les sorties de cet étage = entrées étage suivant
    end;

    Ce programme sera ensuite mis dans un microcontroleur c'est pour cela que je n'utilise pas la fonction fft de matlab.

    Merci

    -----

  2. #2
    lou_ibmix_xi

    Re : Programmation Matlab

    Je ne comprends pas ton problème. Le "zero-padding" se fait, comme son nom l'indique, avec des zeros. Si tu utilises autre chose que des zéros, tu n'a plus le même signal en entrée de FFT, c'est bien normal que tu n'est pas le même résultat. Je ne vois pas ce qui te choque là-dedans?
    De plus, la principale difficulté va être de passer l'algorithme en calcul à virgule fixe... A moins que ton micro ai une vraie FPU.
    Dernière modification par lou_ibmix_xi ; 10/10/2011 à 17h15.

  3. #3
    invite8a011b82

    Re : Programmation Matlab

    Bonojur,

    Je ne c'est pas ce qu'est le "zero-padding" ( désolé je ne connais pas beaucoup matlab). Mon problème est que mon algorithme a besoin de 2^n valeur en entrée et donc comme en entrée j'ai un signal analogique que je vais échantillonner avec un CAN, je ne suis pas sur qu'au moment au j’arrête ma mesure d'avoir 2^n valeurs donc je veux combler "le vide" avec une valeur qui ne modifie pas mon résultat final. J'ai essayer 0 et 1 mais les résultats sont différents de celui que j’attendais.

    J'espère avoir été plus clair.

    Merci.

  4. #4
    invite8a011b82

    Re : Programmation Matlab

    Sinon j'ai pensé carrément effectuer mes calculs de FFT tous les 2^n valeurs (soit 256 ou 128 ou même plus tous dépend du temps de rafraichissement des données.

  5. A voir en vidéo sur Futura
  6. #5
    lou_ibmix_xi

    Re : Programmation Matlab

    Le "zero-padding" n'a rien à voir avec MATLAB, c'est une technique qui consiste à combler le signal en entrée de FFT par des zéros pour arriver à un nb de points égal à une puissance de 2 et/ou faire une interpolation de la FFT. Lorsque tu complète ton signal avec des zéros, tu auras une FFT différente de la FFT du signal d'origine mais qui transporte les même informations. Il faudrait que tu te fasses une culture sur la FFT pour que tout ça devienne clair.

  7. #6
    invite8a011b82

    Re : Programmation Matlab

    Ok merci c bon j'ai résolu mon problème en calcula la FFT tous les 2^n valeurs

    voila

    merci

  8. #7
    Jack
    Modérateur

    Re : Programmation Matlab

    Donc en clair tu as résolu un problème de calcul de FFT pour un nombre de point différent de 2^n en la calculant pour 2^n points, c'est çà?

    A+

  9. #8
    invite8a011b82

    Re : Programmation Matlab

    oui c'est bien ça, en consultant plusieurs cours sur le net, j'ai constaté que l'on calcul la FFT que pour 2^n valeurs donc j'ai choisi un pas égal à 2^n valeurs.

Discussions similaires

  1. [matlab] programmation : peut-on générer un arbre des fonctions d'un code Matlab ?
    Par bratisla dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 09/07/2015, 10h12
  2. Programmation matlab
    Par invite2010ce3f dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 29/11/2008, 19h35
  3. Programmation Matlab
    Par invite1caa6d7d dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 18/01/2008, 22h58
  4. programmation matlab
    Par invitefa636c3d dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 05/11/2004, 16h57
  5. programmation matlab
    Par invite7ec2442a dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 29/07/2004, 08h15
Découvrez nos comparatifs produits sur l'informatique et les technologies.