Как использовать фильтр Савицкого Голея, чтобы найти локальные максимумы (между выборками) в дискретно дискретизированном 1D сигнале?

9

У меня есть сейсмический сигнал y (i): введите описание изображения здесь

Здесь я нашел один максимум: я = 152,54, у = 222,29 вручную и нарисовал его красным.

Я хочу найти все максимумы автоматически.

Я читал, что фильтр Савицкого-Голея (SGF) можно использовать для нахождения сглаженных оценок как сигнала, так и его производных, и что одно из преимуществ SGF заключается в том, что он сохраняет минимумы и максимумы намного лучше, чем другие фильтры. Это звучит отлично для моего использования.

Я нашел скрипт Matlab, который генерирует коэффициенты SGF. И использовал это, чтобы найти, что коэффициенты SGF 4-го порядка для производной. Я написал небольшой скрипт Matlab, который

  1. находит производную сигнала путем свертки сигнала с коэффициентами SGF 4-го порядка для производной
  2. находит пару выборок (i, i + 1), где производная меняет знак
  3. находит пересечение нуля производной путем линейной интерполяции между 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.

Это потому, что они близки к другим максимумам?

Как я могу контролировать ближайшие два максимума?

Заранее спасибо за любые ответы!

Энди
источник
Можете ли вы построить выход фильтра?
Джим Клэй

Ответы:

5

Хотя я не знаком с этим конкретным типом фильтра, основываясь на графике, который вы показали, я бы предположил, что максимумы, которые не обнаружены вашим процессом, просто противоречат временному разрешению, присущему процессу. Любой вид «сглаживания» подразумевает, что имеется некоторое локальное по времени размытие сигнала, представляющего интерес, так что, если есть два соседних пика, возможно, что они будут объединены в один. Вполне возможно, что фильтр более низкого порядка может показывать меньше такого поведения, вероятно, за счет количества сглаживания, которое вы получаете.

Джейсон Р
источник