web-dev-qa-db-fra.com

signal scipy find_peaks_cwt ne trouvant 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 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().

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

enter image description here

20
cjm2671

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:

enter image description here

17
cjm2671

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

peak detection

14
sweetdream

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]

enter image description here

3
rapelpy