У мене сейсмічний сигнал y (i):
Тут я знайшов один максимум: i = 152,54, y = 222,29 вручну і накреслив його червоним кольором.
Я хочу знайти всі максимуми автоматично.
Я читав, що фільтр Savitzky Golay (SGF) може бути використаний для пошуку згладжених оцінок як сигналу, так і його похідних, і що однією з переваг SGF є те, що він зберігає мінімуми і максимуми набагато краще, ніж інші фільтри. Це чудово звучить для мого використання.
Я знайшов сценарій Matlab, який генерує коефіцієнти SGF. І використовував це для встановлення, що коефіцієнти SGF четвертого порядку для похідної. Я зашифрував невеликий сценарій Matlab, що
- знаходить похідну сигналу, перетворюючи сигнал на коефіцієнти SGF четвертого порядку для похідної
- знаходить пару зразків (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.
Це тому, що вони близькі до інших максимумів?
Як я можу контролювати найближчі два максимуми?
Заздалегідь дякую за будь-які відповіді!