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().

Signal + Peaks

<!-Comme vous pouvez le voir, les pics calculés ne sont pas assez précis. Ceux qui sont vraiment importants sont les trois du côté droit.

ma question: comment rendre cela plus précis?

<!-Mise à jour: les données sont ici:http://pastebin.com/KSBTRUmW

Pour 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.

enter image description here

16
demandé sur cjm2671 2014-08-29 19:16:12

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:

enter image description here

15
répondu cjm2671 2014-09-04 13:36:21

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 :-)

peak detection

10
répondu sweetdream 2015-01-20 13:15:08

é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]

enter image description here

2
répondu rapelpy 2014-08-31 19:16:25