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

Algorithmes et structures de données Discussion :

Algorithme de détection de maxima locaux d'un signal (série de points)


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Algorithme de détection de maxima locaux d'un signal (série de points)
    Bonjour, je suis débutant, et j'aimerais trouver une réponse à un problème qui me tracasse, svp.

    J'ai une courbe quelconque, qui peut comporter des bosses et des creux. J'essaie de trouver un algorithme qui permet d'extraire toutes les bosses et tous les creux de cette courbe.

    J'y réfléchis depuis longtemps, mais je n'arrive toujours pas à trouver la solution.

    Soyez indulgent, svp.

    L'idée de base que j'ai est la suivante:

    if (signal(i-1) < signal(i)) && (signal(i) > signal(i+1)) --> Bosse

    if (signal(i-1) > signal(i)) && (signal(i) < signal(i+1)) --> Creux.

    Cette question peut paraître banale pour certains, mais ce n'est pas mon cas.

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    d'une part tu ne sais pas lire....

    Que vois-tu en bas de ma signature ??????

    Je ne réponds pas aux MP techniques
    Alors inutile d'en envoyer, et même 2 qui plus est...

    Ce qui se passe c'est ici, sur le forum ...


    Maintenant, pour ton problème, il y a une discussion ici-même avec un code-source (à adapter, mais qui fait ce que tu cherches), en C :

    Le fil :

    http://www.developpez.net/forums/d28...n-sous-series/


    Le post avec le code :


    post #29

    Il suffit de l'adapter, mais il détecte les creux et les bosses...

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    si tu veux tous les pics, tu peux calculer des gradients discrets, cela fera ressortir tous les pics (positifs ou négatifs).

    Maintenant, si tu veux tous les creux et toutes les bosses, tu veux en fait tous les intervalles entres les points où la dérivée s'annule (ben alors, on a oublié ses cours de première).
    Donc dans ce cas, il faut calculer la dérivée de ta fonction.

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses.

    souviron34, j'ai bien lu la signature mais je ne pensais pas que ce soit si technique que ça...

    ToTo13, j'ai déjà pensé faire l'histoire des gradiants ou dérivées mais cela me posera des problèmes par la suite, car je dois coder tout ça en Assembleur...Bonjour les problèmes liés aux langages de bas niveau, assez compliqués, hélas...

    En fait, pour être plus clair, si mon signal est une sinusoïde parfaite à deux fréquences, je devrais avoir en tout deux bosses et deux creux...le mien est très aléatoire...Mieux, il se peut que l'on est rien (aucun extrema dans ma fenetre d'analyse)...

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mamamiya_ Voir le message
    En fait, pour être plus clair, si mon signal est une sinusoïde parfaite à deux fréquences, je devrais avoir en tout deux bosses et deux creux...le mien est très aléatoire...Mieux, il se peut que l'on est rien (aucun extrema dans ma fenetre d'analyse)...
    Tu auras forcément un extréma... (et même 2 : un minimum et un maximum).

    Qu'il soit significatif est une autre histoire...

    Maintenant, comme le montre le code, c'est assez simple en maths de base, un peu ton principe exposé dans le premier post :

    je reprend mon code (donné dans le post) :

    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
      int Ntot = 0 ; /* Nombre d extrema */
      int imin = 0 ; /* dernière position d un minimum */
      int imax= 0 ; / dernière position d un maximum */
      int remonte = 0 ; /* indicateur de sens */
      int i ;
    
    
       for ( i = 1 ; i < NSignal ; i++ )
         {
    /* 
    ON REMONTE
    */
           if ( Signal[i] > Signal[i-1] )
             {
    /*
     DEBUT
    */
    	   if ( remonte == 0 )
    	     {
    	       remonte = 1 ; /* Minima est là */
                   imin = i - 1 ;
    	     }
    /*
     CONTINUATION
    */
    	   imax = i ;
    	 }
           else
    	 {
    /*
     ICI C'EST LE PASSAGE NORMAL
    */
    /* 
    DONC SI ON DESCEND ET QU'AVANT ON MONTAIT
    */
    	   if ( remonte == 1 )
    	     {
    	       remonte = 0 ;
    	       imax = i-1 ; /* Maxima est là */
    
    	       Ntot = Ntot + 1 ;
                   imin = i ;
    	       imax = i ;
    	     }
    /*
     SINON DESCENTE NORMALE
    */
    	   else
      	       imax = i ;
    	 }
         }

  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!
    J'ai une courbe quelconque
    Ce n'est pas vrai! Tu as une suite de valeurs discrètes et non une courbe. Alors, définis ce que tu appelles un extremum local pour une suite de valeurs et applique cette définition.
    Jean-Marc Blanc

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci à nouveau souviron34

    FR119492 (ou JM Blanc), j'ai une série de points effectivement. J'ai mes positions (temps) et mes amplitudes (une matrice de points, on peut dire).

    Le signal, en fait, dont je dispose est un signal biologique aléatoire, pas de forme mathématique spéciale. Il est aléatoire.

    Pour revenir à la notion de maximum local, j'ai mis en pièce jointe un fichier qui donne une allure possible de la courbe attendue...

    Merci pour vos contributions.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    l'algo cité ci-dessus devrait répondre à ta question...

    Maintenant tout dépend aussi de ta résolution... Si tu n'as qu'un point dans une descente et un dans un montée, il va falloir raffiner un tantinet..

  9. #9
    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!
    mes amplitudes
    Ce ne sont pas des amplitudes, mais des valeurs instantanées.
    une matrice de points
    Ce n'est pas une matrice, mais un tableau.

    Pour ton problème, deux définitions sont possibles pour un maximum local:
    1. Si une valeur est supérieure à la précédente et à la suivante, elle constitue un maximum local; si plusieurs valeurs sont égales, précédées et suivies immédiatement par des valeurs inférieures, on considère que le maximum local se trouve au milieu du groupe.
    2. On interpole ta suite de valeurs par une fonction continue (par ex. spline cubique) et on cherche les extrema de cette fonction comme étant les zéros de sa dérivée.

    C'est à toi qu'il incombe de choisir ce qui convient le mieux dans ton cas.
    Jean-Marc Blanc

  10. #10
    Membre averti

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    L'idée de base que j'ai est la suivante:

    if (signal(i-1) < signal(i)) && (signal(i) > signal(i+1)) --> Bosse

    if (signal(i-1) > signal(i)) && (signal(i) < signal(i+1)) --> Creux.
    ben elle me parait très bien cette idée de base, il suffit de la coder ?!

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Pour ton problème, deux définitions sont possibles pour un maximum local:
    1. Si une valeur est supérieure à la précédente et à la suivante, elle constitue un maximum local; si plusieurs valeurs sont égales, précédées et suivies immédiatement par des valeurs inférieures, on considère que le maximum local se trouve au milieu du groupe.
    2. On interpole ta suite de valeurs par une fonction continue (par ex. spline cubique) et on cherche les extrema de cette fonction comme étant les zéros de sa dérivée.
    Je plussoie la seconde proposition, autant pour la résistance au bruit que pour la précision de la detection (du moins si on fait abstraction de l'erreur de fitting)

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Je plussoie la seconde proposition, autant pour la résistance au bruit que pour la précision de la detection (du moins si on fait abstraction de l'erreur de fitting)
    c'est d'ailleurs ce que j'avais proposé et fait dans le thread indiqué d'ou était extrait le post ..

    Donc bien entendu je plussoie , mais le PO en question ne parlait pas d'interpolation à priori...

  13. #13
    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
    Pour pseudocode et souviron34:
    Tiens! c'est fou ce qu'on arrive à être d'accord.
    Jean-Marc

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Pour pseudocode et souviron34:
    Tiens! c'est fou ce qu'on arrive à être d'accord.
    Jean-Marc


    "Ce n'est pas aux vieux singes..."


  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Mais heuu.... je ne suis pas vieux.

  16. #16
    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
    Mais heuu.... je ne suis pas vieux.
    T'en fais pas, t'as qu'à attendre.

  17. #17
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Finalement c'est OK
    Merci à tous pour vos contributions.
    Tout est OK finalement, ce n'était qu'un problème de codage (facile pour les expérimentés que vous êtes)
    Cordialement,

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

Discussions similaires

  1. Algorithme Canny Détection Contours
    Par BATiViR dans le forum Composants VCL
    Réponses: 13
    Dernier message: 28/03/2013, 13h42
  2. Détection des maxima dans une fct d'autocorrélation
    Par Rosa2008 dans le forum Traitement du signal
    Réponses: 14
    Dernier message: 05/01/2012, 19h08
  3. Réponses: 1
    Dernier message: 07/03/2007, 09h28
  4. Réponses: 5
    Dernier message: 09/08/2006, 23h10
  5. Algorithme de détection de différences entre arbres
    Par GrandFather dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/03/2006, 18h34

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