Bonjour à tous
Ce post relève peut-être plus d'un problème d'algo, à vous de me dire !
Voici mon problème :
Je cherche à récupérer les valeurs hautes du signal en pièce jointe (courbe rouge), de manière à obtenir un signal continu (les portions de droites conviennent aussi) en perdant un minimum d'info. Le vecteur d'ordonnée contient près de 3600 valeur tout de même.
J'ai donc trouvé une fonction toute faite sur le site coopératif de matlab, envelope1.1, qui identifie les peaks via :
puis interpole entre. Une fois là, je pensai ma journée presque terminée... Hé non !
Code : Sélectionner tout - Visualiser dans une fenêtre à part extrMaxValue = y(find(diff(sign(diff(y)))==-2)+1)
Premier problème : aux alentours de 1050 il y a une rupture de pente qui n'est pas un max, mais malgré tout une info que je souhaite garder. J'ai donc procédé par étape en découpant le signal en 2 à cet endroit pour forcer ce point. Solution peu élégante, une autre est sans doute disponible ?
Deuxième problème : La courbe verte montre la première tentative "brute", avant découpage du signal en 2. Clairement, ça marche pas du tout ! Quelques poignée de cheveux plus tard, j'ai compris le pourquoi : il y a très peu de "vrai pics", voir la 2nd image jointe, à cause de l'échantillonnage. Pour "délisser" la courbe j'ai tenter d'appliquer une moyenne flottante avec un convn prenant de 5 à 100 valeurs autour. Réussite moyenne : les vrais pics apparaissent en moyennant sur trop de valeurs, je perd donc beaucoup d'information sur les hauteurs de pics.
Bravo à ceux qui en arrivent là ! En résumé voila mes problèmes :
- Comment inclure à un filtrage peak les "ruptures de pente" (cf x=1050 premier graph) ?
- Comment faire pour détecter les peaks pour des signaux "carrés" (cf graph 2) ?
Merci d'avance, la calvitie me guette à cause de ce problème !
Partager