Transformée fourier rapide
Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Transformée fourier rapide



  1. #1
    invite9c7554e3

    Transformée fourier rapide


    ------

    Bonjour tous,

    j'ai une petite question :

    qu'es ce que ça fait si on utilise un algorithme "fft" avec un nombre de points qui n'est pas un multiple de 2 ?

    J'ai testé et apparemment ça ne change pas grand chose, j'aimerai comprendre alors pourquoi il faut respecter ceci ?

    merci pour votre aide

    -----

  2. #2
    velosiraptor

    Re : transformée fourier rapide

    C'est pas lié au théorème de Shannon ?

  3. #3
    obi76

    Re : transformée fourier rapide

    Salut,

    Citation Envoyé par velosiraptor Voir le message
    C'est pas lié au théorème de Shannon ?
    là je vois pas pourquoi... tant que tu as autant de points dans l'espace de Fourier que de points dans le signal d'origine, tu conserve l'intégralité de l'information. Ca n'implique en rien la nécessité que ce soit une puissance de 2.

    Non pour la puissance de 2 c'est vraiment lié à l'algorithme de calcul de la FFT où c'est une nécessité. je ne sais pas trop ce que ça ferai si ce n'en est pas une.

    Tous les détails ici : http://fr.wikipedia.org/wiki/Transfo...Fourier_rapide
    \o\ \o\ Dunning-Kruger encore vainqueur ! /o/ /o/

  4. #4
    stefjm

    Re : transformée fourier rapide

    Bonjour,
    Tu as implémenté toi même l'algo fft ou tu en a utilisé un tout fait?
    Dans ce dernier cas, la fft est peut être faite avec la puissance de deux la plus proche de celle passée en paramètre.
    Cordialement.
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

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

    Re : transformée fourier rapide

    Citation Envoyé par stefjm Voir le message
    Bonjour,
    Tu as implémenté toi même l'algo fft ou tu en a utilisé un tout fait?
    Dans ce dernier cas, la fft est peut être faite avec la puissance de deux la plus proche de celle passée en paramètre.
    Cordialement.
    Ca m'étonnerai, tu as perte de la périodicité si tu fais ça...
    \o\ \o\ Dunning-Kruger encore vainqueur ! /o/ /o/

  7. #6
    stefjm

    Re : transformée fourier rapide

    Ca peut être fait "intelligemment" par la fonction "fft"?
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  8. #7
    obi76

    Re : transformée fourier rapide

    Citation Envoyé par stefjm Voir le message
    Ca peut être fait "intelligemment" par la fonction "fft"?
    non, parce que dans ce cas tu dois interpoler les autres valeurs, donc tu modifiera la forme de la fft. En bref, là tu perds de l'information.
    \o\ \o\ Dunning-Kruger encore vainqueur ! /o/ /o/

  9. #8
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    Citation Envoyé par membreComplexe12 Voir le message
    Bonjour tous,

    j'ai une petite question :

    qu'es ce que ça fait si on utilise un algorithme "fft" avec un nombre de points qui n'est pas un multiple de 2 ?

    J'ai testé et apparemment ça ne change pas grand chose, j'aimerai comprendre alors pourquoi il faut respecter ceci ?

    merci pour votre aide
    Pas de problème pour une fft avec un nombre de points arbitraires. Une FFT se sert de simplifications pour accélérer le calcul, et plus le nombre de points est factorisable en nombre premiers et plus l'algo peut prendre des raccourcis.

    Tu peux faire l'essai avec une boucle effectuant un grand nombre de FFT et un chrono : entre 1024 points (2^10) et 1021 points (nombre premier), la différence de vitesse est particulièrement significative.

  10. #9
    invite9c7554e3

    Re : transformée fourier rapide

    merci pour votre aide, donc c'est bien lié à l'algo "fft" alors.

    j'utilise l'algo "fft" de matlab, il semblerai que l'on puisse le faire fonctionner meme pour un nb de points quelconques, d'ailleurs dans l'aidde cette fonctions ils
    font à la main la recherche de la puissance de 2 avant d'appeler "fft" : http://www.mathworks.fr/fr/help/matlab/ref/fft.html

    ce que je ne comprennais pas c'est que si je donne un nombre de points qui ne soit pas une puissance de 2 il le prend en compte.
    --> merci Phuphus pour ta réponse, j'ai compris à présent

  11. #10
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    Citation Envoyé par obi76 Voir le message
    non, parce que dans ce cas tu dois interpoler les autres valeurs, donc tu modifiera la forme de la fft. En bref, là tu perds de l'information.
    Tout dépend de ce qu'on analyse. Sur des signaux dits arbitraires, le nombre de points de la FFT n'est pas le coeur du problème. Sur un signal dont la périodicité est connue, avoir une période de FFT égale à la période du signal permet de se ramener à une décomposition en série de Fourier bête et méchante (la FFT n'est de toutes façons qu'une DSF, sauf que lorsque la période est "mal" choisie ou lorsque le signal n'est pas périodique cela ne se voit pas au premier coup d'oeil).

    Prendre la puissance de 2 suivante ne fait perdre aucune info : le fréquentiel contient toujours les mêmes infos que le temporel, sauf qu'il inclura les 0 ajoutés. C'est du zero-padding, et c'est équivalent à une interpolation dans le domaine fréquentiel. Cette interpolation est "propre" et ne fait rien perdre, à condition de savoir que l'on a cassé le signal original en bourrant avec des zéros.

    C'est en fait là toute la difficulté d'une analyse spectrale FFT : pour pouvoir correctement exploiter les résultats, il faut déjà savoir à quel type de signal on a affaire (analytique, ergodique, périodique, etc.).

  12. #11
    b@z66

    Re : transformée fourier rapide

    Citation Envoyé par membreComplexe12 Voir le message
    Bonjour tous,

    j'ai une petite question :

    qu'es ce que ça fait si on utilise un algorithme "fft" avec un nombre de points qui n'est pas un multiple de 2 ?

    J'ai testé et apparemment ça ne change pas grand chose, j'aimerai comprendre alors pourquoi il faut respecter ceci ?

    merci pour votre aide
    Une réponse possible: l'algorithme peut éventuellement effectué un "zero-padding", c'est à dire ajouter des échantillons nuls de façon à atteindre la puissance de deux la plus proche. Suivant la façon dont c'est effectué, cela peut-être dommageable, en particulier pour des signaux périodiques.
    La curiosité est un très beau défaut.

  13. #12
    b@z66

    Re : transformée fourier rapide

    OK, grillé par phuphus.
    La curiosité est un très beau défaut.

  14. #13
    invite9c7554e3

    Re : transformée fourier rapide

    j'ai une autre petite question :
    ---------------------------------
    j'ai trouvé ceci dans l'aide de matlab :
    Code:
    NFFT = 2^nextpow2(L); % Next power of 2 from length of y
    Y = fft(y,NFFT)/L;
    f = Fs/2*linspace(0,1,NFFT/2+1);
    % Plot single-sided amplitude spectrum.
    plot(f,2*abs(Y(1:NFFT/2+1)))
    avec Fs la fréquence echantillonage du signal et L le nombre de points

    je ne comprends pas pourriez vous m'expliquez svp ?
    Code:
    NFFT = 2^nextpow2(L);
    là je comprends on prends la puissance de 2 la plus proche de mon nombre d'echantillons
    Code:
    Y = fft(y,NFFT)/L;
    ici on fait une fft du signal "y" avec les NFFT points, mais par contre pourquoi on divise par le nombre
    de points de la fonction??? ça ressemble à une normalisation mais je ne vois pas le rapport entre l'axe des abscisse (lié à L et la transformée
    lié à l'axe des ordonnées plutot)
    Code:
    f = Fs/2*linspace(0,1,NFFT/2+1);
    ici, pour construire le vecteur des fréquences je comprends que si on fait un demi spectre on
    a bien besoin de "NFFT/2+1" points compris entre 0 et 1 mais je ne comprends pas pourquoi
    on multiplie par Fs/2 ????
    -> pourquoi ne pas multiplier tout simplement pas la fréquence d'echantillonage ?
    Code:
    plot(f,2*abs(Y(1:NFFT/2+1)))
    ici je ne comprends pas pourquoi on par de 1 jusqu'à NFFT/2+1
    moi je l'aurai fait dans le sens inverse, je serai parti de NFFT/2+1
    pour aller jusqu'à la premiere raie...
    (le *2 je ne vois pas du tout d'où il sort...)

  15. #14
    obi76

    Re : transformée fourier rapide

    pourtant toutes les librairies FFT que j'ai utilisé (en particulier celui du Numerical Recipies) était uniquement restreint pour un nombre en puissance de 2. Après qu'on puisse factoriser en nombres premiers etc, ce sont des astuces complémentaires, mais l'algo FFT tel quel ne peut pas. Après si on a une surcouche qui permet d'étendre le domaine de validité de cette méthode, pourquoi pas...
    \o\ \o\ Dunning-Kruger encore vainqueur ! /o/ /o/

  16. #15
    albanxiii
    Modérateur

    Re : transformée fourier rapide

    Bonjour,

    Citation Envoyé par obi76 Voir le message
    pourtant toutes les librairies FFT que j'ai utilisé
    Pardon de faire mon vieux c... mais on dit bibliothèque !
    C'est comme un réflexe chez moi, à chaque fois que j'entend "librairie"...

    @+
    Not only is it not right, it's not even wrong!

  17. #16
    obi76

    Re : transformée fourier rapide

    Méa culpa
    \o\ \o\ Dunning-Kruger encore vainqueur ! /o/ /o/

  18. #17
    invite9c7554e3

    Re : transformée fourier rapide

    merci tous pour votre aide,
    mon problème est résolu

  19. #18
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    as-tu aussi les réponses à tes questions de l'intervention #13 ?

  20. #19
    invite9c7554e3

    Re : transformée fourier rapide

    Citation Envoyé par phuphus Voir le message
    Bonsoir,as-tu aussi les réponses à tes questions de l'intervention #13 ?
    non pas vraiment mais en fait du coup je ne me suis pas focalisé sur l'aide de matlab car sur ce coup je la trouve pourrie (malgrès que d'habitude elle est tres bien).
    j'ai donc refais un petit cas test et ça fonctionne.

    ça ressemble à :
    N=1000;
    spectr=fft(y,N);
    f=(0:N/2+1)*fe/N
    plot(f,spectr(1:N/2))

  21. #20
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    la suite sera donc pour la culture...

    Citation Envoyé par membreComplexe12 Voir le message
    Code:
    Y = fft(y,NFFT)/L;
    ici on fait une fft du signal "y" avec les NFFT points, mais par contre pourquoi on divise par le nombre
    de points de la fonction??? ça ressemble à une normalisation mais je ne vois pas le rapport entre l'axe des abscisse (lié à L et la transformée
    lié à l'axe des ordonnées plutot)
    C'est bien une normalisation, qui veut que l'on divise le résultat de la FFT par NFFT. Comme tu fais du zéro padding, tu vas diluer tes amplitudes fréquentielles par L / NFFT. Pour re-normaliser suite au zero-padding, il faut donc multiplier le résultat de ta FFT normalisée par NFFT / L. Au final, tu as divisé par L.

    Citation Envoyé par membrecomplexe12
    Code:
    f = Fs/2*linspace(0,1,NFFT/2+1);
    ici, pour construire le vecteur des fréquences je comprends que si on fait un demi spectre on
    a bien besoin de "NFFT/2+1" points compris entre 0 et 1 mais je ne comprends pas pourquoi
    on multiplie par Fs/2 ????
    -> pourquoi ne pas multiplier tout simplement pas la fréquence d'echantillonage ?
    Le deltaF d'une FFT est égal à l'inverse de la période d'analyse. Donc égal à Fs / NFFT. Comme le premier point est la composante continue, on doit bien avoir Fs / 2 pour le NFFT/2+1ème point.

    Dit autrement : soit tu prends par convention Fs = 1, et donc tu dois faire un Fs * linspace(0,1,NFFT) en ne retenant au final que la moitié des points ; soit tu prends FNyquist = 1 et tu te ramènes au code trouvé dans l'aide de Mtalab.

    Citation Envoyé par membreComplexe12
    Code:
    plot(f,2*abs(Y(1:NFFT/2+1)))
    ici je ne comprends pas pourquoi on par de 1 jusqu'à NFFT/2+1
    moi je l'aurai fait dans le sens inverse, je serai parti de NFFT/2+1
    pour aller jusqu'à la premiere raie...
    (le *2 je ne vois pas du tout d'où il sort...)
    Pour le sens, la réponse est assez évidente.

    Pour le *2, le résultat de la FFT d'un signal réel est symétrique, et "l'énergie" de ton signal est répartie de manière symétrique en dessous et au dessus de la fréquence de Nyquist. Comme tu choisis de ne considérer que la première moitié, tu multiplies tout par 2 pour avoir un spectre d'amplitudes.

  22. #21
    invite9c7554e3

    Re : transformée fourier rapide

    merci Phuphus pour ces explications tres interessantes

  23. #22
    invite9c7554e3

    Re : transformée fourier rapide

    Phuphus,
    je reviens vers toi car je ne suis plus certain de bien comprendre... :
    moi ce qui me paraît logique pour construite le spectre de fréquence positive c'est de faire ceci :




    ça te paraît juste ceci ? (et logique ?)

    moi ça me va bien et ça semble aller sur des cas tests : j'ai pris une fonction périodique 50Hz et en faisant ma FFT avec cet axe des abscisses je retrouve 50Hz.

  24. #23
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    et lorsque tu compares ton code à :
    Code:
    FrequencesPositive = Fs/2*linspace(0,1,NFFT/2+1) ;
    qu'obtiens-tu ?

  25. #24
    invite9c7554e3

    Re : transformée fourier rapide

    tout d'abord, merci beaucoup pour ton aide Phuphus c'est très gentil

    pour repondre à ta question, effectivement c'est la meme chose

    je viens de comprendre il me semble. Ceci vient du fait que l'on a la fréquence fondamentale qui est égale à Fe/NbPoints.
    par contre ça me parait beaucoup moins logique comme approche....

    Citation Envoyé par phuphus Voir le message
    C'est bien une normalisation, qui veut que l'on divise le résultat de la FFT par NFFT.
    finalement je ne suis pas certain de bien comprendre ceci....

    la transformée de Fourier est définie par :
    donc si je fais :
    Code:
    y=fft(f,NFFT)/NFFT;
    ça revient à faire :

    la transformée de Fourier inverse est définie par :
    donc si je fais une fransformée inverse de "y" (qui a été normalisé) alors je vais avoir au final normalisé deux fois ??

    je dis ceci car dans le cas d'une TFD il n'y a pas de normalisation par le nombre de points en principe :
    or nous on en mets une....

    Citation Envoyé par phuphus Voir le message
    Comme tu fais du zéro padding, tu vas diluer tes amplitudes fréquentielles par L / NFFT. Pour re-normaliser suite au zero-padding, il faut donc multiplier le résultat de ta FFT normalisée par NFFT / L. Au final, tu as divisé par L.
    comme je n'ai pas vraiment compris le cas précédent lui je ne le comprends pas non plus....
    peux tu me donner les détails à partir de cette expression : ?

    ce que j'ai fais :
    dans mon code matlab j'ai fais :
    Code:
    spectreFFT=fft(y,nbPointsFFT);
    fonctionTemporelleTemp=ifft(spectreFFT,nbPointsFFT);
    et ça à très bien reconstruit mon signal de départ, du coup je ne comprends pas du tout cette histoire de normalisation....
    il y a t il un intéret ?? le seul intérêt (si s'en ai un) c'est que l'amplitude des spectres est normée on dirait ... ?
    mais c'est totalement inutile d'avoir un spectre normé....

  26. #25
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    normer le résultat d'une FFT dépend de ce que tu veux en faire. Dans tous les cas, pour retomber sur tes pattes avec FFT puis iFFT, il faut normer à un moment ou à un autre : soit à la FFT, soit à la iFFT, soit aux deux avec .

    Imagine un signal cosinus simple. Tu en fais la FFT sur un nombre entier de périodes, donc tu as juste une raie à la fréquence du cos et des 0 partout. Le coef est calculé à partir de l'expression que tu as donnée.

    Maintenant, tu fais la même analyse sur une période 2 fois plus grande. Le coefficient correspondant à la fréquence de ton cos est , et on voit bien que le résultat est 2 fois plus grand. Hors, l'amplitude de ton cos n'a pas varié...

    Donc si tu veux obtenir un spectre d'amplitude, tu normes à la FFT et pas à la iFFT. Cette iFFT représentera alors l'addition simple de cosinus discrets avec leurs amplitudes et phases respectives.

    Si tu veux manipuler tes données spectrales avant une iFFT, avoir des amplitudes représentatives n'est pas important et tu peux normer à la iFFT : c'est le standard de toutes les FFT que je connais (remarque, hors Matlab j'utilise FFTW, qui est la FFT utilisée par Matlab depuis la version 6.0 il me semble).

  27. #26
    invite9c7554e3

    Re : transformée fourier rapide

    bonjour et merci pour ces explications,
    j'ai compris enormement de choses !!!

    Citation Envoyé par phuphus Voir le message
    C'est bien une normalisation, qui veut que l'on divise le résultat de la FFT par NFFT. Comme tu fais du zéro padding, tu vas diluer tes amplitudes fréquentielles par L / NFFT. Pour re-normaliser suite au zero-padding, il faut donc multiplier le résultat de ta FFT normalisée par NFFT / L. Au final, tu as divisé par L.
    je n'ai par contre toujours pas compris cette explication.

    si je fais :

    matlab ne pas faire de normalisation, donc si je veux faire une normalisation je fais

    car mon nombre de points est "L" ?

    ce que je ne comprends pas c'est pourquoi je n'ai pas divisé par NFFT puisque le nombre de points
    final (avec le zero padding inclu) est de NFFT et pas de L....
    Ici on fait une normalisation par "L" et non par "NFFT"....

    autre choses :
    si j'ai bien saisi matlab ne fais pas de normalisation à la FFT mais il en fait une lors de la IFFT.

    Donc si on fait ceci :


    on fait une premiere normalisation par L et ensuite matlab en fait une automatiquement lors de la IFFT
    donc ce code est faux car il y a deux normalisations (une explicite et une implicite)

  28. #27
    phuphus

    Re : transformée fourier rapide

    Bonsoir,

    Citation Envoyé par membreComplexe12 Voir le message
    [B][COLOR="#800080"]
    si je fais :

    matlab ne pas faire de normalisation
    Exact.

    Citation Envoyé par membreComplexe12
    donc si je veux faire une normalisation je fais

    car mon nombre de points est "L" ?

    ce que je ne comprends pas c'est pourquoi je n'ai pas divisé par NFFT puisque le nombre de points
    final (avec le zero padding inclu) est de NFFT et pas de L....
    Ici on fait une normalisation par "L" et non par "NFFT"....
    Le but est d'analyser une partie d'un signal. On le découpe donc, et on en fait une FFT. Pour pouvoir améliorer la précision fréquentielle, on met des zéro à la fin de la partie découpée. Si tu divises simplement par NFFT, tu as le spectre d'amplitude de l'ensemble "découpe + zéro". Hors, tu veux analyser le signal original et non l'ensemble signal + zero.

    Fais un essai : génère un signal, fais la fFT, et norme pour avoir un spectre d'amplitude. Maintenant, fais la même chose avec des zéro derrière, et regarde l'évolution de l'amplitude de tes raies : elles sont divisées par NFFT/L. Donc pour retrouver les bonnes amplitudes, tu dois remultiplier par NFFT/L. Au final, tu as divisé par NFFT puis multiplié par NFFT/L.

    Citation Envoyé par membreComplexe12
    autre choses :
    si j'ai bien saisi matlab ne fais pas de normalisation à la FFT mais il en fait une lors de la IFFT.

    Donc si on fait ceci :


    on fait une premiere normalisation par L et ensuite matlab en fait une automatiquement lors de la IFFT
    donc ce code est faux car il y a deux normalisations (une explicite et une implicite)
    Exact !

  29. #28
    invite9c7554e3

    Re : transformée fourier rapide

    merci beaucoup phuphus !!!!

Discussions similaires

  1. Passage de la transformée de Fourier , à la transformée de Fourier discrète.
    Par invite39f9b8b2 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 11/02/2013, 15h54
  2. Différence entre Transformée en cosinus et Transformée de Fourier
    Par invitea29b3af3 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 10/08/2012, 19h12
  3. Réponses: 6
    Dernier message: 07/03/2012, 17h35
  4. Stft, tfct (Short-Time Fourier Transform, transformée de Fourier à court terme)
    Par invite4ee6cce0 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 24/08/2011, 13h17
  5. Transformée de Fourier plus, Transformée de Fourier moins.
    Par invite10e7600a dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 29/10/2008, 08h10