У меня есть дискретных выборок сейсмического сигнала : у [ н ]
Я хочу найти локальные максимумы в сигнале.
Наивный тест для если максимум будет: y [ n ] : m a x i m a, если y [ n ] > y [ n - 1 ] и y [ n ] > y [ n + 1 ]
Однако максимумы, вероятно, расположены между выборками, например, максимум может быть при .
Чтобы найти максимумы между выборками, я считаю, что мне нужно интерполировать .
- Как найти максимумы с помощью интерполяции?
- Какую форму интерполяции я должен использовать?
Как вы можете видеть, мой сигнал не очень шумный, но было бы хорошо, если бы метод также немного фильтровал, чтобы максимумы превышали порог и имели определенную ширину (без пиков).
Однако моя самая большая проблема - просто найти пики между образцами. Какие-нибудь предложения для хорошего способа сделать это?
Заранее спасибо за любые ответы!
Ответы:
Получение разрешения сэмпла
Очень дешевое (с точки зрения размера кода) решение - просто повысить частоту вашего сигнала. В Matlab это можно сделать с помощью
interp(y ,ratio)
. Несколько более сложное решение состоит в наивном обнаружении пиков; и для каждого пика - подгонка параболы через y [пик-1], y [пик], y [пик + 1]; затем используя точку, в которой эта парабола максимальна, как истинное положение пика.Что касается обнаружения пика
Куча техник, которые помогают:
Все это может быть очень эффективно реализовано в Matlab с помощью нескольких проходов nlfilter.
источник
Попробуйте детектор пиков с потерями:
где «а» - это число меньше 1, которое определяет скорость затухания детектора. Он определяет, насколько близкими могут быть соседние пики, не переходя в единый. Затем выполните определение порога.
источник