Domanda

Sono in grado di scrivere qualcosa di me stesso, la ricerca di zero incroci della derivata prima o qualcosa del genere, ma sembra che un comune abbastanza funzione per essere inclusi nelle librerie standard.Qualcuno la conosce?

Il mio particolare applicazione è una matrice 2D, ma di solito dovrebbe essere utilizzato per trovare i picchi di FFTs, etc.

In particolare, in questi tipi di problemi, ci sono più forti picchi, e poi un sacco di piccoli "picchi" che sono solo causati dal rumore che deve essere ignorato.Questi sono solo alcuni esempi;non i miei dati reali:

1-dimensionale picchi:

FFT output with peaks

2-dimensionale picchi:

Radon transform output with circled peak

Il picco di ricerca algoritmo trovare la posizione di questi picchi (e non solo i valori), e, idealmente, dovrebbe trovare la vera inter-campione di picco, non solo l'indice con valore massimo, probabilmente utilizzando un'interpolazione quadratica o qualcosa del genere.

In genere si preoccupano solo di un paio di forti picchi, tanto da essere scelto perché sono al di sopra di una certa soglia, o perché sono il primo n picchi di un elenco ordinato, classificato dall'ampiezza.

Come ho detto, so come si fa a scrivere qualcosa di simile me.Sto solo chiedendo se c'è un pre-esistenti funzione o di un pacchetto che è noto per lavorare bene.

Aggiornamento:

Io tradotto script MATLAB e funziona decentemente per 1-D caso, ma potrebbe essere migliore.

Aggiornamento dell'aggiornamento:

sixtenbe creata una versione migliore per l'1-D caso.

È stato utile?

Soluzione

Non credo che quello che state cercando è fornita da SciPy. Vorrei scrivere il codice stesso, in questa situazione.

L'interpolazione spline e levigante da scipy.interpolate sono piuttosto bella e potrebbe essere molto utile per i picchi di montaggio e poi trovare la posizione del loro massimo.

Altri suggerimenti

Sto guardando un problema simile, e ho trovato alcuni dei migliori riferimenti provengono dalla chimica (da picchi di trovare in massa-spec dati).Per una buona revisione completa del picco di ricerca algoritmi leggere questo.Questo è uno dei migliori chiari giudizi di picco la ricerca di tecniche che ho imbattuto.(Wavelet sono i migliori per trovare picchi di questo tipo in dati di rumore.).

Sembra che i suoi picchi sono ben definite e non nascosti nel rumore.Che sia il caso mi consiglia di utilizzare liscia savtizky-golay derivati per trovare il picchi (Se si differenziano i dati di cui sopra avrai un pasticcio di falsi positivi.).Questa è una tecnica molto efficace ed è abbastanza facile da implementare (si ha bisogno di una classe matrix w/ operazioni di base).Se è sufficiente trovare il passaggio per lo zero della prima S-G derivati penso che sarai felice.

La funzione scipy.signal.find_peaks , come il suo nome suggerisce, è utile per questo. Ma è importante capire bene i suoi parametri width, threshold, distance e soprattutto prominence per ottenere una buona estrazione di picco.

Secondo le mie prove e la documentazione, il concetto di risalto è "il concetto utile" per mantenere i buoni picchi, ed eliminare i picchi di rumore.

Qual è (topografica) prominenza ? E ' "l'altezza minima necessaria per scendere per ottenere dalla vetta a qualsiasi terreno superiore" , come si può vedere qui:

 entrare descrizione dell'immagine qui

L'idea è:

  

Più alto è il rilievo, il più "importante" il picco è.

Prova:

 entrare descrizione dell'immagine qui

I usato un (rumoroso) sinusoide frequenza variabile apposta perché mostra molte difficoltà. Possiamo vedere che il parametro width non è molto utile qui, perché se si imposta un width minima troppo elevata, allora non sarà in grado di monitorare molto vicine cime nella parte alta frequenza. Se si imposta width troppo basso, si avrebbe molti picchi indesiderati nella parte sinistra del segnale. Stesso problema con distance. threshold confronta solo con i vicini diretti, che non è utile qui. prominence è quello che dà la soluzione migliore. Si noti che è possibile combinare molti di questi parametri!

Codice:

import numpy as np
import matplotlib.pyplot as plt 
from scipy.signal import find_peaks

x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)      # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)     # Required vertical distance to its direct neighbouring samples, pretty useless
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()

C'è una funzione in SciPy denominata scipy.signal.find_peaks_cwt che suona come è adatto per le vostre esigenze, però non ho esperienza con esso quindi non posso consigliare ..

http://docs.scipy.org/ doc / SciPy / riferimento / generata / scipy.signal.find_peaks_cwt.html

Per chi non è sicuro di quale picco trovare algoritmi da usare in Python, ecco una rapida panoramica delle alternative: https://github.com/MonsieurV/py-findpeaks

Volendo me un equivalente alla funzione findpeaks MatLab, ho trovato che il detect_peaks funzione di Marcos Duarte è un buon partito.

Abbastanza facile da usare:

import numpy as np
from vector import vector, plot_peaks
from libs import detect_peaks
print('Detect peaks with minimum height and distance filters.')
indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2)
print('Peaks are: %s' % (indexes))

che vi darà:

 detect_peaks risultati

Rilevamento picchi in uno spettro in modo affidabile è stato studiato un po ', ad esempio, tutto il lavoro sulla modellazione sinusoidale per musica / segnali audio negli anni '80. Cercare "Modelling sinusoidale" in letteratura.

Se i segnali sono pulite come l'esempio, un semplice "mi danno qualcosa con un'ampiezza superiore a N vicini" dovrebbe funzionare ragionevolmente bene. Se si dispone di segnali rumorosi, un modo semplice ma efficace è quello di guardare i vostri picchi di tempo, per tenere traccia di loro: poi rilevare linee spettrali invece di picchi spettrali. IOW, si calcola la FFT su una finestra scorrevole del segnale, per ottenere una serie di spettro in tempo (chiamato anche spettrogramma). È quindi guarda l'evoluzione del picco spettrale nel tempo (vale a dire in finestre consecutivi).

Ci sono standard di funzioni statistiche e metodi per l'individuazione dei valori anomali di dati, che è probabilmente quello che ti serve nel primo caso.Utilizzo di derivati di risolvere il secondo.Non sono sicuro per un metodo che risolve entrambe le funzioni continue e dati campionati, tuttavia.

Per prima cosa, la definizione di "picco" è vaga se senza ulteriori specificazioni. Ad esempio, per la seguente serie, vuoi chiamare 5-4-5 una punta o due?

1-2-1-2-1-1-5-4-5-1-1-5-1

In questo caso, è necessario almeno due soglie: 1) una soglia elevata solo sopra che possono un registro valore estremo come un picco; e 2) una soglia bassa in modo che i valori estremi separati da piccoli valori indicati diventerà due picchi.

rilevamento Peak è un argomento ben studiato in letteratura Extreme Value Theory, noto anche come "declustering dei valori estremi". Le sue applicazioni tipiche includono identificazione eventi dannosi sulla base di letture continue di variabili ambientali esempio analizzando la velocità del vento per rilevare eventi di tempesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top