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 :

Fourrier fenetre glissante / spectrogram


Sujet :

Signal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Points : 23
    Points
    23
    Par défaut Fourrier fenetre glissante / spectrogram
    Bonjour à tous,

    Alors voilà, je ne suis absolument pas spécialiste en TDS ni en MATLAB et j'aurais besoin d'un coup de main pour effectuer du fourrier fenêtre glissante.

    Dans un premier temps, j'essaie d'appliquer une TFFG sur cas un simple comme celui fourni en exemple dans l'aide MATLAB (dernier paragraphe):
    http://www.mathworks.fr/help/toolbox...bsoozdn-1.html

    Mon souci est que je ne parviens pas à obtenir le même résultat que les graph en fin de page...

    J'utilise la fonction spectrogram de MATLAB et surf pour la représentation graphique (il doit y avoir mieux que surf...)
    J'ai un doute sur la fonction spectrogram :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [S,F,T] = spectrogram(x,window,noverlap,f)
    Je ne vois pas bien le rôle de f malgré l'aide MATLAB.

    Pourriez-vous m'éclairer sur ce point?

    Ensuite voici le programme que j'ai fait pour essayer de reproduire l'exemple de MATLAB sans succès:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    clear all
    close all
    clc
     
    Fe=50;
    dt=1/Fe;
    ti=0;
    tf=5;
    t=ti:dt:tf-dt;
    df=1/(tf-ti);
    f=0:df:Fe/2;
    N=size(t,2);
     
    fsize=80;
    fdebut=50;
    fenetre=[ zeros(fdebut-1,1) ; ones(fsize+1,1) ; zeros(N-(fsize+fdebut),1) ];
     
    x1=1;
    f0=5;
    Xa=x1*sin(2*pi*f0*t);
    Xb=Xa.*fenetre';
     
    fXa=fft(Xa)/N;
    fXb=fft(Xb)/N;
     
    W=20;
    window=hamming(W);
    noverlap=W/2;
    [S,F,T] = spectrogram(Xb,window,noverlap,f,Fe);
     
    figure(1)
    surf(T,F,log10(abs(S)))
     
    fig=figure(2);
    set(fig, 'Position', [200 100 1000 800])
    subplot(2,2,1)
    plot(t,Xa)
    subplot(2,2,3)
    plot(t,Xb)
     
    subplot(2,2,2)
    plot(f,abs(fXa(1:length(fXa)/2+1)))
    set(gca,'ylim',[0 0.5])
    subplot(2,2,4)
    plot(f,abs(fXb(1:length(fXb)/2+1)))
    set(gca,'ylim',[0 0.5])
    Est-ce que je dois utiliser une autre fonction que spectrogram? Est-ce qu'il y a une erreur grossière dans mon code??

    Merci d'avance pour votre aide !!!

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Bonjour wantstofly,
    c'est marrant, j'ai implémenté cette semaine un code effectuant une fft avec fenêtre glissante après m'être considérablement tiré les cheveux puisque comme toi je n'ai aucune vrai connaissance en TDS.
    Voici une partie du code effectuant le calcul :

    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
    j=1; Nfft=4096 ; fe=res; 
    f = (fe/Nfft)*(0:Nfft-1); W1=hann(res); 
    TF1=zeros(Nfft); TF1b=zeros(Nfft);
     
    for ii=1:length(W1)
        W1b(ii)=W1(ii)^2;
    end
     
     for i=1:floor(res/3):m-res     
            Bp=PGA(i:i+res-1);
            data=Bp(:).*W1;
            TF1=fft(data,Nfft);
            TF2{1}(:,j)=2*abs(TF1(1:1+Nfft/2))/sum(W1);
            j=j+1;
     end
     
    TF3=max(TF2{1},[],2);
    FFT(:,1)=h(1:1+Nfft/2);
    FFT(:,2)=TF3;
    Il suffit alors de tracer FFT(:,2) en fonction de FFT(:,1) pour obtenir une fft avec fenêtre glissante tracer à partir des max. Tu peux aussi à la place des max prendre les mean suivant les besoins et ce que tu recherche.
    Je ne suis pas non plus totalement sur de moi et j'attends de faire suffisamment de cas test pour vérifier convenablement. En tout cas, pour l'instant j'obtiens des résultats qui vont dans le bon sens.
    En espérant d'avoir un peu aidé je te souhaite bon courage.

    Yassine.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Bonjour Yassine,

    Merci pour ton aide. Je vais regarder ton code pour voir si je peux m'en inspirer.

    As-tu essayer la fonction spectrogram? Car il me semble qu'elle fait exactement du fourrier fenetré. Le tout est de l'utiliser correctement chose que visiblement je n'arrive pas à faire...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    Bonjour wantstofly
    Alors je ne connais par vraiment les tenants et les aboutissant de la fonction spectrogram... Je me souviens l'avoir croisé et utilisé pour essayer il y a assez longtemps mais qu'il s'agissait plus d'une fonction permettant la représentation de la répartition du contenu fréquentiel de ton signal en fonction du temps et de leurs amplitude d'où une représentation avec la fonction surf...
    Je ne sais si j'ai été assez clair et je t'avoue que pour le coup je suis loin d'être totalement sur de moi.
    Par contre une petite précision sur le bout de code que je t'ai envoyé, il faut prendre le paramètre Nfft tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DT=B(2)-B(1);
    res=1/DT;
    m=length(B)
     
    Nfft=res ;
    B représentant la colonne temps dans mon signal de départ.

    Yassine.

Discussions similaires

  1. [Débutant] Fenetre glissante/ RMS
    Par zazoudandan dans le forum MATLAB
    Réponses: 2
    Dernier message: 01/06/2015, 15h41
  2. Calcule de la moyenne par fenetre glissante
    Par soumial dans le forum Traitement du signal
    Réponses: 1
    Dernier message: 27/02/2009, 11h28
  3. recherche par fenetre glissante
    Par guiguizekid dans le forum Général Python
    Réponses: 1
    Dernier message: 02/11/2008, 14h54
  4. Réponses: 1
    Dernier message: 30/07/2008, 15h13
  5. Transformée de Fourier Fenetre Glissante
    Par snussnusswilly dans le forum Signal
    Réponses: 3
    Dernier message: 10/08/2007, 18h13

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