Tôi có một tín hiệu địa chấn y (i):
Ở đây tôi đã tìm thấy một mức tối đa: i = 152,54, y = 222,29 bằng tay và vẽ nó bằng màu đỏ.
Tôi muốn tìm tất cả các cực đại tự động.
Tôi đọc rằng Bộ lọc Golitz Savitzky (SGF) có thể được sử dụng để tìm các ước tính được làm mịn của cả tín hiệu và các dẫn xuất của nó, và một trong những lợi ích của SGF là nó bảo tồn cực tiểu và cực đại tốt hơn nhiều so với các bộ lọc khác. Điều này nghe có vẻ tuyệt vời cho việc sử dụng của tôi.
Tôi tìm thấy một tập lệnh Matlab tạo ra các hệ số SGF. Và sử dụng điều này để thấy rằng các hệ số SGF bậc 4 cho đạo hàm. Tôi đã mã hóa một tập lệnh Matlab nhỏ
- tìm đạo hàm của tín hiệu bằng cách kết hợp tín hiệu với các hệ số SGF bậc 4 cho đạo hàm
- tìm cặp mẫu (i, i + 1) trong đó dấu hiệu thay đổi đạo hàm
- tìm thấy không giao thoa của đạo hàm bằng phép nội suy tuyến tính giữa i và i + 1
Kịch bản:
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
Theo kịch bản của tôi, tôi phải kiểm tra xem đạo hàm có thay đổi từ âm sang dương để lấy hàm để cho kết quả mong muốn hay không, tuy nhiên điều này làm tôi bối rối. Không phải đạo hàm cho tối đa đi từ tích cực sang tiêu cực? Có cách nào tốt hơn để phân biệt giữa cực đại và cực tiểu không?
Dưới đây là kết quả của việc sử dụng chức năng này để tìm cực đại trên tín hiệu của tôi:
Kết quả có vẻ tốt, nhưng tôi nhận thấy rằng một số cực đại không được tìm thấy: i = 143,13, 190,88, 256,97.
Đây có phải là vì chúng gần với cực đại khác?
Làm thế nào tôi có thể kiểm soát hai cực đại gần nhất có thể được?
Cảm ơn trước cho bất kỳ câu trả lời!