Znajdowanie lokalnych pików pomiędzy próbkami

10

Mam dyskretnych próbek sygnału sejsmicznego : ny[n]wprowadź opis zdjęcia tutaj

Chcę znaleźć lokalne maksima w sygnale.

Naiwnym testem, jeśli jest maksimum, byłoby: y[n]

y[n]:mzaxjamza gdyby y[n]>y[n-1] i y[n]>y[n+1]

Jednak maksima są prawdopodobnie umieszczone między próbkami, np. Może istnieć maksimum przy .ja=4.25

Aby znaleźć maksima pomiędzy próbkami, uważam, że muszę interpolować .y[n]

  • Jak znaleźć maksima za pomocą interpolacji?
  • Jakiej interpolacji należy użyć?

Jak widać, mój sygnał nie jest bardzo głośny, jednak dobrze byłoby, gdyby metoda wykonała również trochę filtrowania, aby maksima przekroczyły próg i miały określoną szerokość (bez szczytów).

Moim największym problemem jest jednak znalezienie pików między próbkami. Jakieś sugestie, jak to zrobić?

Z góry dziękuję za wszelkie odpowiedzi!

Andy
źródło
1
Może spójrz na pytanie 1 i pytanie 2 .
Geerten
Kilka metod widma częstotliwości: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolit
Ten drugi nie ma odpowiedzi @Geerten ;-)
Ivo Flipse
1
Oh..haha, dobra uwaga. Cóż, wrócę do tego pytania dotyczącego tego pytania;)
Geerten

Odpowiedzi:

7

Uzyskiwanie rozdzielczości podpróbki

Bardzo tanim (pod względem wielkości kodu) rozwiązaniem jest po prostu zwiększenie sygnału. W Matlab można to zrobić za pomocą interp(y ,ratio). Nieco bardziej skomplikowane rozwiązanie polega na naiwnym wykrywaniu pików; i dla każdego piku, dopasowując parabolę przez y [szczyt - 1], y [szczyt], y [szczyt + 1]; następnie używając punktu, w którym ta parabola jest maksymalna, jako prawdziwa pozycja szczytowa.

Odnośnie detekcji pików

Kilka technik, które pomagają:

  • Jak sugeruje Hilmar, zwijanie sygnału przez okno Gaussa lub Hana, którego szerokość jest w przybliżeniu równa połowie minimalnego odstępu między wykrytymi pikami. Ponieważ dokładność czasowa wydaje się niezbędna dla twojej aplikacji, pamiętaj jednak, aby wziąć pod uwagę opóźnienie czasowe wprowadzone przez filtrowanie!
  • Odejmij od swojego sygnału medianową wersję samego siebie (z dość dużym oknem obserwacji); i podziel wynik przez jego wersję filtrowaną z odchyleniem standardowym. Pozbywa się to trendów i pozwala wyrażać progi w jednostkach odchyleń standardowych.
  • Aby wybrać szczyt, formułuję to za pomocą filtra „top-hat”. Zdefiniuj odfiltrowaną wersję swojego sygnału jako yt [n] = max (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); i użyj jako pików punktów, w których y [n] == yt [n] iy [n]> próg.

Wszystko to można bardzo skutecznie zaimplementować w Matlabie za pomocą kilku przejść nlfilter.

fenenety
źródło
Połączenie upsamplingu i interpolacji parabolicznej może działać lepiej niż jedno z nich.
hotpaw2
3

Wypróbuj detektor strat szczytowych:

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

gdzie „a” jest liczbą mniejszą niż 1, która kontroluje szybkość rozpadu detektora. Określa, jak blisko sąsiadujące szczyty mogą znajdować się bez wtapiania się w jeden. Następnie wykonaj wykrywanie progu.

Hilmar
źródło
W swoim równaniu masz zarówno ax [n], jak i y [n]. Czy to prawda, czy powinno być tylko y [n]?
Andy
x [n] jest wejściem, y [n] jest wyjściem. Zła odpowiedź w ogóle, jest literówka (teraz naprawiona) i źle zrozumiałem pytanie. Przepraszam
Hilmar