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

    Posté par . En réponse au message GNU/octave : Aidez moi à comprendre fft et ifft :'(. É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)