Wednesday 27 December 2017

Przenoszenie filtrowanie średnia implementacja


Średnia ruchoma jako filtr Średnia ruchoma jest często używana do wygładzania danych w obecności szumu. Prosta średnia ruchoma nie zawsze jest rozpoznawana jako filtr odpowiedzi na skończoną odpowiedź impulsową (FIR), podczas gdy w rzeczywistości jest to jeden z najczęstszych filtrów w przetwarzaniu sygnału. Traktowanie go jako filtra pozwala na porównanie go z np. Filtrami okienkowymi (patrz artykuły na temat filtrów dolnoprzepustowych, górnoprzepustowych i pasmowych oraz filtrów z odrzucaniem pasmowym na przykład). Główną różnicą w porównaniu z tymi filtrami jest to, że średnia ruchoma jest odpowiednia dla sygnałów, dla których użyteczne informacje są zawarte w dziedzinie czasu. w tym dobrym przykładem są pomiary wygładzania poprzez uśrednianie. Z drugiej strony filtry Window-sinc są silnymi wykonawcami w dziedzinie częstotliwości. z wyrównaniem w przetwarzaniu audio jako typowym przykładem. Istnieje bardziej szczegółowe porównanie obu typów filtrów w dziedzinie Time Domain vs. Performance Domain of Filters w zakresie częstotliwości. Jeśli masz dane, dla których zarówno czas, jak i dziedzina częstotliwości są ważne, możesz chcieć rzucić okiem na wariacje na temat średniej ruchomej. który przedstawia kilka ważonych wersji średniej ruchomej, które są w tym lepsze. Ruchoma średnia długość (N) może być zdefiniowana jako zapisana tak, jak zwykle jest realizowana, z bieżącą próbką wyjściową jako średnia z poprzednich próbek (N). Średnia ruchoma, widziana jako filtr, wykonuje splot sekwencji wejściowej (xn) z prostokątnym impulsem długości (N) i wysokości (1N) (aby utworzyć obszar impulsu, a tym samym wzmocnienie filtra , jeden). W praktyce najlepiej jest przyjmować (N) nieparzyste. Chociaż średnią ruchomą można również obliczyć przy użyciu parzystej liczby próbek, użycie wartości nieparzystej dla (N) ma tę zaletę, że opóźnienie filtra będzie liczbą całkowitą próbek, ponieważ opóźnienie filtra z (N) próbki to dokładnie ((N-1) 2). Średnia ruchoma może być następnie wyrównana dokładnie z oryginalnymi danymi, przesuwając ją o liczbę całkowitą próbek. Domena czasu Ponieważ średnia ruchoma jest splotem z prostokątnym impulsem, jego charakterystyka częstotliwościowa jest funkcją sinc. To sprawia, że ​​jest to coś w rodzaju podwójnego filtra okienkowego, ponieważ jest to splot z impulsem sinc, który powoduje prostokątną odpowiedź częstotliwościową. Jest to ta odpowiedź częstotliwościowa, która sprawia, że ​​średnia ruchoma jest słabym wykonawcą w dziedzinie częstotliwości. Jednak działa bardzo dobrze w dziedzinie czasu. Dlatego idealnie nadaje się do wygładzania danych w celu usuwania szumów, zachowując jednocześnie szybką reakcję skokową (rysunek 1). Dla typowego białego szumu białkowego o dodatnim (AWGN), który jest często przyjmowany, próbki uśredniające (N) mają wpływ na zwiększenie współczynnika SNR o współczynnik (sqrt N). Ponieważ hałas dla poszczególnych próbek jest nieskorelowany, nie ma powodu, aby traktować każdą próbkę w inny sposób. W związku z tym średnia ruchoma, która nadaje każdej próbce taką samą wagę, pozbywa się maksymalnej wartości szumu dla danej ostrości kroku. Wdrożenie Ponieważ jest filtrem FIR, średnią ruchomą można wdrożyć za pomocą splotu. Będzie wtedy miał taką samą wydajność (lub jej brak), jak każdy inny filtr FIR. Jednak może być również realizowany rekursywnie, w bardzo wydajny sposób. Wynika to bezpośrednio z definicji, że formuła ta jest wynikiem wyrażeń dla (yn) i (yn1), tzn. Gdy zauważymy, że zmiana między (yn1) i (yn) jest taka, że ​​dodatkowy termin (xn1N) pojawia się na koniec, podczas gdy termin (xn-N1N) jest usuwany od początku. W zastosowaniach praktycznych często można pominąć podział przez (N) dla każdego okresu, kompensując wynikowy zysk (N) w innym miejscu. Ta rekurencyjna implementacja będzie znacznie szybsza niż splot. Każda nowa wartość (y) może zostać obliczona przy użyciu tylko dwóch dodatków zamiast (N) dodatków, które byłyby niezbędne do prostego wdrożenia definicji. Jedną rzeczą, na którą należy zwrócić uwagę przy rekursywnej implementacji, jest to, że błędy zaokrąglania będą się kumulować. To może, ale nie musi, być problemem dla twojej aplikacji, ale oznacza również, że ta rekursywna implementacja będzie działać lepiej z implementacją liczb całkowitych niż z liczbami zmiennoprzecinkowymi. Jest to dość niezwykłe, ponieważ implementacja zmiennoprzecinkowa jest zwykle prostsza. Wniosek musi być taki, że nigdy nie należy lekceważyć użyteczności prostego filtra średniej ruchomej w zastosowaniach przetwarzania sygnałów. Narzędzie do projektowania filtrów Ten artykuł jest uzupełniony o narzędzie do projektowania filtrów. Eksperymentuj z różnymi wartościami dla (N) i wizualizuj uzyskane filtry. Wypróbuj terazZasadniczo mam tablicę wartości takich jak ta: powyższa tablica jest uproszczona, zbieram 1 wartość na milisekundę w moim prawdziwym kodzie i muszę przetworzyć wyjście na algorytmie, który napisałem, aby znaleźć najbliższy szczyt przed punktem w czasie . Moja logika kończy się niepowodzeniem, ponieważ w moim przykładzie powyżej 0.36 jest prawdziwym szczytem, ​​ale mój algorytm będzie wyglądał wstecz i zobaczy ostatnią liczbę 0.25 jako szczyt, ponieważ przed nią jest spadek do 0.24. Celem jest przyjęcie tych wartości i zastosowanie do nich algorytmu, który wygładzi je nieco, tak żebym miał więcej wartości liniowych. (tj: Id jak moje wyniki być kręty, nie jaggedy) Powiedziano mi, aby zastosować wykładniczy filtr średniej ruchomej do moich wartości. Jak mogę to zrobić? Bardzo trudno jest mi czytać równania matematyczne, z kodem radzę sobie znacznie lepiej. Jak przetwarzać wartości w mojej tablicy, stosując wykładnicze obliczenia średniej ruchomej, aby je wyrównać zapytano 8 lutego 12 o 20:27 Obliczanie wykładniczej średniej kroczącej. musisz zachować pewien stan i potrzebujesz parametru strojenia. To wymaga małej klasy (zakładając, że korzystasz z Java 5 lub nowszej wersji): Utwórz instancję z żądanym parametrem zaniku (możesz ustawić strojenie od 0 do 1), a następnie użyj funkcji average () do filtrowania. Czytając stronę o nawrocie matematycznym, wszystko, co naprawdę trzeba wiedzieć, kiedy zamienia się ją w kod, jest takie, że matematycy lubią pisać indeksy w tablicach i sekwencjach z indeksami dolnymi. (Są też inne zapisy, które nie pomagają.) Jednak EMA jest dość prosta, ponieważ wystarczy zapamiętać jedną starą wartość, nie wymagającą skomplikowanych tablic stanów. odpowiedział 08 lutego 12 o 20:42 TKKocheran: Dość dużo. Czy to nie jest miłe, gdy rzeczy mogą być proste (jeśli zaczynasz z nową sekwencją, zdobądź nową średnią). Zauważ, że kilka pierwszych haseł w uśrednionej sekwencji będzie przeskakiwało trochę ze względu na efekty graniczne, ale dostajesz te z innymi ruchomymi średnimi także. Jednak dobrą zaletą jest to, że można zawinąć logikę średniej ruchomej do uśredniającego i eksperymentować, nie zakłócając zbytnio reszty programu. ndash Donal Fellows 09 lutego 12 o 0:06 Mam trudności ze zrozumieniem twoich pytań, ale i tak postaram się odpowiedzieć. 1) Jeśli twój algorytm znalazł 0.25 zamiast 0.36, to jest źle. Jest źle, ponieważ zakłada monotoniczny wzrost lub spadek (który zawsze rośnie lub zawsze spada). O ile nie wytypujesz WSZYSTKICH twoich danych, twoje punkty danych --- podczas ich prezentacji --- są nieliniowe. Jeśli naprawdę chcesz znaleźć maksymalną wartość pomiędzy dwoma punktami w czasie, podziel tablicę od tmin do tmax i znajdź maksimum tego podbarwa. 2) Teraz pojęcie średnich kroczących jest bardzo proste: wyobraź sobie, że mam następującą listę: 1.4, 1.5, 1.4, 1.5, 1.5. Mogę go wygładzić, biorąc średnią z dwóch liczb: 1.45, 1.45, 1.45, 1.5. Zauważ, że pierwsza liczba to średnia z 1,5 i 1,4 (druga i pierwsza liczba), druga (nowa lista) to średnia z 1,4 i 1,5 (trzecia i druga stara lista), a trzecia (nowa lista) to średnio 1,5 i 1,4 (czwarty i trzeci) i tak dalej. Mogłem zrobić okres trzy lub cztery, lub n. Zwróć uwagę, że dane są znacznie płynniejsze. Dobrym sposobem, aby zobaczyć średnie ruchome w pracy, jest przejście do Google Finance, wybór akcji (wypróbuj Tesla Motors pretty volatile (TSLA)) i kliknij technicznych na dole wykresu. Wybierz średnią ruchomą z danym okresem i wykładniczą średnią kroczącą, aby porównać różnice. Wykładnicza średnia krocząca jest tylko kolejnym rozwinięciem tego, ale waży starsze dane mniej niż nowe dane, jest to sposób na odchylenie wygładzania w kierunku tyłu. Proszę przeczytać wpis w Wikipedii. Jest to raczej komentarz niż odpowiedź, ale małe pole komentarza było niewielkie. Powodzenia. Jeśli masz problemy z matematyką, możesz użyć prostej średniej ruchomej zamiast wykładniczej. Wynik wyjściowy będzie więc ostatnim x terminami podzielonymi przez x. Nieprawdziwy kod pseudokodowy: pamiętaj, że będziesz musiał obsługiwać początkowe i końcowe części danych, ponieważ wyraźnie nie możesz uśrednić ostatnich 5 warunków, gdy jesteś na drugim punkcie danych. Ponadto istnieją skuteczniejsze sposoby obliczania tej średniej ruchomej (suma suma - najstarsze najnowsze), ale ma to na celu uzyskanie koncepcji na temat tego, co się dzieje. odpowiedział 08 lutego 12 o 20: 41 Wiem, że jest to osiągalne z doładowania na: Ale naprawdę chciałbym uniknąć stosowania boost. Mam google i nie znalazłem żadnych odpowiednich lub czytelnych przykładów. Zasadniczo chcę śledzić średnią ruchomą bieżącego strumienia strumienia liczb zmiennoprzecinkowych z wykorzystaniem najnowszych 1000 liczb jako próbki danych. Jaki jest najłatwiejszy sposób, aby to osiągnąć? Eksperymentowałem z użyciem okrągłej tablicy, wykładniczej średniej kroczącej i prostszej średniej ruchomej, i odkryłem, że wyniki z okrągłej macie najlepiej pasują do moich potrzeb. Zapytany 12 czerwca 12 o 4:38 Jeśli twoje potrzeby są proste, możesz po prostu spróbować użyć wykładniczej średniej kroczącej. Mówiąc prościej, tworzysz zmienną akumulatora, a ponieważ twój kod wygląda na każdą próbkę, kod aktualizuje akumulator o nową wartość. Wybierasz stałą alfa, która jest pomiędzy 0 a 1, i obliczasz to: Musisz tylko znaleźć wartość alfa, gdzie efekt danej próbki trwa tylko około 1000 próbek. Hmm, nie jestem właściwie pewien, czy ci to pasuje, teraz, kiedy go tu umieściłem. Problem polega na tym, że 1000 to dość długie okno dla wykładniczej średniej kroczącej Nie jestem pewien, czy istnieje alfa, które rozłożyłoby średnią z ostatnich 1000 liczb, bez dolnego limitu w obliczeniach zmiennoprzecinkowych. Ale jeśli chcesz mieć mniejszą średnią, na przykład około 30 numerów, jest to bardzo łatwy i szybki sposób na zrobienie tego. odpowiedź 12 czerwca 12 o 4:44 1 na twój post. Wykładnicza średnia ruchoma może pozwolić na zmienną alfa. Dzięki temu można go wykorzystać do obliczenia średniej podstawy czasu (na przykład bajtów na sekundę). Jeśli czas od ostatniej aktualizacji akumulatora jest dłuższy niż 1 sekunda, zezwalasz alfa na 1.0. W przeciwnym razie możesz pozwolić na alfa (usecs od ostatniej aktualizacji1000000). ndash jxh 12 czerwca 12 o 6:21 Zasadniczo chcę śledzić średnią ruchomą ciągłego strumienia strumienia liczb zmiennoprzecinkowych z wykorzystaniem najnowszych 1000 liczb jako próbki danych. Zauważ, że poniższe aktualizacje aktualizują sumę jako elementy dodane z powrotem, unikając kosztownego przejścia przez O (N) w celu obliczenia sumy - potrzebnej dla średniej - na żądanie. Total otrzymuje inny parametr od T do obsługi np. użycie długiej długości, gdy suma wynosi 1000 długich s, int dla char s lub double do total float s. Jest to trochę wadliwe, ponieważ liczba poprawek może przekroczyć INTMAX - jeśli chcesz, możesz użyć długiej długości bez znaku. lub użyj dodatkowego elementu danych typu bool, aby zarejestrować, kiedy pojemnik jest pierwszy wypełniony, podczas gdy liczba próbkowania w cyklu wokół tablicy (najlepiej wtedy przemianowana na coś nieszkodliwego jak pos). odpowiedź 12 czerwca 12 o 5:19 zakłada się, że quotvoid operator (T sample) quot jest w rzeczywistości quotvoid operatorltlt (T sample) quot. ndash oPless cze 8 14 o 11:52 o Bez ahhh. dobrze zauważył. faktycznie miałem na celu unieważnienie operatora () (próbka T), ale oczywiście można użyć dowolnej notacji, którą lubisz. Naprawię, dzięki. ndash Tony D cze 8 14 o 14:27

No comments:

Post a Comment