Ruch średnia pic


Jak wspomnieli inni, należy rozważyć filtr odpowiedzi impulsowych IIR, a nie filtru odpowiedzi impulsowej FIR, który teraz używasz. Jest więcej, ale na pierwszy rzut oka filtry FIR są implementowane jako wyraźne splify i filtry IIR z równań. szczególny filtr IIR Używam dużo w mikrokontrolerach jest jednym biegunowym filtrem dolnoprzepustowym Jest to cyfrowy odpowiednik prostego analogowego filtru RC Dla większości zastosowań będą miały lepsze właściwości niż filtr pola, którego używasz Większość zastosowań filtru pudełkowego że natknęłam się na to, że ktoś nie zwraca uwagi w klasie przetwarzania sygnału cyfrowego, a nie w wyniku potrzeby ich szczególnych cech Jeśli chcesz po prostu osłabić wysokie częstotliwości, które znasz są hałasem, jeden biegunowy filtr dolnoprzepustowy jest lepszy najlepszym sposobem na wdrożenie cyfrowo w mikrokontrolerze jest zwykle. FILT - FILT FF NEW - FILT. FILT jest kawałkiem wytrzymałego stanu Jest to jedyny trwały VA riable musisz obliczyć ten filtr NEW to nowa wartość, którą filtr jest aktualizowany z tą iteracją FF jest frakcją filtru, która dostosowuje ciężkość filtra Spójrz na ten algorytm i widzę, że dla FF 0 filtr jest nieskończenie ciężki, ponieważ wyjście nigdy się nie zmienia Dla FF 1, to naprawdę nie ma filtra w ogóle, ponieważ wyjście po prostu następuje na wejściu Wartości użyteczne są w między Na małe systemy wybierzesz FF, aby być 1 2 N, tak aby mnożenie przez FF może być dokonane jako przesunięcie w prawo przez N bitów Na przykład, FF może wynosić 1 16, a mnożenie przez FF, a więc przesunięcie w prawo o 4 bity W przeciwnym razie ten filtr potrzebuje tylko jednego odejmowania, a jeden dodano, chociaż liczby muszą zazwyczaj być szersze niż wartość wejściowa bardziej na precyzję liczbową w oddzielnej sekcji poniżej. Zwykle odczyty AD są znacznie szybsze niż są potrzebne i zastosować dwa z tych filtrów kaskadowych Jest to cyfrowy odpowiednik dwóch filtrów RC w szeregu, a tłumienie o 12 o oktawę powyżej górnej wartości częstotliwość Jednak dla odczytów AD zazwyczaj bardziej trafne jest przejrzenie filtru w domenie czasowej poprzez rozważenie odpowiedzi krokowej To informuje, jak szybko Twój system będzie widzieć zmianę, gdy coś mierzysz zmiany. Aby ułatwić projektowanie tych filtrów używam mojego programu FILTBITS Ty określasz liczbę bitów przesuwnych dla każdego FF w kaskadowych seriach filtrów i oblicza odpowiedź kroku i inne wartości W zasadzie zazwyczaj uruchamiam to za pośrednictwem mój skrypt powlekania PLOTFILT Działa to FILTBITS, które tworzy plik CSV, a następnie rzutuje na plik CSV Na przykład tutaj jest wynikiem PLOTFILT 4 4.Te dwa parametry PLOTFILT oznaczają, że będą dwa filtry kaskadowe typu opisanego powyżej Wartości z 4 wskazują liczbę bitów przesunięcia, aby zrealizować mnożenie przez FF W tym przypadku dwa wartości FF to 1 16. Czerwony ślad to odpowiedź na jednostkę kroku i jest najważniejszą sprawą na przykład Na przykład te te lls, że jeśli dane wejściowe zmieniają się natychmiast, wyjście połączonego filtra osiądzie do 90 nowej wartości w 60 iteracjach Jeśli potrzebujesz około 95 czasu rozstrzygania, musisz poczekać około 73 iteracji, a dla 50 czasu rozstrzygania tylko 26 iteracji . Zielony ślad wskazuje na wyjście z jednego spike'a o pełnej amplitudzie To daje pewien pomysł na przypadkowe tłumienie szumu Wygląda na to, że żadna pojedyncza próbka nie spowoduje więcej niż 2 5 zmian na wyjściu. Laser niebieski ma dać subiektywne poczucie tego, co ten filtr działa z białym szumem Nie jest to rygorystyczny test, ponieważ nie ma gwarancji, jaka była zawartość losowych liczb pobranych jako białe szumy dla tego uruchomienia PLOTFILT To tylko daje poczucie ile to zostanie zgniecione i jak gładkie jest. PLOTFILT, może FILTBITS i wiele innych użytecznych rzeczy, zwłaszcza w zakresie rozwoju oprogramowania PIC, jest dostępne w oprogramowaniu PIC Development Tools na stronie pobierania oprogramowania. Ad dedukowane numerycznie precyzja. Zobacz z komentarzy, a teraz nowa odpowiedź, że istnieje zainteresowanie dyskutowaniem o liczbie bitów potrzebnych do wdrożenia tego filtra Zauważ, że pomnożenie przez FF spowoduje utworzenie nowych bitów FF New FF poniżej punktu binarnego Na małych systemach , FF jest zwykle wybierany jako 1 2 N, tak że to pomnożenie jest rzeczywiście realizowane przez prawo przesunięcia N bitów. FILT jest zatem zazwyczaj liczbą całkowitą stałej Uwaga, że ​​nie zmienia to żadnej matematyki z punktu widzenia procesora Na przykład jeśli filtrujesz 10-bitowe odczyty AD i N 4 FF 1 16, potrzebujesz 4 bitów ułamkowych poniżej 10-bitowych odczytów liczb całkowitych Jednym z najbardziej popularnych procesorów jest wykonywanie 16-bitowych operacji całkowitych z powodu 10-bitowych odczytów AD W takim przypadku można nadal wykonywać dokładnie takie same 16-bitowe operacje całkowite, ale zaczynaj od odczytów AD pozostawionych w lewo, przesuwanych o 4 bity Procesor nie wie różnic i nie potrzebuje wykonywania matematyki na całych 16-bitowych liczb całkowitych działa, czy uważaj je za 12 4 stały punkt lub prawdziwe 16-bitowe liczby całkowite 16 0 stały punkt. Ogólnie trzeba dodać N bity każdego bieguna filtra, jeśli nie chcemy dodać hałasu z powodu reprezentacji numerycznej W powyższym przykładzie drugi filtr dwóch miałby aby mieć 10 4 4 18 bitów nie stracić informacji W praktyce na 8-bitowej maszynie, która oznacza, że ​​używasz 24 bitowych wartości Technicznie tylko drugi biegun dwóch potrzebowałby szerszej wartości, ale dla uproszczenia oprogramowania zazwyczaj używam tej samej reprezentacji, a tym samym ten sam kod dla wszystkich biegunów filtra. Zawsze piszę podprogram lub makro, aby wykonać jedną operację na biegunie filtra, a następnie zastosować do każdego bieguna. Czy podprogram lub makro zależy od tego, czy cykle czy pamięć programu są ważniejsze w tym konkretny projekt Używam pewnego stanu, aby przejść NOWOŚĆ do makra podprocedury, który aktualizuje plik FILT, ale ładuje się do tego samego stanu scratch NEW był w To ułatwia stosowanie wielu biegunów, ponieważ aktualizacja FILT jednego bieguna jest NE W następnej strony Jeśli podprogram jest użyteczny, po drodze do punktu FILT, który zostanie zaktualizowany tuż po FILT po wyjściu W ten sposób podprogram automatycznie uruchamia kolejne filtry w pamięci, jeśli jest wywołany wiele razy Z makro nie potrzebujesz wskaźnika, ponieważ przechodzisz w adresie, aby działać na każdym iteracji. Przykłady kodu. Jest to przykład makra, jak opisano powyżej dla PIC 18. A oto jest podobne makro dla PIC 24 lub dsPIC 30 lub 33. Te przykłady są implementowane jako makra przy użyciu mojego preprocesora assemblera PIC, który jest bardziej zdolny niż jeden z wbudowanych obiektów makr. clabacchio Inną kwestią, o której powinienem wspomnieć jest wdrożenie oprogramowania układowego Możesz napisać pojedynczy biegun filtra po niskiej przepustowości, a następnie zastosować go wielokrotnie W rzeczywistości zwykle pisać taką podprogram, aby wziąć wskaźnik w pamięci do stanu filtra, a następnie go wyprzedzeniem wskaźnik, dzięki czemu łatwo można było z łatwością zadzwonić do wieloliniowych filtrów Olin Lathrop 20 kwietnia 12 w 15 03.1 bardzo dziękuję za odpowiedzi - wszystkie postanowiłem użyć tego filtru IIR, ale ten filtr nie jest używany jako Filtr standardowy LowPass, ponieważ muszę przeanalizować średnie wartości liczników i porównać je w celu wykrycia zmian w pewnym zakresie, ponieważ te wartości mają bardzo różne wymiary w zależności od sprzętu, który chciałem przeciętnie, aby móc reagować na te urządzenia konkretne zmiany automatycznie sensslen 21 maja 12 w 12 06.Jeśli można żyć z ograniczeniem mocy dwóch liczb pozycji do przeciętnej, tj. 2,4,8,16,32 itd., dzielenie można łatwo i skutecznie zrobić na niskiej wydajności mikro bez poświęconego podziału, ponieważ można to zrobić jako przesunięcie bitowe Każde prawo przesunięcia jest jedna moc dwóch eg. The OP myśli, że miał dwa problemy, dzieląc się PIC16 i pamięć na jego pierścień bufora Ta odpowiedź pokazuje, że dzielenie nie jest trudne Wprawdzie nie rozwiązuje problemu pamięci, ale system SE pozwala na częściowe odpowiedzi, a użytkownicy mogą wziąć coś z każdej odpowiedzi na siebie, a nawet edytować i połączyć inne odpowiedzi s Ponieważ niektóre inne odpowiedzi wymagają operacji dzielenia, są podobnie niekompletne, ponieważ nie pokazują, jak skutecznie osiągnąć to na PIC16 Martin 20 kwietnia 12 w 13 01.There jest odpowiedź na prawdziwy przeciętny filtr aka boxcar filtr z mniej wymagań pamięci, jeśli nie t mind downsampling To s nazywany kaskadowym integratorem-filtr grzebieniowy CIC Pomysł polega na tym, że masz integrator, który odbywa się w różnych okresach czasu, a kluczowym urządzeniem oszczędzającym pamięć jest to, że poprzez pobieranie próbek, nie musisz przechowywać wigilii wartość życiowa integratora Może być zaimplementowana za pomocą następującej pseudokodowej. Twoja efektywna średnia długość ruchu to decymacjaStandakturaFaktora, ale musisz zachowywać tylko stany miar Próbkowanie Oczywiście można uzyskać lepszą wydajność, jeśli twój stateize i decimationFactor są uprawnieniami 2, dzielenie i reszta operatorów są zastępowane przez przesunięcia i maski - i. Postscript Zgadzam się z Olinem, że zawsze należy rozważyć proste filtry IIR przed średnim ruchem filtra Jeśli nie potrzebujesz częstotliwości-nulls z filtrem bokserskim, 1-biegunowy lub 2-biegunowy filtr dolnoprzepustowy będzie prawdopodobnie działał prawidłowo. Z drugiej strony, jeśli filtruje się do celów decymacji przy wysokim współczynniku próbkowania i uśrednia go do wykorzystania w procesie o niskim współczynniku, to filtr CIC może być tylko tym, czego szukasz, zwłaszcza, jeśli można użyć streszczenia 1 i uniknąć ringbuffer łącznie z tylko jedną poprzednią wartością integratora. Istnieją pewne pogłębione analizy matematyki za pomocą pierwszego ord er IIR, który Olin Lathrop już opisał na temat wymiany stosu przetwarzania sygnałów cyfrowych zawiera wiele ładnych zdjęć Równanie dla tego filtru IIR. Ta możliwość może być zaimplementowana przy użyciu tylko liczb całkowitych i nie podział przy użyciu następującego kodu może potrzebować trochę debugowania, wpisywał z pamięci pamięć. Filtr ten przybliża średnią ruchową ostatnich próbek K, ustawiając wartość alfa na 1 K Zrób to w poprzednim kodzie, określając BITS na LOG2 K, tzn. dla K 16 zestaw BITS na 4, dla K 4 Ustaw BITS na 2, itd. I'll zweryfikować kod tutaj wymienione, jak tylko dostanę zmiany i edytować tę odpowiedź, jeśli potrzebne. jeszcze jedno-biegunowy filtr dolnoprzepustowy średniej ruchome, z Częstotliwość cutoff CutoffFrequency Bardzo prosty, bardzo szybki, działa świetnie i prawie nie ma nad głową pamięci. Upewnij się, że wszystkie zmienne mają zasięg poza funkcją filtru, z wyjątkiem przekazywanych w newInput. Note Jest to filtr pojedynczego etapu Wiele etapów może być połączonych kaskadowo w celu zwiększenia ostrość filtr Jeśli używasz więcej niż jednego etapu, będziesz musiał dostosować DecayFactor w odniesieniu do częstotliwości odcięcia, aby zrekompensować. I oczywiście wszystko czego potrzebujesz to te dwie linie umieszczone w dowolnym miejscu, nie potrzebują własnej funkcji Ten filtr ma czas ramp-up przed średnią ruchu oznacza wartość sygnału wejściowego Jeśli musisz pominąć ten czas rampy, możesz zainicjować MovingAverage tylko do pierwszej wartości newInput zamiast 0 i mam nadzieję, że pierwsza nowa wartość wejściowa nie jest większa. CutoffFrequency SampleRate ma zakres od 0 do 0 5 DecayFactor jest wartością między 0 a 1, zwykle blisko 1.Single-precyzyjne pływaki są wystarczająco dobre dla większości rzeczy, po prostu wolę podwójne Jeśli musisz trzymać się liczb całkowitych, możesz przelicz DecayFactor i Amplitude Factor na ułamkowe liczby całkowite, w których licznik jest zapisany jako liczba całkowita, a mianownik jest liczbą całkowitą 2, dzięki czemu można przesunąć bit w prawo jako mianownik, a nie dzieląc się podczas pętli filtru Dla na przykład, jeśli DecayFactor 0 99 i chcesz używać liczb całkowitych, możesz ustawić wartość DecayFactor 0 99 65536 64881 I wtedy, gdy mnożysz przez DecayFactor w pętli filtru, po prostu przesuń wynik 16. Aby uzyskać więcej informacji na ten temat, s online, rozdział 19 dotyczące filtrów rekurencyjnych. PS Za paradygmat Moving Average, inne podejście do ustawienia DecayFactor i AmplitudeFactor, które mogą być bardziej odpowiednie dla Twoich potrzeb, powiedzmy, że chcesz poprzednio, około 6 pozycji uśrednione tog eter, robi to dyskretnie, dodasz 6 pozycji i podzielisz przez 6, więc możesz ustawić AmplitudeFactor na 1 6 i DecayFactor na 1 0 - AmplitudeFactor. answered 14 maja 12 w wieku 22 55. Każdy inny skomentował dokładnie narzędzie IIR vs FIR, a na mocy dwóch dywizji Chciałbym dać pewne szczegóły implementacji Poniżej działa dobrze na małych mikrokontrolerów bez FPU Nie ma mnożenia, a jeśli zachowasz N moc dwóch, wszystkie podziały jest jednokierunkowe przesunięcie bitowe. Basic FIR ring buffer zachowuje bieżący bufor z ostatnich wartości N, a bieżący SUM wszystkich wartości w buforze Za każdym razem, kiedy pojawia się nowa próbka, odejmij najstarszą wartość w buforze z SUM , wymień ją na nową próbkę, dodaj nową próbkę do SUM i wyjście SUM N. Modified IIR buffer ring zachowuje bieżący SUM z ostatnich wartości N Przy każdej próbie pojawi się nowa próbka SUM - SUM N, dodaj nową próbki i dane wyjściowe SUM N. Odpowiedź 28 sierpnia 13 w 13 45.Jeśli dobrze panu czytam, opisujesz pierwszy porządek IIR filtruje wartość, którą odejmujesz isn t najstarsza wartość, która się wypada, ale zamiast tego średnia z poprzednich wartości Filtry First-Order IIR z pewnością mogą być użyteczne, ale nie wiem co masz na myśli, gdy sugerujesz, że wyjście jest taki sam dla wszystkich sygnałów okresowych Przy częstotliwości próbkowania 10 kHz, podawanie 100 Hz fali prostokątnej w 20-stopniowy filtr pola daje sygnał, który wzrasta równomiernie dla 20 próbek, siedzi wysoko dla 30, kropli jednorodnie dla 20 próbek i siedzi nisko dla 30-go superfekta z filtrem IIR z pierwszego rzędu 28 sierpnia 13 w temperaturze 15 31. będzie powodować falę gwałtownie wzrastającą i stopniowo wyrównywać się w pobliżu, ale nie na maksimum wejściowym, a następnie ostro zacznie opadać i stopniowo wyrównywać blisko, ale nie na wejściu minimum Bardzo różne zachowanie supercat Aug 28 13 w 15 32.Jednym problemem jest to, że prosta średnia ruchoma może być lub nie być użyteczna Z filtrem IIR można uzyskać ładny filtr z stosunkowo niewielką liczbą całkowitą FIR opisujesz może dać Ci tylko prostokąt w czasie - szczerze freq - i możesz t zarządzać bocznymi płatami Może być warto wrzucić parę liczb całkowitych, aby uczynić to symetrycznym, przystosowanym FIR, jeśli możesz oszczędzić zegary Scott Seidman 29 sierpnia 13 w 13 50. ScottSeidman No potrzeba mnożenia, jeśli jeden ma po prostu każdy etap FIR albo wyprowadza średnio wejście na ten etap i jego poprzednią zapisaną wartość, a następnie zapisuje dane wejściowe, jeśli ma zakres numeryczny, można użyć sumy zamiast średniej Czy to s lepiej niż filtr pola zależy od aplikacji odpowiedzi krokowej filtru pudełkowego z całkowitym opóźnieniem 1ms, na przykład będzie miał paskudny d2 dt skok gdy zmiana wejściowa, a znów 1ms później, ale będzie miał minimum możliwe d dt dla filtra z całkowitym opóźnieniem 1ms supercat 29 sierpnia w wieku 15 25. Jak mikeselectricstuff powiedział, jeśli naprawdę potrzebujesz zmniejszyć zapotrzebowanie na pamięć i nie pamiętasz odpowiedzi impulsowej jako wykładniczej zamiast prostokątnego impulsu, ja pójdzie na wykładniczy ruch Filtr gniewu Używam ich w znacznym stopniu Z tego typu filtrem, nie potrzebujesz żadnego buforu Nie musisz przechowywać N próbek z przeszłości Tylko jeden Tak, wymagania pamięci zostały obniżone przez czynnik N. Ponadto nie potrzebujesz żadnych podział na to Tylko multiplikacje Jeśli masz dostęp do arytmetyki zmiennoprzecinkowej, użyj multiplikacji zmiennoprzecinkowych Jeśli nie, wykonaj multiplikacje całkowite i przesunięcia w prawo Jednak jesteśmy w 2017 roku i polecam użycie kompilatorów i MCU, które pozwalają do pracy z numerami zmiennoprzecinkowymi. Poza tym, że pamięć jest wydajniejsza i szybsza, nie musisz aktualizować elementów w dowolnym okrągłym buforze, chciałbym powiedzieć, że jest to również naturalne, ponieważ wykładnicza odpowiedź impulsowa lepiej pasuje do charakteru zachowań, w większości przypadków. Pozdrowienie z 20 kwietnia 12 w 9 59. Jedna kwestia z filtrem IIR prawie dotkniętych przez olin i supercat, ale najwyraźniej zignorowane przez innych jest to, że zaokrąglanie wprowadza pewne nieprawidłowości i potencjalnie stronniczość truncation przy założeniu, że N i sa moc dwóch i tylko używana jest arytmetyka całkowita, prawo przesunięcia systematycznie eliminuje LSB nowej próbki Oznacza to, że jak długo seria mogłaby być, średnia nigdy ich nie uwzględnia. Na przykład załóżmy, że powoli zmniejszając serie 8,8,8 8,7,7,7 7,6,6, a zakładając, że średnia jest rzeczywiście 8 na początku Pięść 7 próbki przyniesie średnio 7, niezależnie od siły filtra Tylko dla jednej próbki Same historia dla 6, itd. Teraz myśl o tym, że odwrotnie serie idzie w górę Średnia pozostanie na 7 na zawsze, dopóki próbka nie jest wystarczająco duża, aby to zmienić. Oczywiście, możesz skorygować za stronniczość, dodając 1 2 N 2, ale że tak naprawdę rozwiązać precyzyjny problem, w tym przypadku malejące serie pozostaną na zawsze na 8, aż próbka wynosi 8-1 2 N 2 Na przykład dla N 4 każda próba powyżej zera będzie utrzymywać średnią niezmienioną. Uważam, że rozwiązanie dla co mogłoby oznaczać posiadanie akumulatora utraconych LSB Ale nie zrobiłem tego na tyle, by mieć gotowy kod, i nie jestem pewien, czy nie zaszkodziłoby to mocy IIR w niektórych innych przypadkach serii, na przykład 7,9,7,9 średnio do 8 wtedy. Olin, twoja dwustopniowa kaskada również potrzebuje wyjaśnienia Czy chodzi o trzymanie dwóch średnich wartości w wyniku pierwszego podania do drugiego w każdej iteracji Co to jest zaletą tego. Wszystki Proste średnie ruchy Średnie średnie ruchome średnie Jesteś zachęcamy do rozwiązania tego zadania zgodnie z opisem zadania, używając dowolnego języka, który można znać przy użyciu prostej średniej ruchomej serii liczb. Stworzyć instancję klasy stanu, która zajmuje okres i zwraca procedurę, która przyjmuje liczbę jako argument i zwraca prosta średnia ruchoma jej argumentów. Prosta średnia ruchoma to metoda obliczania średniej strumienia liczb przez uśrednianie tylko ostatnich liczb P ze strumienia, gdzie P znany jest jako okres. Może być zaimplementowany przez wywołanie inicjująca procedura z P jako jej argumentem, IP, która powinna następnie zwracać procedurę, która po wywołaniu z poszczególnymi, kolejnymi członami strumienia liczb, oblicza średnią do, ostatniego P o f, pozwala na wywołanie tego SMA. Znaczenie słowa w opisie zadań odnosi się do potrzeby, aby SMA zapamiętała pewne informacje między połączeniami do niego. Okres, P. Złożony pojemnik co najmniej ostatnich numerów P każdego z jego indywidualnych calls. Stateful oznacza również, że kolejne wywołania I, initializer, powinny zwracać oddzielne procedury, które nie współużytkują zapisanego stanu, dzięki czemu mogą być użyte na dwóch niezależnych strumieniach danych. ciągła kolejka w celu zachowania ostatnich wartości p Każda funkcja zwracana z init-moving-average ma swój stan w atomie posiadającym wartość kolejki. Implementacja ta używa okrągłej listy do przechowywania liczb w oknie na początku każdego wskaźnika iteracji do komórki listy, która przechowuje wartość tylko wychodząc z okna i być zastąpiona wartością just added. Korzystanie z zamknięcia edit. Currently to sma może być nogc, ponieważ przydziela on zamknięcie na stercie Niektóre analizy ucieczki sis może usunąć alokację stosu. Użyj edycji Struct. Ta wersja unika się przydziału sterty zamknięcia, przechowującego dane w ramce stosu głównej funkcji. Te same dane wyjściowe. Aby uniknąć zbliżania się liczby zmiennoprzecinków do zestrzelenia i wzrostu, kod mógłby wykonaj sumę okresową na całej tablicy kolejek okrągłych. Ta implementacja generuje dwa współdzielące obiekty funkcji. Jest idiomatyczne w E, aby oddzielić dane wejściowe od danych wyjściowych odczytywanych z zapisu, a nie łącząc je w jeden obiekt. Struktura jest taka sama jak implementacja standardu Odchylenie E. Program eliksiru poniżej generuje funkcję anonimową z osadzonym okresem p, która jest używana jako okres prostej średniej ruchomej Funkcja uruchomienia odczytuje dane liczbowe i przekazuje ją do nowo utworzonej funkcji anonimowej, a następnie sprawdza rezultat STDOUT. Wyjście jest pokazane poniżej, ze średnią, a następnie zgrupowane wejście, tworząc podstawę każdej średniej ruchomej. Erlang ma zamknięcia, ale niezmienna varia bles Rozwiązaniem jest wtedy użycie procesów i prosta wiadomość przekazywająca języki API. Matrix, które mają procedury obliczania śladów szybkich dla danej sekwencji elementów. Jest mniej efektywne w pętli, jak w następujących poleceniach. który jest dodawany na końcu listy L1 L1 można znaleźć, naciskając 2ND 1, a średnio można znaleźć na liście OPS. Press ON, aby zakończyć program. Funkcja zwracająca listę zawierającą uśrednione dane dostarczonego argumentu. Program zwracająca prostą wartość na każdej liście invocation. list to uśredniona wartość p to okres 5 zwraca uśrednioną listę. Przykład 2 Użycie programu movinav2 i, 5 - Inicjalizacja średniej ruchomej i zdefiniowanie okresu 5 movinav2 3, xx - nowe dane w wartości listy 3, a wynik zostanie zapisany na zmiennej x, a następnie wyświetli się movinav2 4, xx - nowa wartość danych 4, a nowy wynik zostanie zapisany na zmiennej x i wyświetlony 4 3 2. Opis funkcji movinavg zmienna r - jest r esult uśredniona lista, która zostanie zwrócona zmienna i - jest zmienną indeksową i wskazuje na koniec podkontury listę będącą uśrednioną zmienną z - zmienną pomocniczą. Funkcja wykorzystuje zmienną i do określenia wartości listy będą brane pod uwagę w następnych średnich obliczeniach W każdej iteracji zmienna i wskazuje na ostatnią wartość na liście, która będzie stosowana w średnim obliczeniu Więc musimy tylko ustalić, która będzie pierwszą wartością na liście Zwykle mamy aby rozważyć elementy p, więc pierwszy element będzie indeksowany przez ip 1 Jednakże w pierwszych iteracjach, że obliczanie będzie zazwyczaj ujemne, więc poniższe równanie unika ujemnych indeksów max ip 1,1 lub, układając równanie, max ip , 0 1 Ale liczba elementów na pierwszych iteracjach będzie mniejsza, prawidłowa wartość będzie indeksem końcowym - zacznij indeks 1 lub, układając równanie, i - max ip, 0 1 1, a następnie, i-max ip , 0 Zmienna z zachowuje wspólną wartość max ip, 0 s o beginindex będzie z 1, a numberofelements będzie z iz. mid list, z 1, iz zwróci listę wartości, która będzie sumą uśrednioną sumuje je suma rri będzie je przeciętnie i zapisać wynik w odpowiednim miejscu w wynik list. fp1 tworzy częściową aplikację, która w tym przypadku określa parametry drugiego i trzeciego. Może się zdarzyć, jeśli zastosujesz wagę, która jest odwrotnie proporcjonalna do rozmiaru okna. public class AverageCounter int RunningAvg int RunningCount Zastępuje listę okólników int WindowSize. public AverageCounter int windowSize WindowSize windowSize. public unieważnij AddValue float NewValue zwiększa rozmiar okna, ponieważ więcej próbek jest rejestrowanych, jeśli RunningCount WindowSize RunningCount. rekurencyjna średnica ruchoma średnia n W - 1 W avg n-1 1 przykład W, gdzie W to rozmiar okna RunningAvg RunningCount - 1 RunningCount RunningAvg 1 RunningCount NewValue. public float Average return RunningAvg .-- zmodyfikowano w 13 53 Friday 9th November, 2007.pwasser 8-sty-08 16 25. Ta formuła działa poprawnie w celu oszacowania średniej ruchomej, o ile zachowane są pewne ograniczenia. Wylicza ona przybliżoną średnią ruchową, a nie rzeczywistą średnią ruchomej, opierając się na ważnym założeniu, że wartości próbki są normalnie rozprowadzany na średniej. Wskazałam to na wcześniejszym post. toadth 9-paź-11 15 46. Dobrze, że byłem głupi nie to4 lata i mogłem mieć lepszą sugestię Zamiast używać okólnikowej listy, użyj listę powiązaną i ręczne utrzymanie maksymalnego rozmiaru listy W ten sposób można zachować całkowitą sumę agregatów - dodając listę linków do agregatu, przycinając węzeł, odejmij tę wartość z agregatu Dla średniego licznika z 5 węzłów, być może okazało się, że nie zauważysz ap ale w wielu przypadkach z tysiącami węzłów ma znaczenie.1 W metodzie AddValue dodaj nowy węzeł listy linków i dodaj do AVERAGE 2 Po dodaniu sprawdź rozmiar 3 Jeśli próg wielkości Oblicza od średniej, a następnie wycinanie węzła. Aby uzyskać jeszcze większą wydajność, zamiast korzystać z listy połączonej, można zaimplementować własną listę kolumn w oparciu o tablicę wartości - odejmując od AVERAGE po zastąpieniu wartości tablicy. Marc Clifton 10-paź-11 1 37,4 lata na i ja mogłaby mieć lepszą sugestię. Indeed, że byłoby lepiej. Nie jestem pewien prawidłowego rozwiązania chociaż od podsumowania średniej z każdej próbki wprowadziłby sprawiedliwe kwotę zaokrąglania error. Hmm Zastanawiam się, czy oddzielenie części ułamkowej z cała część pomogłaby podzielić całą część każdej liczby przez licznik Trzymaj trzy bieżące sumy 1 Średnia całych części, 2 Pozostała część każdego działu, i 3 Ułamkowa część każdej liczby. Każdy raz cała część numer jest podzielony, cały wynik części jest dodawany do średniej sumy bieżącej, a pozostała część jest dodawana do pozostałej sumy bieżącej Gdy reszta bieżąca suma uzyskuje wartość większą lub równą liczbie, dzielona jest przez liczbę z wynikami części całego dodaje się do sumy bieżącej sumy, a pozostałą część dodaje się do pozostałej sumy bieżącej. W każdym obliczeniu część ułamkową jest dodawana do sumy ułamkowej. Gdy uśrednianie kończy się, pozostała suma bieżąca dzieli się na liczbę i wynik jest dodawana do średniej sumy bieżącej jako liczby zmiennoprzecinkowej Na przykład. Jest to, co zrobić z ułamkową sumą bieżącą Niebezpieczeństwo przepełnienia jest znacznie mniej prawdopodobne w tym miejscu, choć nadal możliwe, więc jedną ze sposobów jej obsługi byłoby podzielenie ułamkowego działania suma przez liczbę na końcu i dodać ją do naszego result. An alternatywnych byłoby sprawdzić ułamkową sumę bieżącej w każdym obliczeniu, aby zobaczyć, czy jest większa lub równa liczyć Kiedy to się dzieje, po prostu zrobić to samo t hing, że robimy z pozostałej sumy.

Comments

Popular Posts