Ho un segnale sismico y (i):
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
- trova la derivata del segnale avvolgendo il segnale con i coefficienti SGF del 4 ° ordine per la derivata
- trova una coppia di campioni (i, i + 1) in cui la derivata cambia segno
- 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:
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!