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

MATLAB Discussion :

Détermination de certains pics dans un graph [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Détermination de certains pics dans un graph
    Bonjour à tous,

    Je continue avec mes questions autour de mon projet. J'ai besoin de réaliser une fonction qui simule des signaux que je crée artificiellement et qui présentent des pics introduit tout aussi artificiellement. Ce que je souhaite c'est déjà détecter les pics en question.

    Voici d'abord le 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
    function simulation(ampli_bruit,ampli_reflux,ampli_air,nbr_pic)
     
    %Cette simulation vise à simuler la détection d'un reflux dans un signal
    %crée artificiellement. On réalise le travail avec un signal artificiel
    %contenant le bruit+reflux, ainsi que bruit+reflux+sinus à 50 Hz. On les
    %décime ensuite pour avoir le résultat à 1Hz. A partir de là il faut
    %détecter le reflux et voir si on détecte le même à 1Hz ou 50Hz.
     
    %Contrôle des paramètres en entrée : ampli reflux (300),ampli air (5000) et
    %nbr pics (25=100/4 ie 4 sinusoides).
     
    %Contrôle de la cohérence des paramètres.
     
    if (ampli_bruit<=0)
        disp('entrez un ampli_bruit >0')
    end
    if (ampli_reflux<=0)
        disp('entrez un ampli_reflux>0)')
    end
    if(ampli_air<=0)
        disp('entrez un ampli_air>0')
    end
    if(nbr_pic<=0 | mod(nbr_pic,2)~=0)
        disp('entrez un nbr_pic>0 et qui soit modulo 2')
    end
     
    Bruit=ampli_bruit*rand(1,5000)';
    Reflux(1:2000)=zeros(1,2000);
    Reflux(3001:5000)=zeros(1,2000);
    Sinus(1:2500)=zeros(1,2500);
    Sinus(2601:5000)=zeros(1,2400);
     
    for i=1:500
     
        Reflux(2000+i)=-(ampli_reflux/500)*i;
     
    end
     
    for i=1:500
     
         Reflux(2500+i)=Reflux(2500)+(ampli_reflux/500)*i;
    end
     
    for t=1:100
     
    Sinus(2500+t)=ampli_air*sin(2*pi*(t/(100/nbr_pic)));
     
    end
     
    %Resultats à 50 Hz.
     
    A50=Bruit+Reflux'+Sinus';
    AL50=Bruit+Reflux';
     
    %Décimation : on obtient les résultats à 1Hz.
     
    A1=decimate(A50,50);
    AL1=decimate(AL50,50);
     
    %Visualisation des signaux créés artificiellement sur des figures
     
    figure(1)
    subplot(2,2,1)
    plot(A50)
    title('signal A50 : Bruit+Reflux+Sinus')
    xlabel('indices')
    ylabel('valeurs indices')
    hold on
    subplot(2,2,2)
    plot(A1)
    title('signal A1 : décimation de A50 du facteur 50')
    xlabel('indices')
    ylabel('valeurs indices')
    hold on
    subplot(2,2,3)
    plot(AL50)
    title('signal AL50 :Bruit+Reflux')
    xlabel('indices')
    ylabel('valeurs indices')
    hold on
    subplot(2,2,4)
    plot(AL1)
    title('signal AL1 :Bruit+Reflux')
    xlabel('indices')
    ylabel('valeurs indices')
     
    [ymax_A50,xmax_A50,ymin_A50,xmin_A50] = extrema(A50(2000:3000));
    [ymax_A1,xmax_A1,ymin_A1,xmin_A1] = extrema(A1(40:60));
    [ymax_AL50,xmax_AL50,ymin_AL50,xmin_AL50] = extrema(AL50(2000:3000));
    [ymax_AL1,xmax_AL1,ymin_AL1,xmin_AL1] = extrema(AL1(40:60));
    Ce que je fais c'est que je crée deux signaux A50 et AL50 sur 5000 points ainsi que leur versions décimées d'un facteur 50 : A1 et AL1. Je pourrai détailler ce que j'ai écrit dans le code pour les obtenir mais le mieux est que vous exécutiez directement ce code avec les paramètres suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    simulation(10,300,5000,4);
    Pour ceux qui ne voudrais pas essayer, je vous donne ici la figure obtenue à partir du code en ayant exécuté cette ligne :



    Voilà, donc comme vous le voyez les signaux comportent des pics : en bas il y en a deux, deux minima et en haut il y a plusieurs pics : respectivement 8 pics à gauche et 2 à droite. Bien sûr ce que j'appelle pic n'est pas forcément un pic pour matlab. Par exemple sur la figure AL50, en bas sur ce qui semble apparemment être des droites il y a des fluctuations (du bruitage). Bref, mon objectif est toutefois de détecter uniquement ce que je viens de définir comme pics. J'ai donc pensé recourir à la fonction extrema (cf mon code ci-dessus et voici le lien pour la télécharger : http://www.mathworks.com/matlabcentr...a-m-extrema2-m) appliquée aux signaux entre des bornes précises : 2000:3000 et 40:60 mais cela ne marche pas comme prévu : extrema renvoie des abscisses et ordonnées mais je ne comprends pas bien ce qu'il trouve. L'exemple le plus troublant : pour la courbe AL1 en bas à droite, il trouve xmin_AL1=11 et non pas 50 comme je m'y attendrai.

    Est-ce que j'utilise donc mal cette fonction ? De plus peux-t-on faire autrement ?

    Vous me direz peut-être que pour que les courbes autres que A50 en haut à gauche, je peux utiliser min et max pour obtenir les positions de ces pics. Mais comment faire pour la courbe restante qui a plusieurs minima et extrema ?

    Si bien sûr j'applique extrema sur les signaux complets les pics que je recherche sont bien dans les ximin et ymin (ou xmax,ymax) relevés mais le problème reste entier car je ne vois pas comment récupérer les "vrai" pics qui m'intéressent dedans.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    J'ai brièvement avancé sur une piste avec extrema. Mais bien sûr si vous pensez qu'il y a une solution plus simple que d'utiliser une fonction de ce type, je l'essaierai aussi.

    J'ai donc repris le code avec des notations plus claires et j'applique extrema sur l'intégralité des signaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [valeurs_indices_max_A50,indices_max_A50,valeurs_indices_min_A50,indices_min_A50] = extrema(A50);
    [valeurs_indices_max_A1,indices_max_A1,valeurs_indices_min_A1,indices_min_A1] = extrema(A1);
    [valeurs_indices_max_AL50,indices_max_AL50,valeurs_indices_min_AL50,indices_min_AL50] = extrema(AL50);
    [valeurs_indices_max_AL1,indices_max_AL1,valeurs_indices_min_AL1,indices_min_AL1] = extrema(AL1);
    Puis pour des raisons de commodité je récupère les indices et valeurs correspondantes aux minima ou extrema selon la piste dans une seule matrice avec deux colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    maxima_A50=[indices_max_A50 valeurs_indices_max_A50];
    minima_A50=[indices_min_A50 valeurs_indices_min_A50];
     
    maxima_A1=[indices_max_A1 valeurs_indices_max_A1];
    minima_A1=[indices_min_A1 valeurs_indices_min_A1];
     
    maxima_AL50=[indices_max_AL50 valeurs_indices_max_AL50];
    minima_AL50=[indices_min_AL50 valeurs_indices_min_AL50];
     
    maxima_AL1=[indices_max_AL1 valeurs_indices_max_AL1];
    minima_AL1=[indices_min_AL1 valeurs_indices_min_AL1]
    A ce stade, pour un des vecteurs précédent j'ai sur la première colonne les indices des minima/maxima (abscisses) et sur la deuxième colonne la valeur correspondante du minima/maxima (ordonnée). Je suis maintenant en train de concevoir une fonction qui me ramène abscisse et ordonnée des pics. Si vous reprenez ma figure plus haut, il est clair que je vais m'en sortir avec A1, AL1 et AL50 puisqu'il n'y a à chaque fois qu'un pic minimum ou maximum. C'est pour cela que je disais qu'utiliser min ou max me tirerait d'affaires plutôt que la conception d'une fonction. Mais bon j'essaye de traiter un cas général.

    Le problème qui va se poser est une situation similaire à A50. Par exemple, si je considère maxima_A50 plus haut, dedans je vais retrouver la position des 4 maxima et leur valeurs. Ci-dessous j'ai zoomé cette courbe pour que vous voyez bien ces 4 pics maxima :



    Vous voyiez donc les 4 pics maxima contenu dans maxima_A50 ; pour détecter le plus grand pic, j'utiliserai max, il n'y a pas de problème. Mais pour trouver les autres, c'est là que les choses se corsent. Je n'ai pas un critère précis pour trouver le "maxima directement inférieur au plus grand maxima" car entre ces deux pics il y a plein de points et surtout je ne suis pas sûr de ce que renvoie effectivement ce extrema.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    En fait, bon, je suis lucide : faire ce que je demande ne se fera surement pas en quelques lignes. D'une part je me limite donc à l'étude avec les paramètres (10,300,5000,4) et d'autre part je viens de constater que les pics que je recherche sont tout simplement donnés par extrema dès le début : ils figurent sur les premières lignes des vecteurs maxima et minima plus haut. Je les récupère donc directement comme suit :

    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
    %EXTREMAS DE A50
     
    %Calcul des 4 maxima : comme on limite l'étude à
    %simulation2(10,300,5000,4), on observe que les 4 extremas sont donnés
    %sur les 4 premières lignes de minima_50.
     
    maxima_A50_1=[maxima_A50(1,1) maxima_A50(1,2)];
    maxima_A50_2=[maxima_A50(2,1) maxima_A50(2,2)];
    maxima_A50_3=[maxima_A50(3,1) maxima_A50(3,2)];
    maxima_A50_4=[maxima_A50(4,1) maxima_A50(4,2)];
     
    %calcul des 4 minimas : idem
     
    minima_A50_1=[minima_A50(1,1) minima_A50(1,2)];
    minima_A50_2=[minima_A50(2,1) minima_A50(2,2)];
    minima_A50_3=[minima_A50(3,1) minima_A50(3,2)];
    minima_A50_4=[minima_A50(4,1) minima_A50(4,2)];
     
    %EXTREMAS DE A1
     
    maxima_A1_1=[maxima_A1(1,1) maxima_A1(1,2)];
    minima_A1_1=[minima_A1(1,1) minima_A1(1,2)];
     
    %EXTREMAS DE AL50
     
    minima_AL50_1=[minima_AL50(1,1) minima_AL50(1,2)];
     
    %EXTREMAS DE AL1
     
    minima_AL1_1=[minima_AL1(1,1) minima_AL1(1,2)];
    Donc à fortiori mon problème est bel et bien résolu ! J'ignore si cela marchera toujours en modifiant les paramètres d'entrée puisque le nombre d'extremas peut varier mais comme je me contente que d'un cas cela me suffit pour le moment.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. Trouver tous les objets d'un certain type dans un document?
    Par kobe dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 03/11/2005, 17h07
  3. [excel] echelle dynamique dans un graph
    Par shirya dans le forum Excel
    Réponses: 1
    Dernier message: 17/10/2005, 17h49
  4. Commande Update... vider certains champ dans table.
    Par angelevil dans le forum ASP
    Réponses: 3
    Dernier message: 04/05/2005, 21h08
  5. recuperer certains temes dans une chaine de caractere
    Par leviathan516 dans le forum ASP
    Réponses: 2
    Dernier message: 15/10/2004, 10h42

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