Forum Astuces.divers GNU/octave : Aidez moi à comprendre fft et ifft :'(

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
3
14
mar.
2021

Bonjours à tous,
J'ai besoin d'aide !

Voilà, supposons que j'ai un signal s.
Je prend la fft de ce signal, ça me donne une série de fourrier qui donnent ce signal s.

comment est-ce que je fais pour avoir une extrapolation de ce signal ? Quand je le fais avec gnu/octave, je n'ai qu'un étirement ce de signal, et je ne comprend pas vraiment pourquoi.

Par exemple :

s = [0 -1 0 1  0]

Quand je fais plot(real(ifft(fft(s)))) je retrouve bien mon signal original de 1/5 de hertz

Comment est-ce que je fais pour avoir mon signal sur par exemple 10 unités de temps ?

J'ai l'impression qu'il y a quelque chose d'assez fondamental que je comprend pas sur la fft ou sur octave. quand je rajoute des 0 à la fin de ma fft, j'ai du n'importe quoi (ou j'arrive pas à comprendre : plot(real(ifft([fft(s) 0 0 0 0 0 0 0 0 0 0 0 0 0])))

J'ai conscience que c'est probablement très confus, c'est pas clair pour moi non plus.

Formulé autrement, j'ai un signal s fini, et j'aimerais utiliser la fft pour trouver un signal infini qui débute par s. Mon idée (naive ?) de la fft permetait de faire ça.

Gros bisous si vous pouvez m'aider (et gros bisous même si vous pouvez pas)

  • # signal infini...

    Posté par  . Évalué à 2. Dernière modification le 14 mars 2021 à 10:00.

    Bonjour,
    Je ne connais pas octave, il m'arrive d'utiliser d'autre outils pour faire des FFT (python ou scilab, mais peu importe). Je ne vais sans doute pas répondre à ta question mais quand même.
    Le principe d'une FFT c'est de prendre un signal discret, et de te donner un spectre discret. Partant de là :
    1- pour faire un calcul numérique, tu est obligé de limiter ton signal à un nombre d'échantillons fini. Donc vouloir le faire sur un signal infini, n'a pas de sens (sauf si il es périodique, voir point suivant).
    2- le spectre obtenu étant discret, ce suppose que ton signal est périodique (donc infini, ce qui peut paraitre contradictoire avec le point 1, mais en fait non).
    Ce qui réconcilie le point 1 avec la contradiction du point 2, c'est l'hypothèse qui se cache derrière la FFT et qu'on oublie : On prend un signal, on le tronque à N points, et ce qu'on calcule en fait c'est le signal périodique, dont on prendrait une période qui est représentée sur N points.
    Comme je ne sais pas quelle forme à le n'importe quoi que tu observe quand tu apodise ton signal (le fait d'ajouter des zéros), je ne peux pas te répondre, mais c'est peu être normal. Dans ton signal de départ, tu as pris un sinus tronqué sur 5 points, mais ces 5 points sont pile sur une période, donc quand la FFT périodise, elle effectue bien le calcul sur un sinus périodique. Quand tu ajoute des 0, c'est un signal différent, qui n'est plus un échantillonnage cohérent, donc ta FFT est peu être juste, avec des lobe secondaires qui apparaissent, mais avec 10 points tu n'a plus la précision voulue pour "voir" le pic principal.
    Je ne suis pas certain d'avoir été clair, mais expliquer ça sans un petit dessin, c'est pas évident.

    • [^] # Re: signal infini...

      Posté par  . Évalué à 3.

      Salut,

      Moi, ce qui me pose problème, c'est :

      comment est-ce que je fais pour avoir une extrapolation de ce signal ?

      Que se cache-t'il sous le terme "extrapolation" ?

      Parce que si c'est juste pour boucler à l'infini un même signal, la fft est peut-être pas nécessaire

      Matricule 23415

      • [^] # Re: signal infini...

        Posté par  . Évalué à 1.

        Salut,

        Peut être que j'ai une idée naive de la transformée de fourier discrète. Dans mon idée, c'était une décomposition en fonction qui code le début du signal, et il convient d'oublier le reste. Je voulais voir ce que ça donne après.

        • [^] # Re: signal infini...

          Posté par  . Évalué à 1.

          Il n'y a pas de après, ou plutôt, comme dit au dessus, ton signal est considéré comme périodique par la FFT: tu auras donc [S S S…]

          • [^] # Re: signal infini...

            Posté par  . Évalué à 1.

            oui, j'ai découvert ça, je pense que j'ai compris maintenant.

            Je suis un peu déçu, je pensais que c'était un préfixe qui donnait des choses rigolotes après. Mais je suis content d'avoir compris quelque chose.

            • [^] # Re: signal infini...

              Posté par  . Évalué à 1.

              Si tu veux voir des choses rigolotes après, utilise des approximations polynomiales. En fonction du nombre de points utilisés, de leurs positions respectives et des degrés de polynômes, tu auras des choses qui peuvent varier très vite en dehors de ta fenêtre d'observation.

  • # Transformée de Fourier discrète

    Posté par  . Évalué à 3.

    Bonjour,

    J'ai l'impression que tu confonds la FFT (équivalente à une transformée de Fourier discrète) avec le développement en série de Fourier.

    Sauf la transformée discrète est une variante de la transformée continue dont une des hypothèses de base de la transformée est que le signal n'est pas périodique et est borné dans le temps. Hypothèse nécessaire pour que l'intégrale converge. D'ailleurs l'inverse reviendrait à dire que le signal à une énergie infinie.

    Donc sa transformation inverse ne donnera jamais un signal périodique.

    Bonne lecture

    Les vrais naviguent en -42

    • [^] # Re: Transformée de Fourier discrète

      Posté par  . Évalué à 1.

      Ohhhhh, c'est très possible. Ces choses là sont encore assez floues pour moi.

      Peut être que ce que j'avais en tête était le calcule d'une FFT, et l’interprétation de cette fft comme une série de fourier pour avoir un signal périodique.

      Merci beaucoup pour tes pointeurs, je vais étudier ça :-)

      • [^] # Re: Transformée de Fourier discrète

        Posté par  . Évalué à 2.

        Pour compléter un peu la réponse déjà fournie de gringonz :
        1/ fft considère que tu lui donnes une période d'un signal échantillonné. Pour un vecteur de N échantillons, il va considérer que la période du signal est de N fois la période d'échantillonnage (soit une fréquence fs/N, fs étant la fréquence d'échantillonnage).

        fft calcule alors la série de Fourier de ce signal échantillonné. Le premier coef est le terme DC (la moyenne), le second est la contribution de la fréquence fondamentale (fs/N), la suivante est la contrib de la fréquence double (2fs/N), etc… jusqu'à l'échantillon N qui correspond à la fréquence fs(N-1)/N.

        Comme les signaux échantillonnés ont un spectre périodique (on parle d'aliasing), la seconde moitié des coefficients calculés correspond aussi aux fréquences négatives (de -fs(N//2)/N à -fs/N). rfft ne te donne que les coefs pour les fréquences positives (et nulle).

        2/ Ce qui précède concerne la fft directe.
        Pour la fft inverse, c'est pareil puisque le spectre (l'argument d'entrée de ifft) est périodique (car c'est le spectre d'un signal échantillonné) et échantillonné (car c'est une série de Fourier).

        À partir de N coefs «spectraux», ifft va calculer un signal de longueur N (cad un vecteur de N valeurs, la n-eme valeur correspondant à l'instant n/fs).

        3/ Pour revenir au post de départ, si je comprends bien, tu veux périodiser ton signal.
        Option 1 : tu fais la recopie/concaténation du signal (sur octave, fonction repmat(S, 1, 10) doit faire un vecteur ligne avec 10 fois ton vecteur S initial)
        Option 2 (pour réfléchir dans le domaine de Fourier) : tu veux un nouveau signal 10 fois plus long (N'=10N). Le 2nd coef fft correspondrait alors à fs/N'=fs/(10N), soit une fréquence 10 fois plus basse. Il faut donc «distiller» les coefs :

        S = [0, -1, 0, 1, 0];
        spec = fft(S);
        N = length(S);    
        M = 10; % nombre de périodes voulues
        spec_M = zeros(1, M*N);
        spec_M(1:M:end) = spec;
        S_M = ifft(spec_M);

        Je te laisse le soin de comparer les contenus de spec et spec_M, d'abord les vecteurs, ensuite avec les vecteurs fréquences associés (que tu peux obtenir avec fftfreq en python, mais pas sous octave)

        • [^] # Re: Transformée de Fourier discrète

          Posté par  . Évalué à 1.

          Super merci beaucoup, Je suis loin d'être à l'aise avec la gymnastique temporelle fréquentielle. Sans l'ombre d'un doute, ta réponse contribue largement à la construction de mon intuition de la chose :-)

          Merci beaucoup !

  • # ordre des données dans la fft

    Posté par  (site web personnel) . Évalué à 1.

    Les données dans le tableau résultat de la fft sont rangées dans un ordre bien défini qui est celui que ifft s’attend à trouver ensuite.
    C'est bien décrit dans la doc de numpy (https://numpy.org/doc/stable/reference/routines.fft.html#implementation-details), et je crois que Octave a la même convention. Tu ne peux pas juste rajouter des 0 à la fin pour modifier la fft comme si il y avait des composantes hautes fréquences d'amplitude nulle.
    Ça pourrait fonctionner avec rfft et irfft qui existent sous numpy mais pas dans Octave on dirait.
    Sinon, je ne suis pas sûr de comprendre ce que tu souhaites obtenir.

    Comment est-ce que je fais pour avoir mon signal sur par exemple 10 unités de temps ?

    Est-ce que tu veux trouver comment interpoler des valeurs entre les échantillons connus de signal ?

    • [^] # Re: ordre des données dans la fft

      Posté par  . Évalué à 1.

      Est-ce que tu veux trouver comment interpoler des valeurs entre les échantillons connus de signal ?

      Salut, merci pour ta réponse, non, en fait j'avais juste une idée naïve sur ce qu'était la fft, j'espérais une "suite" ayant la même signature spectrale. J'ai compris maintenant :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.