Inverse FFT (matlab)
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Inverse FFT (matlab)



  1. #1
    invite9c7554e3

    Inverse FFT (matlab)


    ------

    Salut tous,

    je vous explique mon soucis, merci de me dire si vous avez une idée d'où mes problèmes viennent

    Tout d'abord, voici le contexte
    - j'ai une courbe bruité et j'ai fais une FFT de ce signal sous matlab afin d'avoir le spectre du signal.
    - les j'ai environ 6000 fréquences et celles qui me dérange sont les basses fréquences et quelques autres que je n'ai pas encore très bien identifiées.
    - pour commencer à filtrer j'ai essayé des filtres sous matlab mais apparemment ils ne semblent pas convenir à ma situation car tous les filtres
    que j'utilise déforment mon signal sur des zones que je ne veux pas (les pentes ne sont plus respectées).
    - Du coup, j'ai voulu annuler les fréquences basses de mon signal à l'aide de matlab et reconstruire le signal temporel à l'aide d'une FFT inverse.

    Résultats
    - Lorsque je passe de mon spectre (où j'ai mis les amplitudes à 0 pour les basses fréquences) à un signal temporelle à l'aide d'une FFT inverse j'ai un soucis :

    ==> la forme du signal résultant est nickel mais l'amplitude de la courbe n'est plus la même que celle du signal de départ ! (l'amplitude à diminuée)


    Explication

    du coup, je voudrais savoir si vous pourriez m'expliquer pourquoi mon amplitude générale à diminuer ? et comment la remettre à son niveau de départ.
    => je précise que si je fais une FFT de mon signal et une FFT inverse tout de suite après ça marche nickel
    => c'est lorsque je supprime des amplitudes de la FFT que je perds en amplitude globale.

    Ce qui m'etonne là dedans est que j'ai fais un test :
    => mettre toutes les amplitudes maximale du signal à 0 et je m'attendais au même résultat, mais là non... mon amplitude est bonne

    -----

  2. #2
    phuphus

    Re : inverse FFT (matlab)

    Bonsoir,

    pourrais-tu mettre ton code ? D'instinct, je pense que tu as oublié de supprimer les coefficients symétriques. Donc quand tu choisis tes fréquences, tu omets toutes celles de l'autre côté de la fréquence de Nyquist, alors que quand tu détectes les amplitudes max forcément ton algorithme les efface deux par deux.

  3. #3
    invite9c7554e3

    Re : inverse FFT (matlab)

    Oui, en effet c'est une chose que j'ai oublié mais comme je suis pas trop à l'aise encore avec les FFT je n'ai pas trop compris comment faire

    je crois que j'ai aussi un autre probleme dans le code :
    Code:
     noms='bruit.dat';
    donnees=importdata(noms);data=donnees.data;x=data(:,1)';y=data(:,5)';
    x=x-x(1);
    tempsEssai=x(end)-x(1);
    nbPoints=length(x);
    f_Echantillonage=nbPoints/tempsEssai;
    T=1/f_Echantillonage;
    t=T*(0:nbPoints-1);
    NFFT = nbPoints; %cas non precis mais marche bien ici
    Yfft=fft(y,NFFT)
    f=f_Echantillonage/2*linspace(0,1,NFFT/2);
    yInverse=ifft(Yfft);
    YfftModif=Yfft;
    nbFrequencesOK = 3000;
    [dump IxMin]=sort(x);
    for j=1:length(x)
        if(any(j==IxMin(1:nbFrequencesOK)))
            YfftModif(j)=YfftModif(j);
        else
            YfftModif(j)=0;
        end
    end
    yInverseModif=ifft(YfftModif);

  4. #4
    invite9c7554e3

    Re : inverse FFT (matlab)

    Code:
    Yfft=fft(y,NFFT)
    YfftModif=Yfft;
    nbFrequencesOK = 3000;
    [Xmin IxMin]=sort(x);
    for j=1:length(x)
        if(any(x(j)==Xmin(1:nbFrequencesOK)))
            %
        else
            YfftModif(j)=0;
        end
    end
    yInverseModif=ifft(YfftModif);
    j'ai modifié la fin du bout de code qu'il y avait plus haut car j'avais fais une petite erreur...
    A présent tout va bien à part la gestion de la symétrie (et mon probleme d'amplitude de mes courbes qui ont beaucoup diminuées -> mais ça doit être lié à ce probleme de symétrie)

    Je tente une explication, peux tu me dire si c'est correct ?
    - je prends mon vecteur de fréquence et je le divise en deux
    - dans ce vecteur j'efface les amplitude des fréquences les plus hautes
    - ensuite j'efface aussi les amplitudes des fréquences symétrique par rapport à la fréquence moyenne ?
    - ensuite j'effectue ma transformée de Fourier inverse ?

    j'ai peut etre un autre soucis : mon vecteur de frequence n'est pas une puissance de 2 ?
    du coup ça peut poser probleme lors de l'utilisation d'une transformée de fourier inverse "ifft" ?
    si oui pk ? (je n'ai pas trop compris pk en general on veut un vecteur multiple de 2)

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

    Re : inverse FFT (matlab)

    Bonjour,

    Quels filtres as tu essayé ?
    En traitement de signal logiciel, il est très facile de se façonner un filtre à la main. Le + efficace c'est de dimensionner un filtre FIR (fonction fir1 dans matlab .. ça prend 5 secondes) avec une fenêtrage pas trop abrupt (Hanning ...).
    Le seul effet est que ton signal filtré est aussi retardé de N échantillons (N = ordre du filtre, en général autour de 100 ... donc filtre très sélectif) ... ça devrait supprimer les composantes fréquentielles qui te gênent.

    PS : la méthode que tu as employée c'est d'une certaine façon une méthode de filtrage ... mais artisanale et sans fondement mathématique à mon avis.

    Bonne journée

  7. #6
    invite9c7554e3

    Re : inverse FFT (matlab)

    Salut et merci bcp d'avoir pris le temps de repondre.

    J'ai essayé deux choses en filtrage :
    1) filtre FIR
    2) filtre Butterworth

    Les soucis liés a l'utilisation des filtres pour moi :
    1) je n'y connais rien du tout en filtrage
    (Fenestrage je vois meme pas ce c'est donc je n'utilise pas)
    => pr choisir l'ordre du filtre ...etc je ne c pas trop comment faire
    => pour couper des frequences entre 40 et 60Hz par exemple je n'ai pas veaiment compris
    Coment faire (car il y a des histoires de normalisation)
    2) mon deuxieme soucis est que lorsqye j'ai essayé du filtrage et que par hasard j'arrivé a faire quelque chose mon filtrage introduisé un dephasage de ma courbe. Or, dans application un dephasage n'est pas du tout acceptable.
    => aussi, lorsque je filtrais. J'avais mes pentes qui etait modifiees ...
    (J'ai un signal un peut pret triangulaire avec un plateau entre la phase de mintee et la descente
    Et je veux filtrer le bruit sur les plateaux en conservant les pentes de mon triangle)

    ==> si tu as des exemples simples de prgramme matlab pr faire du filtrage coupe bande
    Je suis preneur.
    ==> sinon, j'aimerai bien aller au bout egalement de ma methode car elle de donne exactement
    Ce que je souhaite. Le seul soucis est que l'amplitude de mes courbes sont modifiees.
    (Ça doit venir du faite que je ne sais pas trop comment gerer ces histoire de lien entre spectre symetrique et IFFT)

    Merci pr l'aide qye vs pourrez m'apporter pr ces deux methodes

    A+

  8. #7
    erff

    Re : inverse FFT (matlab)

    Bonsoir
    Les soucis liés a l'utilisation des filtres pour moi :
    1) je n'y connais rien du tout en filtrage
    (Fenestrage je vois meme pas ce c'est donc je n'utilise pas)
    => pr choisir l'ordre du filtre ...etc je ne c pas trop comment faire
    => pour couper des frequences entre 40 et 60Hz par exemple je n'ai pas veaiment compris
    Coment faire (car il y a des histoires de normalisation)
    J'espère que tu comprendras que je ne peux pas me permettre de te faire un cours sur le filtrage numérique, car il te faut partir de la base. Vu que tu sembles maîtriser le formalisme de Fourier, je pense que tu as les nécessaire pour comprendre. Je te conseille de te procurer un bon bouquin là dessus (les BU en regorgent !). Je n'ai pas de référence en tête ...

    mon deuxieme soucis est que lorsqye j'ai essayé du filtrage et que par hasard j'arrivé a faire quelque chose mon filtrage introduisé un dephasage de ma courbe
    Un filtre FIR introduit un retard global du signal de N/2 échantillons (et pas N) où N est l'ordre du filtre (supposé pair) ... Dit autrement, les FIR sont des filtres à phase linéaire.. et logiciellement, il te suffit de décaler l'origine des temps de N*T_ech pour retrouver ton signal filtré non retardé (très simple à faire non ?). C'est le genre de truc que tu ne peux faire qu'en numérique ! Compare cela aux filtres IIR (genre les filtres analogiques classiques) : le déphasage dépend de la fréquence sous forme d'une fonction arctan ... donc c'est encore pire, chaque composante fréquentielle est déphasée de façon non linéaire !

    => aussi, lorsque je filtrais. J'avais mes pentes qui etait modifiees ...
    Tout dépend de la valeur de la pente ... si c'est une pente abrupte et que tu mets un passe-bas d'ordre très élevé, elle sera absorbée par le filtre ...

    Voici un exemple :
    On a un signal s=sin(2*pi*t) + 0.5*sin(2*pi*5*t) ---> une composante à 1Hz et une composante à 5Hz que l'on veut éliminer.
    Code:
    t = 0:0.01:10; % Echantillonnage à 100Hz donc la fréquence de Nyquist est de 50Hz !
    s = sin(2*pi*t) + 0.5*sin(2*pi*5*t);
    % On va dire que notre stop-bande est comprise entre 3Hz et 7Hz donc si on normalise par rapport à la fréquence de Nyquist c'est 0.06 et 1.4;
    Frequences_coupure = [0.06, 0.14];
    coeffs_du_filtre = fir1 (100, Freq, 'stop'); % Filtre Fir d'ordre 100, coupant à 3Hz et 7Hz (attention on normalise par rapport à F_Nyquist) avec un fenêtrage de Hanning (par défaut)
    s_filtre = filter (coeffs_du_filtre, 1, s);  % On applique le filtre à s, le numérateur du filtre est coeffs_du_filtre, le dénominateur vaut 1 car c'est un FIR
    plot (t,[signal;signal_filtre;sin(2*pi*t)]); % Affichage
    Tu constateras que la composante 5Hz a bel et bien disparu ... par contre en effet, le signal filtré est retardé de 50 échantillons (500ms).
    Tu peux t'amuser à mettre d'autre type de fenêtrage ... tu verras que cela a une petite influence sur l'amplitude du signal filtré, car en fonction du fenetrage choisi on observe une ondulation dans la bande passante ce qui fait que les fréquences passantes sont parfois très légèrement amplifiées ou atténuées (ici le 1Hz est très légèrement atténué).
    Dernière modification par erff ; 12/10/2012 à 23h08.

  9. #8
    invite9c7554e3

    Re : inverse FFT (matlab)

    Merci bcp erff pour tes reponses !

    Je vais regarder de nouveau le filtrage pr voir si
    J'arrive a cooriger les soucis que j'avais grace a tes conseils.

    Sinon pour ce qui est de la FFT inverse as tu une idee sur comment supprimer les frequences qui me gene de façon propre? (En prenant en compte la symetrie de la FFT egalement)

  10. #9
    erff

    Re : inverse FFT (matlab)

    Pour moi une méthode propre et recevable scientifiquement parlant est une méthode qui a fait ses preuves et qui est maîtrisée avec nos outils théoriques.
    Donc pour moi, il faut utiliser les méthodes qui ont fait leurs preuves : filtres IIR, FIR ... avec une des méthodes de design préconisées et largement étudiée dans la littérature.
    Il existe peut-être une méthode de design + adaptée à ton pb, je pense que ton cas a déjà été traité par d'autres : il est alors bien plus rentable d'aller faire un peu de bibliographie avant de vouloir réinventer une roue qui ne tourne pas rond.

  11. #10
    phuphus

    Re : inverse FFT (matlab)

    Bonsoir,

    Citation Envoyé par MembreComplexe12
    Je tente une explication, peux tu me dire si c'est correct ?
    - je prends mon vecteur de fréquence et je le divise en deux
    - dans ce vecteur j'efface les amplitude des fréquences les plus hautes
    - ensuite j'efface aussi les amplitudes des fréquences symétrique par rapport à la fréquence moyenne ?
    - ensuite j'effectue ma transformée de Fourier inverse ?
    Dans le principe, c'est OK. Il ne faut pas se planter sur l'indice de la fréquence de Nyquist, car le premier coef de ta FFT est la composante continue. Donc avec une FFT de 1024 points, le "pivot" est le 513ème point. Si le nombre de points de la FFT est impair, le pivot se situe sur un indice demi-entier.

    Citation Envoyé par MembreComplexe12
    j'ai peut etre un autre soucis : mon vecteur de frequence n'est pas une puissance de 2 ?
    du coup ça peut poser probleme lors de l'utilisation d'une transformée de fourier inverse "ifft" ?
    si oui pk ? (je n'ai pas trop compris pk en general on veut un vecteur multiple de 2)
    Aucun soucis sur la puissance de 2. Un calcul de FFT présente de nombreuses opérations redondantes. Plus la simplification en facteurs premiers du nombre de points est grande, plus ces opérations redondantes sont nombreuses, et plus l'algorithme FFT est efficace (c'est le premier "F" de FFT = Fast). Tu peux t'amuser à faire un benchmark de FFT de 1024 points (2^10) et 1021 points (nombre premier), tu te rendras compte de la différence.

    Il y a trois gros problèmes dans ton code tel que donné dans le message #4 :
    - tu prends x comme vecteur de fréquence au lieu de f
    - tu tries x (au lieu de f, donc) alors qu'il n'a besoin d'aucun tri
    - ton code est illisible

    Pourrais-tu mettre en PJ, s'il n'y a pas de confidentialité, "bruit.dat" ?

    De plus, je te suggère ceci pour la lisibilité du code, à toi de voir :
    Code:
    % Suppression de fréquences par FFT
    
    clear all ;
    clc ;
    
    % Recopie du code de MembreComplexe12
      % Chargement des données
        noms    = 'bruit.dat'      ;
        donnees = importdata(noms) ;
        data    = donnees.data     ;
        x       = data(:,1)'       ;
        y       = data(:,5)'       ;
        x       = x-x(1)           ;
        
      % Définition et calcul des données utiles
        tempsEssai       = x(end) - x(1)         ;
        nbPoints         = length(x)             ;
        f_Echantillonage = nbPoints / tempsEssai ;
        T                = 1 / f_Echantillonage  ;
        t                = T * (0:nbPoints-1)    ;
        NFFT             = nbPoints              ; %cas non precis mais marche bien ici
        
      % Traitement
        Yfft           = fft(y,NFFT)                               ;
        f              = f_Echantillonage / 2*linspace(0,1,NFFT/2) ;
        yInverse       = ifft(Yfft)                                ;
        YfftModif      = Yfft                                      ;
        nbFrequencesOK = 3000                                      ;
        [Xmin IxMin]   = sort(x)                                   ;
        
        for j=1:length(x)
            if(any(x(j)==Xmin(1:nbFrequencesOK)))
                %
            else
                YfftModif(j) = 0 ;
            end
        end
        
        yInverseModif=ifft(YfftModif) ;

  12. #11
    phuphus

    Re : inverse FFT (matlab)

    Bonsoir,

    Citation Envoyé par erff Voir le message
    Le + efficace c'est de dimensionner un filtre FIR (fonction fir1 dans matlab .. ça prend 5 secondes) avec une fenêtrage pas trop abrupt (Hanning ...).
    Je suppose que tu as voulu écrire "Hamming". La fenêtre de Hanning n'est pas disponible pour fir1, du moins sur la version 6.1 de Matlab.

    Citation Envoyé par erff
    Le seul effet est que ton signal filtré est aussi retardé de N échantillons (N = ordre du filtre, en général autour de 100 ... donc filtre très sélectif) ... ça devrait supprimer les composantes fréquentielles qui te gênent.
    Non, le retard n'est pas directement fonction de l'ordre du filtre.

    Citation Envoyé par erff
    PS : la méthode que tu as employée c'est d'une certaine façon une méthode de filtrage ... mais artisanale et sans fondement mathématique à mon avis.
    La méthode employée par MembreComplexe12 est strictement équivalente à un filtrage FIR. C'est juste qu'en passant par là plutôt que par les fonctions de conception de filtre de Matlab, il n'y a aucune assurance d'avoir les qualités d'un filtre "sensé" (notamment la causalité et la phase minimum).

    Au cas où, MembreComplexe12 avait commencé par du FIR et de l'IIR :

    http://forums.futura-sciences.com/ph...re-matlab.html

  13. #12
    phuphus

    Re : inverse FFT (matlab)

    Bonsoir,

    Citation Envoyé par membreComplexe12 Voir le message
    => pr choisir l'ordre du filtre ...etc je ne c pas trop comment faire
    Alors c'est dommage de ne pas avoir continué sur le fil "filtrage d'une fréquence particulière sous matlab", où je t'avais suggéré d'aller au delà de 1 pour l'ordre du filtre.

    Citation Envoyé par membreComplexe12
    => pour couper des frequences entre 40 et 60Hz par exemple je n'ai pas veaiment compris
    Coment faire (car il y a des histoires de normalisation)
    Il faut juste diviser tes bornes fréquentielles par la fréquence de Nyquist.

    Citation Envoyé par membreComplexe12
    2) mon deuxieme soucis est que lorsqye j'ai essayé du filtrage et que par hasard j'arrivé a faire quelque chose mon filtrage introduisé un dephasage de ma courbe. Or, dans application un dephasage n'est pas du tout acceptable.
    Tu n'auras pas vraiment le choix. Essaye la commande "filtfilt", mais du coup tu te récupères les transitoires au début ET à la fin de ton signal.

    Citation Envoyé par membreComplexe12
    => aussi, lorsque je filtrais. J'avais mes pentes qui etait modifiees ...
    (J'ai un signal un peut pret triangulaire avec un plateau entre la phase de mintee et la descente
    Et je veux filtrer le bruit sur les plateaux en conservant les pentes de mon triangle)
    Si tu as à ta disposition un modèle analytique de ton signal, alors essaye d'extraire de ton signal bruité les paramètres du modèle, ça peut marcher beaucoup mieux qu'un filtrage.

    Citation Envoyé par membreComplexe12
    ==> si tu as des exemples simples de prgramme matlab pr faire du filtrage coupe bande
    Je suis preneur.
    Regarde ici :
    http://dsp.stackexchange.com/questio...lter-in-matlab

    Sinon, qu'avais-tu contre le code que je t'ai donné ici ?
    http://forums.futura-sciences.com/ph...ombines.html#5

    Je t'en donne un autre, sur le fil suivant :
    http://forums.futura-sciences.com/ph...-matlab.html#6


    Citation Envoyé par membreComplexe12
    ==> sinon, j'aimerai bien aller au bout egalement de ma methode car elle de donne exactement
    Ce que je souhaite. Le seul soucis est que l'amplitude de mes courbes sont modifiees.
    (Ça doit venir du faite que je ne sais pas trop comment gerer ces histoire de lien entre spectre symetrique et IFFT)
    Même code de base que sur le fil "filtrage d'une fréquence particulière sous matlab", mais avec filtrage FFT :
    Code:
    clear all ;
    close all ;
    clc       ;
    %% signal origine
    t = 0:0.001:10-0.001;
    y = sin(2*pi*0.3*t)+sin(2*pi*2*t);
    %% signal traité fft, suppression de la composante à 2 Hz
    fs = 1000 ;
    Taille = size(t,2)   ;
    DeltaF = fs / Taille ;
    y_fft  = fft(y) ;
    Indice = round(2/DeltaF) ;
    y_fft(Indice+1)        = 0 ;
    y_fft(Taille-Indice+1) = 0 ;
    yfilter                = ifft(y_fft) ;
    
    
    figure (2);hold on;plot(t,y);plot(t,yfilter,'r');

  14. #13
    phuphus

    Re : inverse FFT (matlab)

    Bonsoir,

    Citation Envoyé par erff Voir le message
    Un filtre FIR introduit un retard global du signal de N/2 échantillons (et pas N) où N est l'ordre du filtre (supposé pair) ...
    Le coupe-bande à bande très étroite est (presque...) dans ce cas, mais c'est un cas particulier. Sinon, le retard ne dépend pas uniquement de l'ordre du filtre.

    Citation Envoyé par erff
    Dit autrement, les FIR sont des filtres à phase linéaire.. et logiciellement, il te suffit de décaler l'origine des temps de N*T_ech pour retrouver ton signal filtré non retardé (très simple à faire non ?). C'est le genre de truc que tu ne peux faire qu'en numérique !
    Les filtre FIR sont à "phase que tu veux". La phase linéaire est une possibilité, offerte dans Matlab par "firls" et non par "fir1".

    Citation Envoyé par erff
    Compare cela aux filtres IIR (genre les filtres analogiques classiques) : le déphasage dépend de la fréquence sous forme d'une fonction arctan ... donc c'est encore pire, chaque composante fréquentielle est déphasée de façon non linéaire !
    La fin de la phrase ne veut pas dire grand chose... Pour les filtre IIR, on sait faire de la phase linéaire (mais depuis peu ) :
    http://www.cic.ipn.mx/sitioCIC/image...0no4_Art01.pdf

  15. #14
    invite97597c07

    Re : inverse FFT (matlab)

    Bonjour

    s'il vous plait j'ai un problème là avec la FFT inverse en fait je vous explique le problème :
    j'i crée une impulsion gaussienne et j'ai appliquer la fft afin d'avoir l'impulsion de ce signal après je veux prendre les fréquence positif qui sont au dessus de -100db et j'ai essayer de reconstruire le signal j'ai arivé à reconstruire le spectre mais dés que j'applique la FFT inverse ça me donne deux impulsions et chaque impulsion à 1/2 l'amplitude de signal d'origine. Merci de m'aider s'il y a une solution. Merci par avance

Discussions similaires

  1. [matlab] programmation : peut-on générer un arbre des fonctions d'un code Matlab ?
    Par inviteafe1cd13 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 09/07/2015, 11h12
  2. Osmose Inverse... Pourquoi "Inverse" ?
    Par invite96c17354 dans le forum Physique
    Réponses: 11
    Dernier message: 07/12/2014, 10h47
  3. FFT et FFT Inverse sous Matlab
    Par fabio123 dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 30/05/2014, 13h36
  4. Filtrage par FFT puis FFT inverse dans Matlab
    Par invitea29b3af3 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 21/11/2013, 22h18
  5. transformé de fourier inverse sous matlab
    Par invite4ffe6e57 dans le forum Physique
    Réponses: 0
    Dernier message: 19/11/2009, 23h27