Individuazione dei picchi locali tra i campioni


10

Ho campioni discreti di un segnale sismico y [ n ] : ny[n]inserisci qui la descrizione dell'immagine

Voglio trovare i massimi locali nel segnale.

y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

i=4.25

y[n]

  • Come posso trovare maxima usando l'interpolazione?
  • Quale forma di interpolazione dovrei usare?

Come puoi vedere il mio segnale non è molto rumoroso, tuttavia sarebbe positivo se il metodo eseguisse anche un po 'di filtraggio in modo che i massimi superassero un treshold e avessero una certa larghezza (nessun picco).

Il mio problema più grande, tuttavia, è solo trovare picchi tra i campioni. Qualche suggerimento per un buon modo per farlo?

Grazie in anticipo per le risposte!


1
Forse guarda la domanda 1 e la domanda 2 .
Geerten,

Diversi metodi per spettri di frequenza: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith

Quel secondo non ha una risposta @Geerten ;-)
Ivo Flipse

1
Oh..haha, buon punto. Bene, farò riferimento a questa domanda su quella domanda;)
Geerten il

Risposte:


7

Ottenere una risoluzione del sottocampione

Una soluzione molto economica (in termini di dimensioni del codice) è solo quella di sottocampionare il segnale. In matlab, questo può essere fatto con interp(y ,ratio). Una soluzione leggermente più complicata consiste nel rilevare picchi ingenuamente; e per ogni picco, inserendo una parabola attraverso y [picco - 1], y [picco], y [picco + 1]; quindi usando il punto in cui questa parabola è massima come la vera posizione di picco.

Per quanto riguarda il rilevamento dei picchi

Un mucchio di tecniche che aiutano:

  • Come suggerito da Hilmar, convolgere il segnale da una finestra gaussiana o di Hann, la cui larghezza è all'incirca uguale alla metà dell'intervallo minimo che si desidera vedere tra i picchi rilevati. Poiché l'accuratezza temporale sembra essenziale per la tua applicazione, assicurati di prendere in considerazione il ritardo introdotto dal filtro!
  • Sottrai al tuo segnale una versione filtrata di se stesso (con una finestra di osservazione abbastanza grande); e dividere il risultato per una versione filtrata di deviazione standard di se stessa. Questo elimina le tendenze e consente di esprimere le soglie in unità di deviazioni standard.
  • Per la selezione dei picchi, lo formulerò usando un filtro "top-hat". Definisci la versione filtrata del tuo cappello superiore come yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); e usa come picchi i punti in cui y [n] == yt [n] e y [n]> soglia.

Tutto ciò può essere implementato in modo molto efficiente in Matlab con pochi passaggi di nlfilter.


La combinazione di upsampling più interpolazione parabolica può funzionare meglio di entrambi.
hotpaw2,

3

Prova un rilevatore di picco con perdita:

y[n] = max(abs(x[n]),a*y[n-1]);

dove "a" è un numero inferiore a 1 che controlla la velocità con cui il rilevatore decade. Determina quanto possono essere vicini i picchi vicini senza affondare in uno solo. Quindi eseguire un rilevamento della soglia.


Hai sia ax [n] che y [n] nella tua equazione. È corretto o dovrebbe essere solo y [n]?
Andy,

x [n] è l'input, y [n] è l'output. Risposta errata nel complesso, c'è un errore di battitura (risolto ora) e ho frainteso la domanda. Scuse
Hilmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.