J'ai un signal 1-D dans lequel j'essaie de trouver les pics. Je cherche à les trouver parfaitement.
Je fais actuellement:
import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))
Ce qui suit est un graphique avec des taches rouges qui montrent l'emplacement des pics comme trouvé par find_peaks_cwt()
.
Comme vous pouvez le voir, les pics calculés ne sont pas assez précis. Ceux qui sont vraiment importants sont les trois sur le côté droit.
Ma question: Comment puis-je rendre cela plus précis?
MISE À JOUR: Les données sont ici: http://Pastebin.com/KSBTRUmW
Pour certains antécédents, ce que j'essaie de faire est de localiser l'espace entre les doigts dans une image. Ce qui est tracé est la coordonnée x du contour autour de la main. Taches cyan = pics. S'il existe une approche plus fiable/robuste, veuillez laisser un commentaire.
Résolu, solution:
Filtrer d'abord les données:
window = signal.general_gaussian(51, p=0.5, sig=20)
filtered = signal.fftconvolve(window, data)
filtered = (np.average(data) / np.average(filtered)) * filtered
filtered = np.roll(filtered, -25)
Ensuite, utilisez angrelextrema selon la réponse de rapelpy.
Résultat:
Il existe une solution beaucoup plus simple en utilisant cette fonction: https://Gist.github.com/endolith/25086 qui est une adaptation de http://billauer.co.il/peakdet .html
Je viens d'essayer avec les données que vous avez fournies et j'ai obtenu le résultat ci-dessous. Pas besoin de pré-filtrage ...
Prendre plaisir :-)
Modifié après avoir obtenu les données brutes.
argelmax et arglextrma sont hors course.
La courbe est très bruyante, vous devez donc jouer avec une petite largeur de pic (comme mentionné précédemment) et le bruit.
Le meilleur que j'ai trouvé n'est pas très bon.
import numpy as np
import scipy.signal as signal
peakidx = signal.find_peaks_cwt(y_array, np.arange(10,15), noise_perc=0.1)
print peakidx
[10, 100, 132, 187, 287, 351, 523, 597, 800, 1157, 1451, 1673, 1742, 1836]