Come posso usare un filtro Golitz Savitzky per trovare i massimi locali (tra i campioni) in un segnale 1D campionato discretamente?


9

Ho un segnale sismico y (i): inserisci qui la descrizione dell'immagine

Qui ne ho trovato uno massimo: i = 152.54, y = 222.29 manualmente e tracciato in rosso.

Voglio trovare automaticamente tutti i massimi.

Ho letto che il filtro Savitzky Golay (SGF) può essere utilizzato per trovare stime uniformi sia di un segnale che dei suoi derivati, e che uno dei vantaggi dell'SGF è che conserva i minimi e i massimi molto meglio di altri filtri. Sembra fantastico per il mio uso.

Ho trovato uno script Matlab che genera coefficienti SGF. E usato questo per scoprire che i coefficienti SGF del 4 ° ordine per la derivata. Ho codificato un piccolo script Matlab che

  1. trova la derivata del segnale avvolgendo il segnale con i coefficienti SGF del 4 ° ordine per la derivata
  2. trova una coppia di campioni (i, i + 1) in cui la derivata cambia segno
  3. trova l'attraversamento zero della derivata per interpolazione lineare tra i e i + 1

script:

function [maxX,maxY] = findLocalMax(y)
% Kernel for 4th order Savitzky-Golay filter for finding derivative:
d4 = [0.0724 -0.1195 -0.1625 -0.1061 0 0.1061 0.1625 0.1195 -0.0724];

dy = conv(y,d4,'same'); % derivative

[m n] = size(dy);
maxX = [];
maxY = [];
for i = 1 : n - 1
  if dy(i) < 0 && dy(i+1) > 0 % max somewhere between i and i+1
    a = dy(i)/(dy(i) - dy(i+1)); % linear interpolation
    mx = i + a;
    maxX = [maxX mx];
    my = y(i)*(1-a) + y(i+1)*a; % linear interpolation
    maxY = [maxY my];
  end
end

Nel mio script ho dovuto verificare se la derivata cambia da negativa a positiva per ottenere la funzione per dare il risultato desiderato, tuttavia questo mi confonde. Il derivato per un massimo non dovrebbe passare da positivo a negativo? Esiste un modo migliore per distinguere tra massimi e minimi?

Di seguito è riportato il risultato dell'utilizzo di questa funzione per trovare i massimi sul mio segnale: inserisci qui la descrizione dell'immagine

I risultati sembrano buoni, ma noto che alcuni massimi non sono stati trovati: i = 143.13, 190.88, 256.97.

È perché devono avvicinarsi ad altri massimi?

Come posso controllare i due massimi più vicini possono essere?

Grazie in anticipo per le risposte!


Puoi tracciare l'output del filtro?
Jim Clay,

Risposte:


5

Anche se non ho familiarità con questo specifico tipo di filtro, in base alla trama che hai mostrato, immagino che i massimi che non sono stati trovati dal tuo processo stiano andando a confronto con la risoluzione temporale inerente al processo. Qualsiasi tipo di "livellamento" implica che vi è una certa macchia locale del segnale di interesse, tale che se ci sono due picchi vicini, è possibile che si fondano in uno solo. È possibile che un filtro di ordine inferiore presenti meno di questo comportamento, probabilmente a scapito della quantità di smoothing che si ottiene.

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.