IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Signal Discussion :

FFT et amplitude de signals


Sujet :

Signal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 25
    Points
    25
    Par défaut FFT et amplitude de signals
    Bonjour à tous,

    J'ai un souci avec la fonction FFT de Matlab (7.3.0 (R2006b)).

    J'ai un signal d'entrée que je définis moi même, composé de trois sinusoïdes à des fréquences différentes. La fréquence d'échantillonage n'est pas un multiple de 2. Quand je fais la FFT du signal, je retrouve bien les trois fréquences, mais les amplitudes ne sont pas correctes. Etant vraiment pas bon du tout en signal processing, est ce que vous sauriez me dépanner ?

    Je mets le code que j'utilise juste en dessous:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    f1 = 100; 
    f2 = 5000;
    f3 = 12435;
    Fs = 44100;
    duration = 5;
    t=0:1/Fs:duration;
    input = 2*cos(2*pi*f1*t) + cos(2*pi*f2*t) + 5*cos(2*pi*f3*t) ;
     
    Y = fft(input)/length(input);
    NFFT = length(input);
    f = linspace(0,Fs/2,NFFT/2);
    Y_plot = abs(Y(1:floor(NFFT/2)));
     
    figure; semilogx(f, 2*Y_plot) 
    xlabel('Frequency [Hz]');
    ylabel('Amplitude');
    Merci d'avance

    Julien

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Salut.
    les amplitudes ne sont pas correctes
    Pourquoi tu multiplies par 2 Y_plot ?
    Complément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    clear
    f1 = 100; f2 = 5000;f3 = 12435;Fs = 44100;
    duration = 5;
    t=0:1/Fs:duration;
    input = 2*cos(2*pi*f1*t) + cos(2*pi*f2*t) + 5*cos(2*pi*f3*t) ;
    NFFT = length(input);
    Y = fft(input,NFFT);
    f = linspace(0,Fs/2,NFFT/2);
    Y_plot = abs(Y(1:floor(NFFT/2)));
    figure; semilogx(f, 2*Y_plot) 
    xlabel('Frequency [Hz]');
    ylabel('Amplitude');grid
    figure(2)
    w=(0:NFFT-1)/NFFT*Fs;
    stem(w(1:floor(NFFT/2)),abs(Y(1:floor(NFFT/2))));
    axis([0 1.5E4 0 6E05]);grid

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Si tu multiplies pas par 2, dû à la FFT, tu n'obtiens que la moitié de l'amplitude du signal (normalement). Et il y a une erreur dans ton code, il faut absolument diviser Y par la longueur du vecteur du signal, sinon tu te retrouves avec des amplitudes qui dépendent de la longueur du signal

    Et du coup, le problème reste entier. Les amplitudes (en particulier celle de la troisième fréquence 12345 Hz) ne sont pas correctes.

    Pourquoi ?

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Salut.
    Les amplitudes (en particulier celle de la troisième fréquence 12345 Hz) ne sont pas correctes.Pourquoi ?
    Cela vient du Théorème de Shannon. "Il faut échantillonner à plus de deux fois la fréquence maximale. En pratique on prend deux fois Shannon. soit pour 12435 il faut Fs=4*12435=49740 Hz.
    Même à cette fréquence la sinusoide à f3 n'est pas "pure" (trace la). Si tu veux une amplitude correcte il faut aller jusqu'à ...11*12435 Hz !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    Par défaut
    Si tu multiplies pas par 2, dû à la FFT, tu n'obtiens que la moitié de l'amplitude du signal (normalement).
    Attention ta multiplication par 2 vient du fait que tu veux afficher 20*log(|Y|),
    ce qui représente la puissance (encore elle ^^) de ton signal en dB.

    C'est la façon dont tu t'y prends pour afficher celle-ci (qui par ailleurs me semble juste) qui justifie le x2. la fonction semilogx utilise une échelle logarithmique en base 10.
    Donc 2*10*log10(|Y|) est équivalent à 2*semilogx(|Y|)

    Et il y a une erreur dans ton code, il faut absolument diviser Y par la longueur du vecteur du signal,
    Le fait de ne pas normaliser par le nombre d'échantillon n'est pas une erreur en soit. On prend l'habitude de normaliser quand on utilise la transformée de fourier rapide (fft). C'est l'algorithme de la fft qui induit une amplitude proportionnelle au nombre de points de ton signal et non pas la transformée de fourier elle-même. Exemple sur une sinusoïde pure d'amplitude 1 qui aura une amplitude de 1000 dans l'espace des fréquences (fft) si tu lui présentes 1000 échantillons en entrée.

    Les amplitudes (en particulier celle de la troisième fréquence 12345 Hz) ne sont pas correctes.
    Pourquoi ?
    En fait ce n'est pas tout à fait vrai. A 2 fois Shannon, on estime que le signal numérique est correctement "représenté". Que ton amplitude ne corresponde pas c'est tout à fait normal puisque ton signal est numérique justement. Pour obtenir l'amplitude correcte il faut que f1, f2, f3 soient un multiple de fe (encore du à la fft).
    Autre exemple, si tu traces ton sinus à la limite de la condition de Shannon, celui-ci est correctement "représenté et pourtant la représentation temporelle que tu obtiens n'est pas forcément "belle"... mais bon !

    Par contre la question vraiment intéressante est de savoir si tu retrouves bien la fréquence... et si ta résolution fréquentielle est suffisante pour séparer des signaux proches.
    Le maximum d'amplitude en fréquence est souvent comparé au niveau de bruit du reste du signal, ce qui nous permet d'obtenir le rapport signal sur bruit. Donc que le max ne soit pas vraiment au max... (on m'a compris là ?)

    Désolé pour ne pas mettre de figure illustrant mon propos

    voilà

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/07/2012, 17h46
  2. [FFTW] FFT 1D d'un signal 2D
    Par Heimdall dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 11/04/2008, 15h37
  3. [Signal] FFT : calcul de la fréquence et du déphasage *exacts*
    Par ol9245 dans le forum Traitement du signal
    Réponses: 21
    Dernier message: 18/04/2007, 16h15
  4. [Traitement du signal] Convolution en passant par la FFT
    Par parp1 dans le forum Traitement du signal
    Réponses: 8
    Dernier message: 25/04/2006, 13h26
  5. [TMS320C6416] FFT et IFFT sur un signal audio...
    Par 0x4e84 dans le forum Autres architectures
    Réponses: 1
    Dernier message: 18/04/2005, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo