Sunday 15 October 2017

Moving Average Filter Code In C


Czy jest możliwe do wdrożenia średniej ruchomej w C bez potrzeby okna próbek. Znalazłem, że mogę zoptymalizować nieco, wybierając rozmiar okna, który jest siłą dwóch, aby umożliwić przesunięcie bitów zamiast dzieląc, ale nie potrzebujesz buforu byłoby miło Czy jest jakiś sposób na wyrażenie nowego wyniku średniej ruchomej tylko w wyniku starego wyniku i nowej próbki. Zdefiniuj przykład średniej ruchomej, w oknie z 4 próbkami, które mają zostać dodane nowe próbki eA średnia ruchoma może być realizowana rekurencyjnie, ale dokładne obliczanie średniej ruchomej należy pamiętać o najstarszej próbce wejściowej w sumie tj. a w swoim przykładzie Dla długości N średniej ruchomej obliczysz. gdzie yn jest sygnałem wyjściowym i xn to sygnał wejściowy Eq 1 może być zapisany rekurencyjnie. Dlatego zawsze musisz zapamiętać próbkę xnN w celu obliczenia 2. Jak wskazał Conrad Turner, można zamiast tego użyć nieskończenie długiego okna wykładniczego, co pozwala obliczyć wyjście tylko z przeszłości put i current input. but nie jest to standardowa nieważona średnia ruchoma, ale średnia geometryczna ważona średnią ruchoma, gdzie próbki w przeszłości uzyskują mniejszą wagę, ale przynajmniej teoretycznie nigdy nie zapomnisz o gramaturze mniejszej i mniejszej próbki daleko w przeszłości. I zaimplementowane średniej ruchomej bez pojedynczej pamięci pozycji dla programu śledzenia GPS I napisał. Zacznij od 1 próbki i podziel się przez 1, aby uzyskać aktualne avg. I następnie dodać anothe próbki i podziel się przez 2 do bieżącej średniej. To trwa, aż dojdę do średniej. Każdego czasu później dodam nową próbkę, przeciętnie i usuń tą średnią z sumy. Nie jestem matematykiem, ale to wydawało się dobrym sposobem na że to zwróci żołądek prawdziwego faceta matematyki, ale okazuje się, że jest jednym z dozwolonych sposobów na to i działa dobrze Pamiętaj tylko, że im większa długość tym wolniej jest to, co chcesz podążać To nie ma znaczenia czas, ale po śledzeniu satelitów, jeśli jesteś wolny, szlak może być daleko od aktualnej pozycji i będzie wyglądał źle Możesz mieć przerwę między siadami a końcowymi kropkami Wybrałem długość 15 aktualizowanych 6 razy na minutę do uzyskać odpowiednią wygładzanie i nie za daleko od rzeczywistej pozycji sutowej z wygładzonym szlakiem dots. doc 16 listopada 16 w 23 03.initialize całkowity 0, licznik 0 za każdym razem widać nową wartość. Ten jeden scanf wejściowy, jeden dodać całkowity newValue, jedna liczba przyrostów, jedna dzielna średnia liczba. Jest to średnia ruchoma na wszystkich wejściach. Aby obliczyć średnią z ostatnich ostatnich 4 wejść, wymagałoby 4 zmiennych wejściowych, być może kopiowanie każdego wejścia do starszych zmiennych wejściowych, a następnie obliczenie nowego ruchu średnia jako suma 4 zmiennych wejściowych, podzielona przez 4 przesunięcie w prawo2 byłaby dobra, gdyby wszystkie wejścia były pozytywne, aby obliczyć średnie obliczenia. przy odpowiedzi 3 lutego 15 w 4 06.To faktycznie obliczy całkowitą średnią, a nie średnią ruchoma liczyć się s większy wpływ każdej nowej próbki wejściowej staje się znikoma mała Hilmar 03 lutego 15 w 13 53. Twoja odpowiedź.2017 Stack Exchange, Inc. I wiedzieć, że to jest osiągalne z pobudzenia jak per. But naprawdę chciałbym uniknąć używania boost mam googled i nie znaleziono żadnych odpowiednich lub czytelnych przykładów. Chcę śledzić ruchomą średnią ciągłego strumienia strumienia liczb zmiennoprzecinkowych przy użyciu najnowszych 1000 liczb jako próbki danych. Jest to najprostszy sposób to osiągnąć. I eksperymentował z użyciem okrągłej tablicy, wykładniczej średniej ruchomej i bardziej prostej średniej ruchomej i stwierdził, że wyniki okrągłej tablicy odpowiadały moim potrzebom najlepiej. pozostała 12 czerwca 12 na 4 38. Jeśli Twoje potrzeby są proste, możesz po prostu spróbować użyć wykładnicza średnia ruchoma. Wystarczy, że zmienisz akumulator, a Twój kod wygląda na każdą próbkę, kod aktualizuje akumulator o nową wartość. Wybierasz stałą wartość alfa, która wynosi od 0 do 1, i oblicz ją. Wystarczy, że potrzebujesz znaleźć wartość a lpha, gdzie działanie danej próbki trwa tylko około 1000 próbek. Hmm, nie jestem pewien, czy jest to dla ciebie odpowiednie, teraz, gdy już to postawiłem tutaj Problem polega na tym, że 1000 to dość długie okno dla wykładniczej średniej ruchomej Nie wiem, czy istnieje alfa, który rozprzestrzeniałby średnią w ciągu ostatnich 1000 numerów, bez underflow w obliczeń zmiennoprzecinkowych Ale jeśli chcesz mniejsze średnie, jak 30 numerów lub tak, jest to bardzo łatwy i szybki sposób na it. answered Jun 12 12 at 4 44. 1 na swoim punkcie Wykładnicza średnia ruchoma może pozwolić na zmienną alfa Więc pozwala to na obliczanie średnich baz czasowych np. bajtów na sekundę Jeśli czas od ostatniej aktualizacji akumulatora jest większy niż 1 sekundę, możesz pozwolić alpha być 1 0 W przeciwnym razie możesz pozwolić, aby usługa alfa była usecami od ostatniej aktualizacji 1000000 jxh 12 czerwca 12 w 6 21. Zazwyczaj chcę śledzić średnią ruchową ciągłego strumienia strumienia liczb zmiennoprzecinkowych używając ostatnie 1000 numerów jako próbki danych. Nie e poniższe aktualizacje zmieniają się w miarę zastępowania elementów, unikając kosztownych przejazdów ON w celu obliczenia sumy potrzebnej na średnią - na żądanie. Całkowita wartość różni się parametrem od T do wsparcia np. długotrwałą długością przy łącznej długości 1000 d , int dla char s lub double do total float s. To jest nieco wadliwe w tym numsamples mogłyby przejść przeszłości INTMAX - jeśli dbać można użyć unsigned long long lub użyć dodatkowych danych bool danych do rejestrowania, gdy kontener jest najpierw wypełniany, podczas gdy cykliczne numsamples wokół tablicy najlepiej zamieniono na coś nieszkodliwego jak pos. answered Jun 12 12 at 5 19.one zakłada, że ​​próbka pustego operatora T jest faktycznie pustym operatorem T próbka oPless 8 czerwca 14 w 11 52. oPless ahhh dobrze spotted w rzeczywistości miałem na to być nieważne operatora T próbki, ale oczywiście można użyć dowolnej notacji, którą lubisz Naprawę, dzięki Tony D Jun 8 14 w 14 27. Jak inni wspomnieli, należy rozważyć IIR nieskończony filtr odpowiedzi impulsowej, a nie FIR skończony i Filtr odpowiedzi mpulse używasz teraz Jest więcej, ale na pierwszy rzut oka filtry FIR są implementowane jako wyraźne splity i filtry IIR z równaniami. 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ń mają one lepszą charakterystykę niż używany przez filtr pola Większość zastosowań filtra pola, który napotkam, jest wynikiem, że ktoś nie zwraca uwagi na klasę przetwarzania sygnału cyfrowego, a nie w wyniku konieczności ich szczególnych cech Jeśli chcesz po prostu osłabić wysokie częstotliwości, które wiesz, że hałas, jeden biegun filtr dolnoprzepustowy jest lepszy Najlepszym sposobem na wdrożenie cyfrowo w mikrokontrolerze jest zwykle. FILT - FILT FF NEW - FILT. FILT jest kawałkiem trwalego stanu Jest to jedyna trwała zmienna, którą musisz zmierzyć ten filtr NEW to nowa wartość, którą filtr jest aktualizowany za pomocą tej iteracji 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 nie zmienia się Dla FF 1, to naprawdę nie ma filtra w ogóle, ponieważ wyjście tylko po wejściu Przydatne wartości znajdują się między: W małych systemach wybierasz FF na 1 2 N, dzięki czemu 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 zatem prawidłowe przesunięcie 4 bity W przeciwnym razie ten filtr potrzebuje tylko jednego odejmowania, a jeden dodano, chociaż liczby zwykle muszą być szersze niż wartość wejściowa większa od dokładności numerycznej w oddzielnej sekcji poniżej. Na zazwyczaj odczyty AD są znacznie szybsze niż są potrzebne i stosuje się dwa te filtry kaskadowe Jest to cyfrowy odpowiednik dwóch filtrów RC w szeregu i tłumi o oktawę o 12 dB powyżej częstotliwości rolloff Jednak w przypadku odczytów AD zazwyczaj bardziej trafia to, aby patrzeć na filtr w dziedzinie czasu przez consid Odpowiadając na krok odpowiedzi To informuje o tym, jak szybko twój system będzie widzieć zmianę, gdy rzeczy, które mierzysz, zmieniają się. Aby ułatwić projektowanie tych filtrów, co oznacza jedynie pobranie FF i ustalenie, ile z nich kaskada, używam mojego programu FILTBITS Podajesz liczba 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 mojego skryptu opakowania PLOTFILT To działa FILTBITS, które tworzy plik CSV, a następnie plotuje plik CSV Na przykład , oto wynik PLOTFILT 4 4. Dwa parametry PLOTFILT oznaczają, że będą dwa filtry kaskadowe typu opisanego powyżej. Wartości 4 wskazują liczbę bitów przesunięcia, aby zrealizować mnożenie przez FF. Dwa wartości FF są więc 1 16. W tym przypadku czerwony ślad to odpowiedź na jednostkę kroku i jest najważniejszą rzeczą, na przykład na przykład informuje Cię, że jeśli dane wejściowe ulegną zmianie natychmiast, wyjście połączonego filtra ustala się na 90 nowych wartość w 60 iteracji Jeśli zależy Ci na około 95 czasu rozliczania, musisz poczekać około 73 iteracji, a dla 50 czasu rozstrzygania tylko 26 iteracji. Zielone ślady wskazują na wyjście z pojedynczego spike'a o pełnej amplitudzie. To daje pewien pomysł na losowe tłumienie hałasu Wygląda na to, że żadna pojedyncza próbka nie spowoduje więcej niż 2 5 zmian na wyjściu. Błękitny ślad ma dać subiektywne poczucie tego, co ten filtr działa z białym szumem To nie jest rygorystyczny test, ponieważ nie ma gwarancji, co dokładnie zawartość była liczb losowych wybranych jako białe szumy wejściowe dla tego uruchomienia PLOTFILT To tylko dać poczucie, jak bardzo będzie zgnieciony i jak gładkie jest. PLOTFILT, może FILTBITS i wiele innych przydatnych stuff, zwłaszcza dla rozwoju oprogramowania PIC jest dostępny w oprogramowaniu PIC Development Tools na stronie Moje pobieranie oprogramowania. Dodano o dokładności liczbowej. Zobaczyłem w komentarzach, a teraz nową odpowiedź, która jest zainteresowana dyskutowaniem o t liczba 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 W małych systemach, FF jest zwykle wybierany jako 1 2 N, dzięki czemu mnożenie jest faktycznie realizowane przez prawą zmianę z N bits. FILT jest więc 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, to musisz 4 bity frakcji poniżej 10-bitowych liczb całkowitych Odczyty AD Jedna większość procesorów, które wykonujesz 16-bitowe operacje całkowite z powodu 10-bitowych odczytów AD W tym przypadku można nadal wykonywać dokładnie takie same 16-bitowe operacje całkowite, ale zaczynaj od AD odczyty lewe przesunięte o 4 bity Procesor nie wie o różnicy i nie potrzebuje Do wykonywania matematyki na całych 16-bitowych liczb całkowitych działa, czy uważasz, że są 12 4 punktami stałymi lub prawdziwymi 16-bitowymi liczbami całkowitymi 16 0 stały punkt. W ogóle, musisz dodać N bity każdego bieguna filtra, jeśli chcesz nie chcę dodać hałasu z powodu liczbowej reprezentacji W powyższym przykładzie drugi filtr dwóch musiałby mieć 10 4 4 18 bitów, aby nie zgubić informacji W praktyce na 8-bitowej maszynie oznacza to, że używasz 24 bitowych wartości Technicznie tylko drugi biegun dwóch potrzebowałoby szerszej wartości, ale dla prostoty oprogramowania ja zwykle używam tej samej reprezentacji, a tym samym tego samego kodu, dla wszystkich biegunów filtra. Zawsze piszę podprogram lub makro, aby wykonać jeden biegun filtra, a następnie zastosuj ją do każdego bieguna Niezależnie od tego, czy podprogram lub makro zależy od tego, czy cykle czy pamięć programu są ważniejsze w danym projekcie Tak czy inaczej używam pewnego stanu, aby przejść NOWOŚĆ do makra podprocedury, który aktualizuje plik FILT, ale ładuje to do ten sam stan zarysowania NOWY był w To ułatwia stosowanie wielu biegunów, ponieważ zaktualizowany FILT jednego bieguna jest NOWY z następnej. Jeśli podprogram jest użyteczny, to pożytecznie wskaż wskaźnik na FILT, aktualizacja tuż po FILT po wyjściu W ten sposób podprogram automatycznie uruchamia kolejne filtry w pamięci, jeśli jest wywoływany wielokrotnie Z makrem nie potrzebujesz wskaźnika, ponieważ prześlesz adres, aby działał na każdym iteracji. Przykłady kodu. Jest to przykład makro, jak opisano powyżej dla PIC 18. A oto podobny makro dla PIC 24 lub dsPIC 30 lub 33. Te przykłady są implementowane jako makra za pomocą mojego prekursora assemblera PIC, który jest bardziej zdolny niż jeden z wbudowanych procesorów, w obiektach makro. 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ęci dla jego pierścienia bufor 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 przyjmujesz różnice w danym okresie czasu, a kluczowym urządzeniem oszczędzającym pamięć jest to, że poprzez downsampling, 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 zmianami i maską - i. Postscript Zgadzam się z Olinem, że należy zawsze 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 najstarszą 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 - a ty możesz t zarządzać bocznymi płatami Może być warto wrzucić parę liczb całkowitych, aby uczynić to symetrycznym, dostrojonym FIRem, 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ędnie. 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 innych przypadkach serii, na przykład 7,9, 7, 9, 9 średnio na 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.

No comments:

Post a Comment