le signal de scipy trouve les pics cwt ne trouve pas les pics avec précision?
j'ai un signal 1-D dans lequel j'essaie de trouver les pics. Je cherche à les trouver parfaitement.
je suis actuellement en train de faire:
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()
.
ma question: comment rendre cela plus précis?
<!-Mise à jour: les données sont ici:http://pastebin.com/KSBTRUmWPour certains d'arrière-plan, 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. Cyan spots = pics. S'il existe une approche plus fiable/robuste, veuillez laisser un commentaire.
3 réponses
résolu, solution:
filtrer les données en premier:
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)
puis utiliser angrelextrema selon la réponse de rapelpy.
Résultat:
il y a une solution beaucoup plus facile en utilisant cette fonction: https://gist.github.com/endolith/250860 qui est une adaptation de http://billauer.co.il/peakdet.html
j'ai juste essayé avec les données que vous avez fournies et j'ai obtenu le résultat ci-dessous. Pas besoin de pré-filtrage...
Profiter :-)
édité après avoir obtenu les données brutes.
argelmax et arglextrma sont hors course.
la courbe est très bruyante, donc vous devez jouer avec une petite largeur de crête (comme pv. mentionné) et le bruit.
Le meilleur que j'ai trouvé ne semble pas très bonne.
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]