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 :

Non compréhension de la transformée de fourier par matlab


Sujet :

Signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut Non compréhension de la transformée de fourier par matlab
    Bonjour j'ai quelques incompréhensions de la façon dont est gérer la TdF sous matlab.

    Si je prends une fonction super classique du style : x(t) = exp(-a*abs(t))
    en calculant à la main la TdF est : X(f) = (2*a) / (a²+(2*Pi*f )²)

    Or quand je compare les courbes de celle que j'ai calculé à la main et de la TdF déterminé par approximation avec : fx = fftshift(Te * fft(x))
    c'est très différent, je mets le code à disposition si vous voulez voir ce que ça donne car je ne comprends pas du tout d'où ça vient.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    clear all
     
    a = 1;
    f0 = 5;
     
    tdebut = -5;
    tfin = 5;
    Te = 0.01;
    t = tdebut:Te:tfin;
     
    fdebut = -5;
    ffin = 5;
    Fe = 0.01;
    f = fdebut:Fe:ffin;
    % f = t ...
    x = exp(-a.*abs(t));
     
    X = 2*a./(a.^2+4*pi^2*f.^2);
    fx = fftshift(Te * fft(x)); % approximation de la TF
    xt = abs(ifft(fx)/Te); % TF inverse
     
    subplot (4,1,1); plot(t,x);
    subplot (4,1,2); plot(f,X);
    subplot (4,1,3); plot(f,fx);
    subplot (4,1,4); plot(f,xt);
     
    if xt == x
        disp('true');
    else
        disp('false');
    end
    Je veux bien que ça soit une méthode approchée, mais de là à avoir des oscillations et des valeurs négatives, je ne trouve pas ça très approché de ma TdF à la main.

    Toujours dans la même optique si je fais une TdF (que je noterais xt) inverse je retrouve grosso modo la forme de mon signal x(t) (que je noterais x) d'origine mais si je fais un test de style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if xt == x
       disp('true');
    else
       disp('false');
    end
    Il m'affiche false donc là aussi je pige pas trop, je me dis que ça doit venir de la TdF approchée alors la TdF inverse d'un truc approché ça doit pas être le même que la fonction de départ.

    Enfin un dernier truc que je ne comprends pas encore en lien avec la TdF, si je prends un son en wav et que je l'intègre dans une matrice avec wavread. Comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [y, Fs, nbits] = wavread('son');
    FFT_y = fftshift(fft(y)); 
    % il me semble que la période d'échantillonnage 1/Fs n'est pas requise pour réaliser la TdF mais sans certitude
    plot (abs(FFT_y));
    Première chose que je ne comprends pas, mon vecteur y, aura une certaine length, mais cela me dit pas le temps en seconde si je veux représenter l'amplitude en fct du temps du signal de départ mais l'amplitude en fonction de la taille de la matrice na ?

    Deuxième chose dans le même acabit, pour la TdF obtenue (mais je ne suis pas sur que ce soit la bonne ligne de commande), l'Amplitude obtenue n'est pas bonne (genre 6000 fois celle du signal temporel ça me paraît louche), et l'échelle en abscisses va toujours correspondre à la taille du vecteur comment faire pour obtenir la bonne échelle fréquentielle ?

    Merci d'avance et désolé pour la longueur du sujet

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par bobito24 Voir le message
    Il m'affiche false donc là aussi je pige pas trop, je me dis que ça doit venir de la TdF approchée alors la TdF inverse d'un truc approché ça doit pas être le même que la fonction de départ.

    A mon avis, voir la : Pourquoi 0.3-0.2-0.1 est-il différent de 0 ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Je me doutais bien qu'il y avait un problème de "virgule", mais je ne comprends toujours pas pour le reste, notamment les oscillations. Mais merci ça me permet de confirmer ce que je pensais ^^' sur l'histoire du false.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par bobito24 Voir le message
    mon vecteur y, aura une certaine length, mais cela me dit pas le temps en seconde si je veux représenter l'amplitude en fct du temps du signal de départ mais l'amplitude en fonction de la taille de la matrice na ?
    Euhh si la fréquence vaut 1Hz par exemple, chaque valeur de y correspond à 1 seconde, non ?

    Donc chaque valeur de y correspond à 1/Fs seconde

    Je ne vois pas bien où se situe le problème...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Oki je vois ^^ mici.

    Et pour l'échelle fréquentielle, je pars de -Fs à +Fs et je centre en 0 ?

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    Salut,

    J'ai retouché ton code :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    clear all
     
    a = 1;
    f0 = 5;
     
    tdebut = -5;
    tfin = 5;
    Te = 0.01;
    t = tdebut:Te:tfin;
     
    fdebut = -5;
    ffin = 5;
    Fe = 0.01;
    f = fdebut:Fe:ffin;
    % f = t ...
    x = exp(-a.*abs(t));
     
    X = 2*a./(a.^2+4*pi^2*f.^2);
    fx = fftshift(Te * fft(x)); % approximation de la TF
    xt = abs(ifft(fx)/Te); % TF inverse
     
    subplot (4,1,1); plot(t,x);
    subplot (4,1,2); plot(f,X);
    subplot (4,1,3); plot(length(x)*f*Te,abs(fx)), xlim([-5, 5]);
    subplot (4,1,4); plot(f,xt-x);
     
    max(abs(xt-x))
     
     
    if all(abs(xt-x) < 1e-6)
        disp('true');
    else
        disp('false');
    end
    ++ bonne chance

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Je reviens avec mes problèmes : en faisant la transformée de fourier du même signal qu' auparavant je n'obtiens pas du tout la même chose, là encore est-ce due uniquement à la discrétisation du temps ? Pourtant je ne vois pas en quoi cela peut intervenir, car on discrétise pour tracer la courbe, comment cela fonctionne-t-il lorsque matlab calcule la TF ?

    Surtout que l'écart entre les deux est assez conséquent ... la TF de matlab s'apparente plus à un pic de dirac qu'à celle calculée à partir d'une méthode symbolique

    Mici d'avance
    Images attachées Images attachées  

Discussions similaires

  1. Compréhension fonction transformée de Fourier
    Par NulleenMatlab dans le forum Signal
    Réponses: 6
    Dernier message: 08/05/2008, 11h59
  2. Augmentation d'image par transformée de Fourier
    Par FST_PFE dans le forum OpenCV
    Réponses: 3
    Dernier message: 29/04/2008, 17h46
  3. Recalage d'image par la Transformée de Fourier (Prob de Dimension des images)
    Par Programmeur_Aladdin dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 26/02/2008, 15h14
  4. Transformée de fourier rapide
    Par Aida dans le forum Traitement du signal
    Réponses: 23
    Dernier message: 03/01/2006, 15h14

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