Sismik sinyalim y (i) var:
Burada bir maksimum buldum: i = 152.54, y = 222.29 manuel olarak ve kırmızı olarak çizildi.
Tüm maxima'ları otomatik olarak bulmak istiyorum.
Savitzky Golay Filtresinin (SGF) hem bir sinyalin hem de türevlerinin düzeltilmiş tahminlerini bulmak için kullanılabileceğini ve SGF'nin avantajlarından birinin minima ve maxima'yı diğer filtrelerden çok daha iyi koruduğunu okudum. Bu benim kullanımım için harika görünüyor.
SGF katsayıları üreten bir Matlab betiği buldum. Ve bunu, türev için 4. dereceden SGF katsayılarını bulmak için kullandı. Küçük bir Matlab betiği kodladım.
- Sinyalin türev için 4. sıra SGF katsayılarıyla kıvrılmasıyla sinyalin türevini bulur
- Türev değişikliklerinin işaret ettiği örnek (i, i + 1) çiftini bulur
- i ve i + 1 arasında doğrusal enterpolasyon ile türevin sıfır geçişini bulur
Senaryo:
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
Im benim senaryom Ben türev istenen sonucu vermek için işlevi almak için negatif negatif pozitif için test etmek zorunda kaldı, ancak bu beni şaşırttı. Maksimum için türev pozitiften negatife gitmemeli mi? Maksimum ve minima arasında ayrım yapmanın daha iyi bir yolu var mı?
Aşağıda, sinyalimdeki maksimum değeri bulmak için bu işlevi kullanmanın sonucu verilmiştir:
Sonuçlar iyi görünüyor, ancak bazı maksimumların bulunmadığını fark ettim: i = 143.13, 190.88, 256.97.
Bu diğer maksimalara yakın oldukları için mi?
En yakın iki maksimumu nasıl kontrol edebilirim?
Herhangi bir cevap için şimdiden teşekkürler!