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 :

filtrage de données océanographiques


Sujet :

Signal

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Par défaut filtrage de données océanographiques
    Bonjour,
    Je cherche à partir d'un signal de courant mesuré en mer à séparer les différents processus, courants de marée, courants dus au vent qui interviennent à des fréquences différentes.
    Mon but est donc de passer dans le domaine spectral pour sélectionner des bandes spectrales, par exemple entre 11h et 13h pour isoler le signal de marée. Jusqu’à présent je mettais assez brutalement les valeurs en dehors de la bande à zéro, mais le signal récupéré en sortie n'est pas toujours très propre.
    Par exemple sur la Figure 1 je crée trois signaux sinusoïdaux avec des fréquences de trois jours, 17h et 12h. je les somme. le but est de les recomposer le mieux possible en filtrant les autres.

    Figure 1:


    Pour vérifier que je ne fais pas de bêtise, je passe dans le domaine spectral (fft) et je repasse en temps (ifft) sans rien enlever. Le spectre est présenté sur le premier subplot de la Figure 2. On retrouve bien les trois pics aux fréquences des trois signaux additionnés. Si je passe en temps, je retrouve bien mon signal original (subplot 2 Figure 2, en vert le signal recomposé et en noir le signal initial). Le subplot 3 est juste un zoom du subplot 2.

    Figure 2:


    Maintenant si j'essaie de récupérer le signal à 17h (je vous montre celui-ci car c'est le pire, le signal filtré à 3j est bon celui par contre). Donc en gros ma méthode: je mets à zéro ce qui est en dehors de la bande [15h 19h] de chaque côté du spectre. Voila ce que ça donne:

    Figure 3:


    Donc en gros c'est pas mal sauf au début et à la fin du signal ou c'est pas bon.
    J'ai essayé d'utiliser un filtre passe bande comme expliqué dans la faq mais j'ai du me gourer quelque part, ça filtrait rien du tout...

    voila le bout de 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    clear all
    scrsz = get(0,'ScreenSize');
    %longueur du signal 2mois donc 2*30jours de 24h -1
    lend=2*30*24-1;
    %echantillonage de 1h
    T = 3600;
    t=(1:lend-1)*T;tmin=min(t);tmax=max(t);
     
    %Définition des fréquences des signaux
    f1=(3*24*3600);
    f2=(17*3600);
    f3=(12*3600);
     
    %creation des signaux
    u1=0.20*sin(2*pi/f1*t);
    u2=0.10*sin(2*pi/f2*t);
    u3=0.12*sin(2*pi/f3*t);
     
    %signal complet
    y1=(u1+u2+u3)';
    L = size(y1,1); 
     
     
     
    %plot des signaux
    k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
    subplot(4,1,1,'fontsize',16)
    plot(t(1:L),u1,'k')
    title('u1=0.20*sin(2*pi/f1*t)')
    subplot(4,1,2,'fontsize',16)
    plot(t(1:L),u2,'k')
    title('u2=0.10*sin(2*pi/f2*t)')
    subplot(4,1,3,'fontsize',16)
    plot(t(1:L),u3,'k')
    title('u3=0.12*sin(2*pi/f3*t)')
    subplot(4,1,4,'fontsize',16)
    plot(t(1:L),y1,'k')
    title('u1+u2+u3')
     
     
     
    Fs= 1/T;
    f1 = Fs/2*linspace(0,1,floor(L/2));
    Y1 = fft(y1)/L;
     
    k19=1/(19*3600);
    ik19=max(find((f1<k19)));
    k15=1/(15*3600);
    ik15=max(find((f1<k15)));
     
     
     
     
    %signal complet
    r1=real(ifft(Y1)*L); 
     
    k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
    subplot(3,1,1,'fontsize',12)
        plot(f1,2*abs(Y1(1:floor(L/2),: )),'k','linewidth',2)
        set(gca,'XScale','log')
        xlim([f1(1) f1(floor(L/2))])
        legend('Spectre sélectionné')
     
    sb1=subplot(3,1,2,'fontsize',12)
        plot(t(1:L),y1,'k','linewidth',2);
        hold on
        plot(t(1:L),r1','--g','linewidth',2);
        xlim([tmin-1 tmax+1])
     
    sb1=subplot(3,1,3,'fontsize',12)
        plot(t(1:L),y1,'k','linewidth',2);
        hold on
        plot(t(1:L),r1','--g','linewidth',2);
        legend('signal initial','signal filtré recomposé')
        xlim([tmin-1 (tmax+1)/5])
     
     
     
     
    %Filtrage autour de 17h
    Y12=Y1;
    %je supprime les périodes plus grandes que 19h des deux côtés du spectre
    Y12(1:ik19,: )=0;
    Y12(end-ik19:end,: )=0;
    % je supprime les périodes plus petites que 15h
    Y12(ik15:end-ik15,: )=0;
     
     
    lt1=real(ifft(Y12)*L); 
     
    k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
    subplot(3,1,1,'fontsize',12)
        plot(f1,2*abs(Y12(1:floor(L/2),: )),'k','linewidth',2)
        set(gca,'XScale','log')
        xlim([f1(1) f1(floor(L/2))])
        legend('Spectre sélectionné')
     
    sb1=subplot(3,1,2,'fontsize',12)
        plot(t(1:L),u2,'k','linewidth',2);
        hold on
        plot(t(1:L),lt1','--g','linewidth',2);
        xlim([tmin-1 tmax+1])
     
    sb1=subplot(3,1,3,'fontsize',12)
        plot(t(1:L),u2,'k','linewidth',2);
        hold on
        plot(t(1:L),lt1','--g','linewidth',2);
        legend('signal initial','signal filtré recomposé')
        xlim([tmin-1 (tmax+1)/5])
    J'ai une question en plus, quand on part d'un signal pair, à quoi correspond le réel au milieu du spectre? Ne sachant pas ce que c'était je suis parti de signaux impairs et de cette manière je n'ai pas de réels au centre.

    J'espère que vous pourrez m'aider, je suis en fin de thèse et je suis à la bourre......
    merci beaucoup

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Par défaut
    Bonjour,
    On dirait un effet de fenêtrage. Je n'ai pas regarde ton code en détail... Ne serait-ce pas un problème de taille de la FFT ?
    Bon courage

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Par défaut
    Re-bonjour,

    J'ai lance ton code et il apparait en effet que le spectre est fenêtré avant la TF inverse (spectre sélectionné). La multiplication de cette fenêtre (rectangulaire) dans le domaine fréquentiel se répercute en convolution par un sinus cardinal dans le domaine temporel. C'est ce qui donne l'ondulation de l’amplitude du sinus.

    Je pense que le plus simple serait de faire plutôt une détection de maximum. Dans ce cas tu aurais un beau sinus.

    En espérant que ça aide

    A bientôt

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Par défaut
    Bonjour,
    merci pour ta réponse, je viens juste de voir ta réponse,
    qu'est-ce que tu veux dire par détection de maximum?
    merci

Discussions similaires

  1. Filtrage de données avec deux listbox
    Par kinaï dans le forum ASP.NET
    Réponses: 0
    Dernier message: 05/09/2007, 11h13
  2. Réponses: 1
    Dernier message: 05/06/2007, 17h19
  3. Réponses: 3
    Dernier message: 30/03/2007, 09h53
  4. filtrage de données
    Par gil35131 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/10/2006, 18h49
  5. filtrage de données
    Par gil35131 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/10/2006, 11h58

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