scipy signal znajdź szczyty cwt nie znajdujesz dokładnie szczytów?

Mam sygnał 1-D, w którym próbuję znaleźć szczyty. Szukam ich idealnie.

Obecnie robię:

import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))

Poniżej znajduje się Wykres z czerwonymi plamami, które pokazują położenie szczytów znalezionych przez find_peaks_cwt().

Sygnał + Szczyty

Jak widać, obliczone szczyty nie są wystarczająco dokładne. Te, które są naprawdę ważne, to trzy po prawej stronie.

Moje pytanie: Jak zrobić to bardziej dokładnie?

Aktualizacja: dane są tutaj: http://pastebin.com/KSBTRUmW

Dla jakiegoś tła, staram się zlokalizować przestrzeń pomiędzy palcami na obrazie. Wykreślona jest współrzędna x konturu wokół dłoni. Cyan plamy = szczyty. Jeśli istnieje bardziej wiarygodne/solidne podejście to, proszę zostawić komentarz.

Tutaj wpisz opis obrazka

Author: cjm2671, 2014-08-29

3 answers

Rozwiązany, rozwiązanie:

Najpierw Filtruj DANE:

  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)

Następnie użyj angrelextrema zgodnie z odpowiedzią rapelpy ' ego.

Wynik:

Tutaj wpisz opis obrazka

 15
Author: cjm2671,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-04 13:36:21

Istnieje znacznie łatwiejsze rozwiązanie przy użyciu tej funkcji: https://gist.github.com/endolith/250860 który jest adaptacją http://billauer.co.il/peakdet.html

Właśnie próbowałem z danymi, które podałeś i mam wynik poniżej. Nie ma potrzeby wstępnego filtrowania...

Enjoy: -)

Detekcja szczytowa

 10
Author: sweetdream,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 13:15:08

Edytowane po pobraniu surowych danych.

Argelmax i arglextrma odpadają z wyścigu.

Krzywa jest bardzo głośna, więc musisz grać z małą szerokością piku (jak pv. wspomniane) i hałas.

Najlepsze, jakie znalazłem, nie wygląda zbyt dobrze.

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]

Tutaj wpisz opis obrazka

 2
Author: rapelpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-31 19:16:25