Нахождение локальных пиков между образцами

10

У меня есть дискретных выборок сейсмического сигнала : у [ н ]ny[n]введите описание изображения здесь

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

Наивный тест для если максимум будет: y [ n ] : m a x i m a,  если  y [ n ] > y [ n - 1 ]  и  y [ n ] > y [ n + 1 ]y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

Однако максимумы, вероятно, расположены между выборками, например, максимум может быть при .i=4.25

Чтобы найти максимумы между выборками, я считаю, что мне нужно интерполировать .y[n]

  • Как найти максимумы с помощью интерполяции?
  • Какую форму интерполяции я должен использовать?

Как вы можете видеть, мой сигнал не очень шумный, но было бы хорошо, если бы метод также немного фильтровал, чтобы максимумы превышали порог и имели определенную ширину (без пиков).

Однако моя самая большая проблема - просто найти пики между образцами. Какие-нибудь предложения для хорошего способа сделать это?

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

Энди
источник
1
Может быть, посмотрите на вопрос 1 и вопрос 2 .
Гертен
Существует несколько методов для частотных спектров: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
эндолиты
Этот второй не имеет ответа @Geerten ;-)
Ivo Flipse
1
Ох..хаха, хорошая мысль. Ну, я вернусь к этому вопросу по этому вопросу;)
Geerten

Ответы:

7

Получение разрешения сэмпла

Очень дешевое (с точки зрения размера кода) решение - просто повысить частоту вашего сигнала. В Matlab это можно сделать с помощью interp(y ,ratio). Несколько более сложное решение состоит в наивном обнаружении пиков; и для каждого пика - подгонка параболы через y [пик-1], y [пик], y [пик + 1]; затем используя точку, в которой эта парабола максимальна, как истинное положение пика.

Что касается обнаружения пика

Куча техник, которые помогают:

  • Как предположил Хильмар, свертывание сигнала осуществляется окном Гаусса или Ханна, ширина которого примерно равна половине минимального интервала, который вы хотите видеть между обнаруженными пиками. Поскольку временная точность важна для вашего приложения, убедитесь, что вы учитываете задержку, вызванную фильтрацией!
  • Вычтите в свой сигнал медианную фильтрованную версию себя (с довольно большим окном наблюдения); и разделите результат на отфильтрованную по стандартному отклонению версию самого себя. Это избавляет от тенденций и позволяет выражать пороговые значения в единицах стандартных отклонений.
  • Для пикового выбора я формулирую это, используя фильтр "top-hat". Определите фильтрованную версию вашего сигнала как верхнюю: yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n] + W]); и используйте в качестве пиков точки, где y [n] == yt [n] и y [n]> порог.

Все это может быть очень эффективно реализовано в Matlab с помощью нескольких проходов nlfilter.

pichenettes
источник
Комбинация апсэмплинга и параболической интерполяции может работать лучше, чем любая из них в отдельности.
hotpaw2
3

Попробуйте детектор пиков с потерями:

y[n] = max(abs(x[n]),a*y[n-1]);

где «а» - это число меньше 1, которое определяет скорость затухания детектора. Он определяет, насколько близкими могут быть соседние пики, не переходя в единый. Затем выполните определение порога.

Hilmar
источник
В вашем уравнении есть как ax [n], так и y [n]. Это правильно или это просто у [п]?
Энди
x [n] - это вход, y [n] - это выход. Плохой ответ в целом, есть опечатка (исправлена ​​сейчас), и я неправильно понял вопрос. Извинения
Хильмар