Mam czujnik, który raportuje swoje odczyty ze znacznikiem czasu i wartością. Jednak nie generuje odczytów ze stałą szybkością.
Trudno mi poradzić sobie z danymi o zmiennej stopie procentowej. Większość filtrów oczekuje stałej częstotliwości próbkowania. Rysowanie wykresów jest również łatwiejsze przy stałej częstotliwości próbkowania.
Czy istnieje algorytm do ponownego próbkowania ze zmienną częstotliwością próbkowania na stałą częstotliwość próbkowania?
resampling
FigBug
źródło
źródło
Odpowiedzi:
Najprostszym podejściem jest wykonanie interpolacji spline, jak sugeruje Jim Clay (liniowy lub inny). Jeśli jednak masz luksus przetwarzania wsadowego, a zwłaszcza jeśli masz zbyt określony zestaw niejednorodnych próbek, istnieje niezwykle elegancki algorytm „idealnej rekonstrukcji”. Z powodów numerycznych może nie być praktyczne we wszystkich przypadkach, ale przynajmniej warto wiedzieć o tym koncepcyjnie. Najpierw przeczytałem o tym w tym artykule .
Sztuką jest rozważenie zestawu niejednorodnych próbek jako już zrekonstruowanych z jednorodnych próbek poprzez interpolację sinc . Zgodnie z notacją w artykule:
Zauważ, że zapewnia to zestaw równań liniowych, po jednym dla każdej niejednorodnej próbki , gdzie nieznane są próbki o równych odstępach , tak:y ( k T )y(t) y(kT)
W powyższym równaniu jest liczbą nieznanych jednorodnych próbek, jest odwrotnością częstości jednolitych próbek, a jest liczbą niejednolitych próbek (która może być większa niż ). Obliczając najmniejszych kwadratów rozwiązania tego systemu, jednorodne próbki mogą być odtworzone. Technicznie konieczne jest tylko próbek niejednorodnych, ale w zależności od tego, jak „rozproszone” są w czasie, macierz interpolacji może być strasznie źle uwarunkowana . W takim przypadku zwykle pomaga użycie większej liczby niejednolitych próbek.T m n nn T m n n
Jako zabawkowy przykład, oto porównanie (przy użyciu numpy ) między powyższą metodą a interpolacją splajnu sześciennego na lekko zniekształconej siatce:
(Kod do odtworzenia powyższej fabuły znajduje się na końcu tej odpowiedzi)
Biorąc to wszystko pod uwagę, w przypadku wysokiej jakości, solidnych metod, rozpoczęcie od czegoś w jednym z następujących dokumentów prawdopodobnie byłoby bardziej odpowiednie:
-
źródło
Brzmi to jak problem z asynchroniczną konwersją częstotliwości próbkowania. Aby przekonwertować jedną częstotliwość próbkowania na drugą, możemy obliczyć ciągłą reprezentację czasową sygnału, wykonując interpolację sinc, a następnie ponownie próbkować z naszą nową częstotliwością próbkowania. To, co robisz, nie różni się zbytnio. Musisz ponownie próbkować sygnał, aby mieć ustalone czasy próbkowania.
Sygnał ciągłego czasu można obliczyć przez zwoje każdej próbki funkcją sinc. Ponieważ funkcja sinc trwa w nieskończoność, używamy czegoś bardziej praktycznego, jak cynk okienny o praktycznej skończonej długości. Problem polega na tym, że ponieważ próbki poruszają się w czasie, może być konieczne użycie cynku z innym przesunięciem fazowym dla każdej próbki podczas ponownego próbkowania.
Ciągły sygnał czasu z próbkowanego sygnału:
gdzie to czas próby. W twoim przypadku twój czas próbkowania nie jest jednak ustalony. Myślę więc, że musisz zastąpić go czasem próby w tej próbce.Ts
Z tego można ponownie próbkować sygnał:
gdzie jest pożądanym czasem próbkowania.Tns
Zestawiając to w całość otrzymujesz:
Ponieważ nie jest to przyczynowe ani podatne na działanie, funkcję sinc można zastąpić funkcją skończonego wsparcia i odpowiednio dostosować granice sumowania.
Niech jądro (t) będzie oknem okienkowym lub inną podobną funkcją o długości 2k, a następnie:
Mam nadzieję, że to pomaga ... ale po drodze mogłem popełnić błąd i może to być trochę intensywne z matematyki. Aby uzyskać więcej informacji, zaleciłbym zbadanie konwersji częstotliwości próbkowania. Być może ktoś tutaj mógłby udzielić lepszego wyjaśnienia lub rozwiązania.
źródło
Myślę, że odpowiedź Jacoba jest bardzo wykonalna.
Prostszą metodą, która prawdopodobnie nie jest tak dobra pod względem wprowadzania zniekształceń, jest interpolacja wielomianowa. Użyłbym interpolacji liniowej (łatwej, niezbyt dobrej pod względem wydajności sygnału) lub splajnu sześciennego (wciąż niezbyt twardego, lepszej wydajności sygnału), aby wytwarzać próbki w dowolnym momencie z dowolnych próbek czasu.
źródło
(Miesiąc później) istnieją dwie główne opcje dla dowolnej metody interpolacji:Nnear
1) liczba punktów danych najbliższych brakującego punktu do użycia, 2 4 6 ... 2) klasa funkcji bazowych do użycia: liniowa, wielomianowa, sinus-cosinus (Fouriera), kawałek sześcienny (splajn B lub splajn interpolujący), sinc-like ... (Wybór 0 dotyczy tego, czy użyć metody i kodu innej osoby, czy też zrób to sam.)
Dopasowanie linii prostej do punktów jest łatwe: 2 punkty [-1, ], [1, ]: oszacowanie punkty ze średnią : średnia ogólna : patrz np. Przepisy numeryczne str. 781: dopasuj linię i oszacuj . Można dopasować kwadratykę, sześcienne, sinus-cosinus ... w ten sam sposób.Nnear
y−1 y1
[ x i , y i ] x i = 0y0∼(y−1+y1)/2
[xi,yi] xi=0 y0∼ yi
[xi,yi]
y 0 ∼ aa+bx y0∼a
y i [ x i , y i ]
Rozumiem, że macie jednolicie rozmieszczone dane z kilkoma brakującymi punktami, prawda?2πft f
Jak dobrze interpolacja liniowa działa w tym przypadku?
Cóż, spróbujmy cos z = 0,25: 1 0 -1 0 1 0 -1 0 ... 2 sąsiadów dowolnego punktu średnio do 0, strasznie. 4 sąsiadów: średnia z [1 0 (brak -1) 0 1] = 1/2, strasznie. (Wypróbuj filtr 4-sąsiedni [-1 3 3 -1] / 4.)f
Interpolacja liniowa z 4, 6 lub 8 sąsiadami może działać wystarczająco dobrze dla twoich danych.
Proponuję zacząć od metody, którą dokładnie rozumiesz, zanim zanurzysz się w splajny, podobne do cynku ... chociaż one też mogą być zabawne.
Inną, zupełnie inną metodą jest odwrotne ważenie odległości . Jest łatwy do wdrożenia (patrz: idw-interpolation-with-python na SO), działa w 2d 3d i nowszych , ale jest trudny do analizy teoretycznej.
(Oczywiście, NO metoda pojedynczy interpolacja może ewentualnie dopasować zillions kombinacji
[sygnału, hałas błędu metryki, funkcja TEST], które występują w rzeczywistości.
Są to kolejne sposoby na świecie, z większą ilością pokręteł, niż funkcji testowych.
Niemniej galerię metod i funkcji testowych może się przydać).
źródło
Jeśli pracujesz z matlabem, możesz to zrobić, pracując z timeseries.
źródło
Zanim zaczniesz jakieś egzotyczne przetwarzanie, możesz wypróbować coś tak prostego (pseudo kod - bez interpolacji, ale można to dodać)
źródło
Odpowiedź IMHO Datageist jest poprawna, odpowiedź Jacoba nie jest. Łatwym sposobem na sprawdzenie tego jest to, że sugerowany algorytm bazy danych gwarantuje interpolację oryginalnych próbek (przy założeniu nieskończonej precyzji liczbowej), podczas gdy odpowiedź Jacoba nie.
źródło