Знаходження локальних піків між зразками


10

Я маю n дискретні зразки сейсмічного сигналу y[n]: введіть тут опис зображення

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

Наївний тест на те, якщо y[n] максимум буде:

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

Однак максимуми, ймовірно, розташовані між зразками, наприклад, максимум може бути на i=4.25.

Щоб знайти максимуми між зразками, я вважаю, що мені потрібно інтерполювати y[n].

  • Як знайти максимуми за допомогою інтерполяції?
  • Яку форму інтерполяції я повинен використовувати?

Як ви бачите, мій сигнал не дуже галасливий, проте було б добре, якби метод також зробив трохи фільтрації, щоб максимуми перевищували поріг і мали певну ширину (без шипів).

Моя найбільша проблема, однак, полягає лише в тому, щоб знайти піки між зразками. Будь-які пропозиції щодо гарного способу це зробити?

Заздалегідь дякую за будь-які відповіді!


1
Можливо, подивіться на питання 1 і 2 .
Geerten

Існує кілька методів для частотних спектрів: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
ендоліти

На цей другий немає відповіді @Geerten ;-)
Іво Фліпс

1
Ох, га, добре. Ну я посилаюсь на це питання з цього питання;)
Geerten

Відповіді:


7

Отримання роздільної здатності субпроби

Дуже дешеве (з точки зору розміру коду) рішення - просто збільшити вибірку свого сигналу. У матлабі це можна зробити interp(y ,ratio). Трохи складніше рішення полягає в наївному виявленні піків; і для кожного піку підходить парабола через y [пік - 1], y [пік], y [пік + 1]; то використовуючи точку, в якій ця парабола є максимальною як справжнє положення піку.

Щодо пікового виявлення

Купа методів, які допомагають:

  • Як запропонував Гільмар, перетворюючи сигнал на вікно Гаусса чи Ганна, ширина якого приблизно дорівнює половині мінімального інтервалу, який ви хочете бачити між виявленими вершинами. Оскільки часова точність здається важливою для вашої програми, переконайтеся, що ви враховуєте часову затримку, введену фільтруванням!
  • Відніміть до вашого сигналу серединну відфільтровану версію себе (з досить великим вікном спостереження); і ділимо результат на відфільтровану версію за стандартним відхиленням. Це позбавляється від тенденцій і дозволяє виразити пороги в одиницях стандартних відхилень.
  • Для вибору піку я формулюю це за допомогою фільтра "верхній капелюх". Визначте відфільтровану верхню шапку версії вашого сигналу як 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.


Поєднання прискореної вибірки та параболічної інтерполяції може працювати краще, ніж будь-який поодинці.
hotpaw2

3

Спробуйте детектор пікових втрат:

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

де "a" - це число менше 1, яке контролює швидкість розпадання детектора. Він визначає, наскільки близькими можуть бути сусідні вершини, не згладжуючись в єдину. Потім зробіть виявлення порогу.


У вашому рівнянні є осі [n] та y [n]. Це правильно чи має бути просто у [n]?
Енді

x [n] - вхід, y [n] - вихід. Погана відповідь загалом, є помилка друку (виправлено зараз), і я неправильно зрозумів питання. Вибачення
Гільмар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.