Mam dyskretnych próbek sygnału sejsmicznego :
Chcę znaleźć lokalne maksima w sygnale.
Naiwnym testem, jeśli jest maksimum, byłoby:
Jednak maksima są prawdopodobnie umieszczone między próbkami, np. Może istnieć maksimum przy .
Aby znaleźć maksima pomiędzy próbkami, uważam, że muszę interpolować .
- 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!
Odpowiedzi:
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ą:
Wszystko to można bardzo skutecznie zaimplementować w Matlabie za pomocą kilku przejść nlfilter.
źródło
Wypróbuj detektor strat szczytowych:
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.
źródło