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 :

Détection de pics


Sujet :

Signal

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut Détection de pics
    Salut,

    Je cherche à écrire un bout de code qui me detecte les pics d'un séquencement donné, j'ai pensé à fixer un seuil et regarder les montés et les descentes par ce seuil, mais cette méthode ne permettra de détecter les pics en dessous du seuil (même si leur valeur est faible, ils restent toujours des pics) et aussi si le sommet d'un pic, lui même, est divisé en deux pics successif, il ne sera compté que pour un seul.

    Enfin, cette méthode ne donne pas de bon résultats, et par suite je cherche de l'aide pour détecter efficacement les pics.

    Merci pour toute proposition et à bientôt.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    tout dépend de comment tu définis tes "pics", mais si tu donne comme valeur seuil la valeur moyenne de ton signal à la fonction que tu imagine tu devrais trouver ton bonheur nan? peut-être qu'un exemple concret(une image ) pourrait aider à mieux comprendre ce que tu recherche

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    y=rand(1,15);
    x=1:15;
     
    sa=sign(diff([-inf y]));
    sb=sign(diff([-inf y(end:-1:1)]));
    sb=sb(end:-1:1);
     
    idx=(sa==1 & sb==1);
     
    figure
    plot(x,y,'b-',x(idx),y(idx),'r*')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    J'ai pensé dès le début à mettre cette image jointe, mais dsl pour sa qualité du graphe

    Voila, les pic detecté sont: 1, 2 et 3.
    Mais, en oubliant le seuil, je veux aussi detecter les pics 6, 7 et 8.
    De même, le pic 3 contient lui même deux pics qui doivent être distinqués.

    J'espère que c'est plus clair maintenant, merci d'essayer.
    Images attachées Images attachées  

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    Merci bien Dut, ça me donne exactement ce que je cherchai.
    Mais j'aimerai que tu m'expliques un peu ces quelques lignes, le principe (mathématique) de cette detection. Car ça me semble intéressant.

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Il faudrait savoir ce qui est un pic et ce qui n'en est pas un. Les deux bouts de programmes suivants représentent la même fonction avec deux résolutions différentes. Le nombre de pics est-il le même?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    n=3;
    x=1e6;
    m=100;
    d=1e-7*x;
    r=x*ones(1,n);
    p=poly(r);
    xmin=x-m*d;
    xmax=x+m*d;
    xtab=linspace(xmin,xmax,2*m+1);
    ztab=xtab-x;
    ytab=polyval(p,xtab);
    plot(ztab,ytab)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    n=3;
    x=1e6;
    m=200;
    d=.5e-7*x;
    r=x*ones(1,n);
    p=poly(r);
    xmin=x-m*d;
    xmax=x+m*d;
    xtab=linspace(xmin,xmax,2*m+1);
    ztab=xtab-x;
    ytab=polyval(p,xtab);
    plot(ztab,ytab)
    Un maximum, ce que tu appelles un pic, correspond à un changement de signe de la dérivée. Or le calcul numérique de la dérivée d'un signal bruité n'a souvent aucun sens.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Un pic est un maximum donc la valeur qui le précède et celle qui le suit sont inférieures.

    Il suffit donc de faire la différence des valeurs dans un sens puis dans l'autre et de prendre les valeurs pour lesquels le signe de cette différence vaut +1 dans les deux cas.

    On ajoute le -inf pour identifier directement le bon indice. Car DIFF retourne un vecteur de taille n-1

    Par exemple, pour un vecteur [1 2 4 3], le maximum vaut 4 est se trouve à la 3ème place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    y=[1 2 4 3]
    t=diff([-inf y]);
    sa=sign(t)
     
    t=diff([-inf y(end:-1:1)]);
     
    sb=sign(t);
    sb=sb(end:-1:1)
    y =

    1 2 4 3


    sa =

    1 1 1 -1


    sb =

    -1 -1 1 1


    idx =

    0 0 1 0
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    Merci Dut, ton idée est bien claire maintenant.

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Une autre méthode (quasi similaire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    y=rand(1,30);
     
    figure
    plot(y)
     
    s=sign(diff([-inf y]));
     
    idxmax=strfind(s,[1 -1]);
    idxmin=strfind(s,[-1 1]);
     
    hold on 
     
    plot(idxmax,y(idxmax),'ro',idxmin,y(idxmin),'go')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    Salut Dut,


    Oui ça donne le même résultat et c'est bien le même principe.

    Dans le 1er code,

    Citation Envoyé par Dut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    y=rand(1,15);
    x=1:15;
     
    sa=sign(diff([-inf y]));
    sb=sign(diff([-inf y(end:-1:1)]));
    sb=sb(end:-1:1);
     
    idx=(sa==1 & sb==1);
     
    figure
    plot(x,y,'b-',x(idx),y(idx),'r*')
    On peut détecer les creus par cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx_creu=(sa==-1 & sb==-1);
    Ce code détecte bien les maximas au début et à la fin, mais pas les creux , je pense faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    y=rand(1,30);
     
    figure
    plot(y)
     
    s=sign(diff([+inf y +inf]));
     
    idxmax=strfind(s,[1 -1]);
    idxmin=strfind(s,[-1 1]);
     
    hold on 
     
    plot(idxmax,y(idxmax),'ro',idxmin,y(idxmin),'go')
    Il détecte bien les creux au début et fin.
    Mais est ce qu'on ne pourra pas avoir quelque chose qui détecte les deux à la fois?

    Merci et à bientôt.

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par fatenov Voir le message
    Mais est ce qu'on ne pourra pas avoir quelque chose qui detecte les deux à la fois?
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    y=rand(1,30);
     
    figure
    plot(y)
     
    s=sign(diff([+inf y +inf]));
     
    idx=(s(2:end).*s(1:end-1))==-1;
     
    hold on 
     
    plot(find(idx),y(idx),'ro')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    Il ne détecte pas les pics (maximas) aux bornes.

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Je ne suis pas sûr de bien comprendre ce que tu cherches, mais de toute façon, la première et la dernière valeur sont des valeurs particulières pour lesquelles il faudra faire un test à part avec respectivement, la valeur suivante et la valeur précédente, non ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 90
    Points : 74
    Points
    74
    Par défaut
    Oui c'est bien le cas, d'ailleur, on peut les négliger si on s'intéresse à des signaus de taille très grande, en éliminant les bornes.
    Mais j'ai voulu savoir s'il y a une méthode pour tout détecter qui nous permet d'être comme ça:

    Merci et à bientôt.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Findpeaks
    bonjour,
    pourquoi ne pas utilisé la fonction findpeaks
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [peak locs]= findpeaks(y)
    dont peak donne les maximums des pics et locs les indices des pics
    tu peux essayé ça pour un vecteur et ça marche.

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par zaiani Voir le message
    findpeaks
    C'est bien entendu la fonction à utiliser en priorité... quand on a la chance de posséder la Signal Processing Toolbox
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    la référence dans le domaine ce sont les articles de Karin Dressler pour le mirex

    celui ci par exemple : http://www.music-ir.org/evaluation/m...y/dressler.pdf

  18. #18
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    thanks for your help DUT !!! it is an amazing simple IDEa

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

Discussions similaires

  1. Détection de pics
    Par miss_angel dans le forum Signal
    Réponses: 2
    Dernier message: 23/03/2010, 10h54
  2. détection de pic
    Par miss_angel dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/02/2010, 20h56
  3. Détection de pics
    Par cedric06000 dans le forum Scilab
    Réponses: 20
    Dernier message: 03/08/2009, 18h41
  4. Réponses: 14
    Dernier message: 23/01/2009, 17h07
  5. [LabView 8.2] Détection de pic
    Par tacoumi dans le forum LabVIEW
    Réponses: 5
    Dernier message: 06/06/2008, 09h20

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