У меня есть сейсмический сигнал y (i):
Здесь я нашел один максимум: я = 152,54, у = 222,29 вручную и нарисовал его красным.
Я хочу найти все максимумы автоматически.
Я читал, что фильтр Савицкого-Голея (SGF) можно использовать для нахождения сглаженных оценок как сигнала, так и его производных, и что одно из преимуществ SGF заключается в том, что он сохраняет минимумы и максимумы намного лучше, чем другие фильтры. Это звучит отлично для моего использования.
Я нашел скрипт Matlab, который генерирует коэффициенты SGF. И использовал это, чтобы найти, что коэффициенты SGF 4-го порядка для производной. Я написал небольшой скрипт Matlab, который
- находит производную сигнала путем свертки сигнала с коэффициентами SGF 4-го порядка для производной
- находит пару выборок (i, i + 1), где производная меняет знак
- находит пересечение нуля производной путем линейной интерполяции между i и i + 1
Автор сценария:
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
В моем сценарии я должен был проверить, изменяется ли производная с отрицательной на положительную, чтобы получить функцию, дающую желаемый результат, однако это меня смущает. Не должен ли производный по максимуму перейти от положительного к отрицательному? Есть ли лучший способ отличить максимумы от минимумов?
Ниже приведен результат использования этой функции для поиска максимумов в моем сигнале:
Результаты выглядят хорошо, но я замечаю, что некоторые максимумы не найдены: i = 143,13, 190,88, 256,97.
Это потому, что они близки к другим максимумам?
Как я могу контролировать ближайшие два максимума?
Заранее спасибо за любые ответы!