Re-bonjour.
J'en suis maintenant à un problème de détection de pics. J'ai cherché un moment parmi les différents topics qui existaient à ce sujet, je n'ai pas trouvé mon bonheur, d'où ce post.
En PJ, différents types de données que j'ai à traiter. J'ai un peu moins de 2000 fichiers à faire, je cherche donc à faire un système automatisé.
Tout d'abord comme vous pouvez le voir, certains ont énormément de pics, d'autres très peu, et beaucoup moins marqués.
Ensuite, je ne peux pas utiliser de valeur seuil au dessus de laquelle je chercherai des pics. Je cherche à trouver tout ce qui ressemble de près ou de loin à un pic (maximum local). Le but étant derrière (entre autre) de mesurer le décalage temporel entre la courbe de température et la courbe de déformation.
J'ai donc envisagé la méthode suivante, que je peux pour l'instant effectuer au cas par cas avec des résultats satisfaisants, mais que je n'arrive pas à automatiser :
1 - Détermination d'une fréquence de coupure Fc1 permettant lors d'un filtrage de supprimer au maximum le bruit tout en gardant les pics. Appelons f1 les données résultantes.
2 - Détermination d'une fréquence de coupure Fc2 permettant d'avoir l'allure générale de la courbe, sans les pics. Appelons f2 les données résultantes.
3 - calcul de f= f1 - f2 : j'obtiens alors une courbe centrée sur zéro, avec des pics là où sont les pics de mes données brutes.
4 - détection des pics de f à partir d'une valeur seuil, et affichage de ces pics sur les donnés brutes.
Donc ça, ça marche bien. Mais je n'ai pas du tout envie de répéter cette méthode pour 2000 courbes. Je l'ai fait pour 10 courbes, ça m'a déjà pris 3 heures...
J'ai réussi à obtenir une règle du pouce entre les fréquences de coupure Fc1 et Fc2, on peut considérer grossièrement que Fc2 = Fc1/30. Le problème réside dans la détermination de Fc1. A l'œil nu, en regardant la courbe et en faisant varier Fc1 jusqu'à une valeur qui me plait, ça marche bien mais c'est long, très long. J'ai donc essayé différentes méthodes pour déterminer cette fréquence, aucune n'était satisfaisante :
- Faire évoluer Fc jusqu'à ce que la différence signal_brut-signal_filtré soit en dessous d'une valeur seuil fixée arbitrairement. Pas de bol, ce seuil varie d'une courbe à l'autre.
- Tenter de trouver une relation entre std et Fc : ça marche pas non plus, il faudrait pour ça que toutes mes courbes aient la même allure générale. Là je compare un peu des carottes et des courgettes.
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 Fc=0.5; inter=0.5; last_c=[0 0]; c=[inf inf]; i=0; d=1e-6; T=0.6e-3; while abs(last_c(1)-c(1))>d || abs(last_c(2)-c(2))>d <div style="margin-left:40px">i=i+1; inter=inter/2; filtered_sensor=lfilter(sensor,idx,Fc); last_c=c; c=sum(abs(sensor-filtered_sensor))/L; if c(1)>T || c(2)>T <div style="margin-left:40px">Fc=Fc+inter;</div>else <div style="margin-left:40px">Fc=Fc-inter;</div>end</div>end
- Choisir une valeur arbitraire de fréquence de coupure très faible(Fc=0.01), calculer std(sensor_brut - sensor_Fc) et essayer de trouver une corrélation avec Fc : Marche pas non plus, ce calcul s'apparente plus à une mesure de bruit : plus mon signal est bruité, plus le résultat est élevé.
Conclusion:
- Si vous vous y connaissez un peu en détection de pics, suis-je dans la bonne direction en cherchant à supprimer l'allure générale de ma courbe pour pouvoir utiliser une valeur seuil, ou y aurait-il une méthode plus adaptée ?
- A supposer que ladite méthode soit la seule viable, auriez vous des idées pour trouver la fréquence de coupure optimale ?
Partager