Skip to main content

Przenoszący średni filtr mikrokontroler


Jednym z głównych zastosowań tablicy Arduino jest odczytywanie i rejestrowanie danych z czujników. Na przykład monitoruje ciśnienie co drugi dzień. Ponieważ wysokie częstotliwości próbkowania często generują skoki na wykresach, chcemy również mieć średnią z pomiarów. Ponieważ pomiary nie są statyczne w czasie, często potrzebujemy bieżącej średniej. Jest to średnia z pewnego okresu i bardzo cenna przy analizie trendów. Najprostszą formę średniej bieżącej można wykonać za pomocą kodu, który opiera się na poprzedniej średniej: Jeśli nie chcemy używać matematyki zmiennoprzecinkowej - ponieważ zajmuje to pamięć i zmniejsza prędkość - można zrobić to samo całkowicie w domenie całkowitej. Podział o 256 w przykładowym kodzie to przesunięcie w prawo 8, które jest szybsze niż np. Dzielenie przez np. 100. Odnosi się to do każdej potęgi 2 jako dzielnika i trzeba się tylko zatroszczyć, aby suma wag równała się sile 2. I oczywiście należy uważać, aby nie było pośredniego przelewu (rozważ użycie niepodpisanego długiego) Jeśli potrzebujesz dokładniejsza średnia podczas biegu, w sumie z ostatnich 10 pomiarów, potrzebujesz tablicy (lub listy połączonej), aby je zatrzymać. Ta tablica działa jak bufor cykliczny i przy każdym nowym pomiarze usuwany jest najstarszy. Bieżąca średnia jest obliczana jako suma wszystkich elementów podzielona przez liczbę elementów w tablicy. Kod średniej bieżącej będzie mniej więcej taki: Wadą tego kodu jest to, że tablica do przechowywania wszystkich wartości może stać się dość duża. Jeśli masz jeden pomiar na sekundę i chcesz średniej bieżącej na minutę potrzebujesz tablicy 60, średnia na godzinę będzie wymagać tablicy 3600. Nie można tego zrobić na Arduino, ponieważ ma tylko 2K pamięci RAM. Jednak budując dwustopniową średnią można do niej dość dobrze podejść (zrzeczenie się: nie dla wszystkich pomiarów). W kodzie pseudo: Ponieważ nowa wewnętrzna macierz statyczna jest potrzebna dla każdej funkcji runningAverage, to krzyczy być zaimplementowaną jako klasa. Biblioteka RunningAverage Biblioteka runningAverage tworzy klasę powyższej funkcji, dzięki czemu może być wielokrotnie używana w szkicu. Oddziela funkcje add () i avg (), aby były nieco bardziej elastyczne, np. można wiele razy wywołać średnią bez dodawania czegoś. Zwróć uwagę, że każda instancja klasy dodaje swoją własną tablicę do przechowywania pomiarów, co zwiększa zużycie pamięci. Interfejs klasy jest tak mały, jak to tylko możliwe. Uwaga: w wersji 0.2 nazwy metod są bardziej opisowe. Mały szkic pokazuje, jak można go użyć. Generator losowy służy do naśladowania czujnika. W setup () myRA jest wyczyszczona, dzięki czemu możemy rozpocząć dodawanie nowych danych. W pętli () najpierw generowana jest liczba losowa i konwertowana na zmienną, która zostanie dodana do myRA. Następnie runningAverage zostanie wydrukowany na porcie szeregowym. Można również wyświetlić go na ekranie LCD lub wysłać przez sieć Ethernet itp. Po dodaniu 300 elementów, myRA zostaje wyczyszczone, aby rozpocząć od nowa. Aby korzystać z biblioteki, utwórz folder w SKETCHBOOKPATHlibrach o nazwie RunningAverage i umieść tam. h i. cpp. Opcjonalnie utwórz podkatalog przykładów, aby umieścić przykładową aplikację. 2017-01-30: wersja początkowa 2017-02-28: naprawiono brakujący destruktor w pliku. h 2017-02-28: usunięto domyślny konstruktor 2017--. trimValue () Yuval Naveh dodał trimValue (znalezione w Internecie) 2017-11-21: refaktoryzacja 2017-12-30: dodano fillValue () refaktoryzacja do opublikowania 2017-07-03: dodany kod ochrony pamięci - jeśli wewnętrzna tablica nie może być przydzielona rozmiar staje się 0. To jest rozwiązanie problemu opisanego tutaj - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Testuj obszernie. Klasa szablonu RunningAverage. h RunningAverage. cppAs inni wspomnieli, że powinieneś rozważyć filtr IIR (nieskończona odpowiedź impulsowa) zamiast filtru FIR (skończona odpowiedź impulsowa), którego używasz teraz. Jest w tym coś więcej, ale na pierwszy rzut oka filtry FIR są implementowane w postaci jawnych zwojów i filtrów IIR z równaniami. Szczególny filtr IIR, którego używam w mikrokontrolerach, to jednobiegunowy filtr dolnoprzepustowy. Jest to cyfrowy odpowiednik prostego filtra analogowego R-C. W przypadku większości aplikacji będą one miały lepsze właściwości niż filtr skrzynkowy, którego używasz. Większość zastosowań filtra skrzynkowego, z jakim się zetknąłem, jest rezultatem tego, że ktoś nie zwraca uwagi w klasie przetwarzania sygnałów cyfrowych, a nie w wyniku potrzeby posiadania ich szczególnych cech. Jeśli chcesz tylko tłumić wysokie częstotliwości, o których wiesz, że są szumami, filtr jednoprzybiegowy dolnoprzepustowy jest lepszy. Najlepszym sposobem na implementację jednego cyfrowego w mikrokontrolerze jest zwykle: FILT lt-- FILT FF (NEW - FILT) FILT jest fragmentem trwałego stanu. Jest to jedyna trwała zmienna, którą musisz obliczyć. NOWOŚĆ jest nową wartością, którą filtr jest aktualizowany w tej iteracji. FF jest frakcją filtracyjną. który dostosowuje ciężkość filtra. Przyjrzyj się temu algorytmowi i zobacz, że dla FF 0 filtr jest nieskończenie ciężki, ponieważ jego wynik nigdy się nie zmienia. Dla FF 1, to naprawdę nie ma żadnego filtra, ponieważ wyjście jest zgodne z danymi wejściowymi. Przydatne wartości są pomiędzy. W małych systemach wybieramy FF na 12 N, aby pomnożenie przez FF można było wykonać jako przesunięcie w prawo o N bitów. Na przykład, FF może wynosić 116, a pomnożyć przez FF, zatem przesunięcie w prawo o 4 bity. W przeciwnym razie filtr ten wymaga tylko jednego odjęcia i jednego dodania, chociaż liczby zwykle muszą być szersze niż wartość wejściowa (więcej na temat dokładności liczbowej w osobnej sekcji poniżej). Zwykle odczyty AD są znacznie szybsze niż są potrzebne i stosuje się dwa z tych filtrów kaskadowo. Jest to cyfrowy odpowiednik dwóch filtrów R-C w serii i tłumi o 12 dBoctave powyżej częstotliwości wycofania. Jednak w przypadku odczytów AD jego zwykle bardziej istotne jest spojrzenie na filtr w dziedzinie czasu, biorąc pod uwagę jego skokową odpowiedź. Dzięki temu dowiesz się, jak szybko system zauważy zmianę, gdy zmienią się rzeczy, które mierzysz. Aby ułatwić projektowanie tych filtrów (co oznacza tylko wybieranie FF i decydowanie o tym, ile z nich ma być kaskadowane), używam mojego programu FILTBITS. Użytkownik określa liczbę bitów zmiany dla każdego FF w kaskadowej serii filtrów i oblicza odpowiedź skokową i inne wartości. Właściwie to zwykle uruchamiam to za pomocą mojego skryptu opakowania PLOTFILT. To uruchamia FILTBITS, który tworzy plik CSV, a następnie kreśli plik CSV. Na przykład tutaj jest wynik PLOTFILT 4 4: Dwa parametry dla PLOTFILT oznaczają, że będą dwa kaskady kaskadowe typu opisanego powyżej. Wartości 4 wskazują liczbę bitów zmiany, aby zrealizować pomnożenie przez FF. Dwie wartości FF wynoszą w tym przypadku 116. Czerwony ślad jest odpowiedzią jednostkową i jest najważniejszą rzeczą, na którą należy patrzeć. Na przykład informuje to, że jeśli dane wejściowe ulegną natychmiastowej zmianie, wynik połączonego filtru zostanie ustawiony na 90 nowej wartości w 60 iteracjach. Jeśli zależy Ci na 95 czasu rozstrzygania, to musisz czekać około 73 iteracji, a dla 50 czasu rozstrzygania tylko 26 iteracji. Zielony ślad pokazuje wynik z pojedynczego pełnego impulsu amplitudy. To daje wyobrażenie o losowym tłumieniu hałasu. Wygląda na to, że żadna pojedyncza próbka nie spowoduje więcej niż 2,5 zmiany w danych wyjściowych. Niebieski ślad daje subiektywne odczucie tego, co ten filtr robi z białym szumem. Nie jest to rygorystyczny test, ponieważ nie ma gwarancji, jaka dokładnie była zawartość losowych liczb wybieranych jako białe szumy wejściowe dla tego przebiegu PLOTFILT. To tylko po to, aby dać ci wrażenie, jak bardzo będzie zgnieciony i jak gładki jest. PLOTFILT, może FILTBITS, i wiele innych użytecznych rzeczy, szczególnie dla oprogramowania układowego PIC, jest dostępne w oprogramowaniu PIC Development Tools na mojej stronie Software downloads. Dodane o precyzję liczbową widzę z komentarzy, a teraz nową odpowiedź, że istnieje zainteresowanie omawianiem liczby bitów potrzebnych do wdrożenia tego filtru. Zwróć uwagę, że pomnożenie przez FF spowoduje utworzenie nowych bitów Log 2 (FF) poniżej punktu binarnego. W przypadku małych systemów wartość FF jest zwykle wybierana na 12 N, aby to pomnożenie było realizowane przez prawą zmianę N bitów. FILT jest więc zwykle stałą liczbą całkowitą. Zauważ, że to nie zmienia żadnej z matematyki z punktu widzenia procesorów. Na przykład, jeśli filtrujesz 10-bitowe odczyty AD i N 4 (FF 116), potrzebujesz 4 bitów frakcji poniżej 10-bitowych odczytów liczb całkowitych AD. Jeden z najbardziej procesorów wykona 16 bitowych operacji na liczbach całkowitych ze względu na 10-bitowe odczyty AD. W tym przypadku nadal możesz wykonywać dokładnie takie same 16-bitowe liczby całkowite, ale zacznij od odczytów AD przesuniętych o 4 bity w lewo. Procesor nie zna różnicy i nie musi tego robić. Wykonanie matematyki na całych 16-bitowych liczbach całkowitych działa niezależnie od tego, czy uważasz je za stałe 12 punktów, czy 16-bitowe liczby całkowite (16 punktów stałych). Ogólnie rzecz biorąc, musisz dodać N bitów dla każdego słupka filtra, jeśli nie chcesz dodawać szumu z powodu reprezentacji numerycznej. W powyższym przykładzie drugi filtr dwóch musiałby mieć 1044 18 bitów, aby nie stracić informacji. W praktyce na maszynie 8-bitowej oznacza to, że użyjesz 24-bitowych wartości. Technicznie tylko drugi biegun dwóch potrzebowałby szerszej wartości, ale dla prostoty oprogramowania zazwyczaj używam tej samej reprezentacji, a tym samym tego samego kodu, dla wszystkich biegunów filtra. Zwykle piszę podprogram lub makro, aby wykonać jedną operację na biegunie filtra, a następnie zastosować to do każdego bieguna. Czy podprogram lub makro zależy od tego, czy cykle lub pamięć programu są ważniejsze w danym projekcie. Tak czy inaczej, używam stanu scratch, aby przekazać NEW do subroutinemacro, który aktualizuje FILT, ale również ładuje go do tego samego stanu scratch NEW. Dzięki temu można łatwo zastosować wiele biegunów, ponieważ zaktualizowany FILT jednego bieguna jest NOWY następnego. Kiedy podprogram jest użyteczny, aby wskazywać na wskaźnik, wskaż FILT na wejściu, który jest aktualizowany tuż po FILT w drodze. W ten sposób podprogram automatycznie działa na kolejnych filtrach w pamięci, jeśli jest wywoływany wiele razy. W makrze nie potrzebujesz wskaźnika, ponieważ przekazujesz adres, aby działał w każdej iteracji. Przykłady kodu Oto przykład makra, jak opisano powyżej dla PIC 18: A tutaj jest podobne makro dla PIC 24 lub dsPIC 30 lub 33: Oba te przykłady są implementowane jako makra przy użyciu mojego preprocesora asemblera PIC. który jest bardziej wydajny niż którykolwiek z wbudowanych obiektów makro. clabacchio: Kolejną kwestią, o której powinienem wspomnieć, jest implementacja oprogramowania układowego. Możesz napisać jednobiegunowy podprogram z dolnoprzepustowym filtrem jeden raz, a następnie zastosować go kilka razy. Właściwie to zazwyczaj piszę taki podprogram, aby wprowadzić wskaźnik w pamięci do stanu filtra, a następnie przesunąć wskaźnik tak, aby można go było łatwo wywoływać w celu zrealizowania filtrów wielobiegunowych. ndash Olin Lathrop kwi 20 12 o 15:03 1. bardzo dziękuję za twoje odpowiedzi - wszystkie z nich. Postanowiłem użyć tego filtra IIR, ale ten filtr nie jest używany jako standardowy filtr LowPass, ponieważ potrzebuję uśredniać wartości przeciwstawne i porównywać je w celu wykrycia zmian w pewnym zakresie. ponieważ wartości te mają bardzo różne wymiary w zależności od sprzętu, chciałem wziąć średnią, aby móc automatycznie reagować na te zmiany specyficzne dla sprzętu. ndash sensslen 21 maja 12 o 12:06 Jeśli możesz żyć z ograniczeniem mocy dwóch liczb przedmiotów do średniej (tj. 2,4,8,16,32 itd.), wtedy podział można łatwo i skutecznie wykonać na niska wydajność mikro bez wydzielonego podziału, ponieważ można to zrobić jako odrobinę przesunięcia. Każda zmiana prawa jest jedną mocą dwóch np.: OP uważał, że ma dwa problemy, dzieli się na PIC16 i pamięć na swój bufor pierścieniowy. Ta odpowiedź pokazuje, że podział nie jest trudny. Wprawdzie nie rozwiązuje problemu pamięci, ale system SE umożliwia częściowe odpowiedzi, a użytkownicy mogą wziąć coś z każdej odpowiedzi dla siebie, a nawet edytować i łączyć inne odpowiedzi. Ponieważ niektóre inne odpowiedzi wymagają operacji dzielenia, są one podobnie niekompletne, ponieważ nie pokazują, jak skutecznie osiągnąć to na PIC16. ndash Martin Apr 20 12 at 13:01 Istnieje odpowiedź na prawdziwy filtr średniej ruchomej (zwany też filtrem wagonu towarowego) z mniejszą ilością pamięci, jeśli nie masz nic przeciwko zmniejszeniu częstotliwości próbkowania. Nazywany jest kaskadowym filtrem integrator-grzebień (CIC). Pomysł polega na tym, że posiadasz integratora, z którym będziesz różnił się przez pewien okres czasu, a kluczowym urządzeniem oszczędzającym pamięć jest to, że po zmniejszeniu częstotliwości nie musisz przechowywać każdej wartości integratora. Można go zaimplementować za pomocą następującego pseudokodu: Twoja efektywna średnia długość ruchu to decymacja Factorstatesize, ale musisz tylko przechowywać próbki ze stanem. Oczywiście można uzyskać lepszą wydajność, jeśli twój stateize i decimationFactor są potęgami 2, tak że operatorzy podziału i pozostałych zostają zastąpieni przez zmiany i maski. Postscript: Zgadzam się z Olinem, że zawsze powinieneś rozważyć proste filtry IIR przed filtrem średniej ruchomej. Jeśli nie potrzebujesz zerowej częstotliwości filtra wagonów, 1-biegunowy lub 2-biegunowy filtr dolnoprzepustowy prawdopodobnie działa dobrze. Z drugiej strony, jeśli filtrujesz w celu zdziesiątkowania (pobierając dane o wysokiej częstotliwości próbkowania i uśredniając je do użycia w procesie o niskiej szybkości), to filtr CIC może być właśnie tym, czego szukasz. (szczególnie, jeśli możesz użyć statesize1 i całkowicie uniknąć bufora pierścieniowego z tylko jedną poprzednią wartością integratora). Istnieje kilka dogłębnych analiz matematycznych za pomocą filtra IIR pierwszego rzędu, który Olin Lathrop już opisał na wymianie stosu Digital Signal Processing (zawiera mnóstwo ładnych zdjęć.) Równanie tego filtru IIR jest następujące: To może być zaimplementowane przy użyciu tylko liczb całkowitych i bez dzielenia przy użyciu następującego kodu (może wymagać trochę debugowania podczas pisania z pamięci). Filtr ten przybliża średnią ruchomą ostatnie K próbek, ustawiając wartość alfa na 1K. Zrób to w poprzednim kodzie, definiując BITS do LOG2 (K), tj. Dla K 16 ustaw BITS na 4, dla K4 ustaw BITS na 2, itd. (Potwierdzam kod tutaj wymieniony, gdy tylko otrzymam zmianę i edytuj tę odpowiedź w razie potrzeby.) Odpowiedź 23 czerwca 12 o 04:04 Oto jednobiegunowy filtr dolnoprzepustowy (średnia ruchoma, z częstotliwością odcięcia CutoffFrequency). Bardzo prosty, bardzo szybki, działa świetnie i prawie nie ma narzutów pamięci. Uwaga: Wszystkie zmienne mają zasięg wykraczający poza funkcję filtru, z wyjątkiem przekazanego w newInput Note: Jest to filtr jednostopniowy. Wiele etapów można połączyć kaskadowo, aby zwiększyć ostrość filtra. Jeśli używasz więcej niż jednego etapu, będziesz musiał dostosować DecayFactor (w odniesieniu do częstotliwości odcięcia), aby to zrekompensować. I oczywiście wszystko, czego potrzebujesz, to te dwie linie umieszczone gdziekolwiek, nie potrzebują swojej własnej funkcji. Ten filtr ma czas narastania, zanim średnia ruchoma reprezentuje wartość sygnału wejściowego. Jeśli chcesz ominąć ten czas rozruchu, możesz po prostu zainicjować MovingAverage na pierwszą wartość newInput zamiast 0 i mieć nadzieję, że pierwszy newInput nie będzie odstający. (CutoffFrequencySampleRate) ma zakres od 0 do 0,5. DecayFactor jest wartością z zakresu od 0 do 1, zwykle zbliżoną do 1. Pływaki o pojedynczej precyzji są wystarczające dla większości rzeczy, po prostu wolę podwójne. Jeśli musisz trzymać się liczb całkowitych, możesz przekształcić DecayFactor i Amplitude Factor w ułamkowe liczby całkowite, w których licznik jest zapisany jako liczba całkowita, a mianownik jest liczbą całkowitą równą 2 (tak, że możesz przesunąć bit w prawo, mianownik zamiast dzielenia podczas pętli filtra). Na przykład, jeśli DecayFactor 0.99 i chcesz używać liczb całkowitych, możesz ustawić DecayFactor 0,99 65536 64881. A potem, kiedy pomnożysz przez DecayFactor w pętli filtra, po prostu przesuń wynik 16. Więcej informacji na ten temat, doskonała książka online, rozdział 19 dotyczący filtrów rekursywnych: dspguidech19.htm PS W przypadku paradygmatu Moving Average, inne podejście do ustawiania DecayFactor i AmplitudeFactor, które mogą być bardziej odpowiednie do twoich potrzeb, powiedzmy, że chcesz poprzedni, około 6 elementów uśrednionych razem, robiąc to dyskretnie, dodałeś 6 pozycji i podzieliłeś o 6, więc możesz ustawić AmplitudeFactor na 16, a DecayFactor na (1.0 - AmplitudeFactor). Odpowiedzieli 14 maja 12 o 22:55 Wszyscy inni dokładnie skomentowali użyteczność IIR vs. FIR i podziału sił dwóch. Chciałbym podać pewne szczegóły dotyczące implementacji. Poniższe działa dobrze na małych mikrokontrolerach bez FPU. Nie ma mnożenia, a jeśli utrzymujesz N jako potęgę dwóch, cały podział jest przesunięciem bitów w jednym cyklu. Podstawowy bufor pierścieniowy FIR: zachowaj bufor bieżących ostatnich N wartości i działający SUM wszystkich wartości w buforze. Za każdym razem, gdy pojawia się nowa próbka, odejmij najstarszą wartość z buforu od SUM, zastąp ją nową próbką, dodaj nową próbkę do SUMY i wypisz SUMN. Zmodyfikowany bufor pierścieniowy IIR: zachowaj SUM z ostatnich N wartości. Za każdym razem, gdy pojawia się nowa próbka, SUM - SUMN, dodaj nową próbkę i wypisz SUMN. odpowiedział 28 sierpnia 13 o 13:45 Jeśli I39m czyta dobrze, to opisując filtr IIR pierwszego rzędu wartość odejmowania nie jest najstarszą wartością, która wypada, ale jest zamiast średniej z poprzednich wartości. Filtry IIR pierwszego rzędu z pewnością mogą się przydać, ale nie jestem pewien, co masz na myśli, gdy sugerujesz, że wynik jest taki sam dla wszystkich sygnałów okresowych. Przy częstotliwości próbkowania 10 kHz, podanie fali kwadratowej 100 Hz do 20-stopniowego filtra skrzynkowego da sygnał równomiernie rosnący dla 20 próbek, siedzi wysoko na 30, krople równomiernie na 20 próbek i siedzi na niskim poziomie przez 30. A first-order Filtr IIR. ndash supercat 28 sierpnia 13 o 15:31 przyniesie falę, która gwałtownie zacznie wzrastać i stopniowo spadnie blisko (ale nie na) maksymalnej wartości wejściowej, a następnie gwałtownie zacznie spadać i stopniowo spadnie w pobliżu (ale nie przy) minimalnej wartości wejściowej. Bardzo różne zachowanie. ndash supercat 28 sierpnia 13 o 15:32 Problem polega na tym, że prosta średnia krocząca może, ale nie musi być użyteczna. Dzięki filtrowi IIR możesz uzyskać ładny filtr o stosunkowo niewielkiej liczbie kalorii. FIR, które opisujesz, może dać ci tylko prostokąt w czasie - sinc in freq - i nie możesz zarządzać bocznymi płatami. Być może warto rzucić kilka mnożących liczb całkowitych, aby uczynić z niego symetryczny przestrajalny FIR, jeśli można oszczędzić tyknięcia zegara. ndash Scott Seidman Aug 29 13 at 13:50 ScottSeidman: Nie ma potrzeby mnożenia, jeśli jeden po prostu ma każdy etap FIR albo wyprowadza średnią z wejścia do tego etapu i jego poprzedniej zapisanej wartości, a następnie przechowuje dane wejściowe (jeśli zakres liczbowy, można użyć sumy zamiast średniej). To, czy jest lepsze niż filtr skrzynkowy, zależy od aplikacji (odpowiedź skokowa filtra skrzynkowego z całkowitym opóźnieniem 1 ms, na przykład, będzie miała nieprzyjemny skok d2dt, gdy zmiana wejścia, i ponownie 1 ms później, ale będzie miała minimum możliwe ddt dla filtra z całkowitym opóźnieniem 1ms). ndash supercat Aug 29 13 o 15:25 Jak powiedział mikeselectric, jeśli naprawdę potrzebujesz zmniejszyć zapotrzebowanie na pamięć i nie przejmujesz się tym, że odpowiedź impulsowa jest wykładnicza (zamiast impulsu prostokątnego), wybrałbym wykładniczy filtr średniej ruchomej . Używam ich szeroko. Z tego typu filtrem nie potrzebujesz żadnego bufora. Nie musisz przechowywać N ostatnich próbek. Tylko jeden. Tak więc, twoje wymagania dotyczące pamięci zostają zmniejszone o współczynnik N. Nie potrzebujesz do tego żadnego podziału. Tylko multiplikacje. Jeśli masz dostęp do arytmetyki zmiennoprzecinkowej, użyj zwielokrotnień zmiennoprzecinkowych. W przeciwnym razie wykonaj całkowitą multiplikację i przesuń w prawo. Jednak jesteśmy w 2017 roku i polecam korzystanie z kompilatorów (i mikrokontrolerów), które umożliwiają pracę z liczbami zmiennoprzecinkowymi. Poza tym, że jest to więcej pamięci wydajnej i szybszej (nie musisz aktualizować elementów w dowolnym buforze kołowym), powiedziałbym, że jest to również bardziej naturalne. ponieważ wykładnicza odpowiedź impulsowa lepiej pasuje do sposobu, w jaki zachowuje się natura, w większości przypadków. Odpowiedział 20 kwietnia o 9:59 Jedną z kwestii związanych z filtrem IIR, jako że prawie został dotknięty przez olin i supercat, ale najwyraźniej został zignorowany przez innych, jest to, że zaokrąglenie w dół wprowadza pewną niedokładność (i potencjalnie biastuncation). zakładając, że N jest potęgą dwóch, a używana jest tylko arytmetyczna liczba całkowita, prawo przesunięcia systematycznie eliminuje LSB nowej próbki. Oznacza to, że jak długo seria może być, średnia nigdy nie bierze ich pod uwagę. Załóżmy na przykład, że seria powoli się zmniejsza (8, 8, 8, 7, 7, 7, 7, 6, 6) i zakłada, że ​​średnia wynosi na początku 8. Pierwsza próbka 7 przyniesie średnią do 7, niezależnie od siły filtra. Tylko na jedną próbkę. Ta sama historia dla 6 itd. Teraz pomyśl o czymś przeciwnym. seria idzie w górę. Średnia pozostanie na 7 na zawsze, dopóki próbka nie będzie wystarczająco duża, aby mogła się zmienić. Oczywiście można poprawić błąd poprzez dodanie 12N2, ale to naprawdę nie rozwiąże problemu precyzji. w takim przypadku seria malejąca pozostanie na zawsze w punkcie 8, dopóki próbka nie osiągnie wartości 8-12 (N2). N4 na przykład, każda próbka powyżej zera utrzyma średnią bez zmian. Uważam, że rozwiązanie tego problemu oznaczałoby posiadanie akumulatora utraconych LSB. Ale nie zrobiłem tego wystarczająco daleko, aby mieć gotowy kod i nie jestem pewien, czy nie zaszkodziłoby to mocy IIR w niektórych innych seriach (na przykład, czy 7,9,7,9 będzie średnio wtedy 8). Olin, twoja dwustopniowa kaskada również potrzebuje wyjaśnienia. Czy masz na myśli trzymanie dwóch średnich wartości z wynikiem pierwszego podawanego do drugiego w każdej iteracji. Co to jest korzyść z tego Forum: Digitale Signalverarbeitung DSP FILTR PRZECIĘTNY PRZESUWNY w FastAVR Indeks dim jako bajt wartość dim (4) jako średnia bajtowa bajt jako słowo dim count jako indeks bajtowy 1 39 rad w bascom beginnen mit 1 :-( wartość do zrobienia (indeks) getadc (x) 39messen incr index, jeśli indeks 5 to indeks 1 dla liczby 1 do 4 średnia wartość średnia (liczba) następna średnia zmiana, prawo, 2 39geht schneller als 4 pętla Fastavr wird ja nicht sooo viel anders sein. Anstatt do-loop kannst Du das był dazwischen steht natrlich auch als sub aufrufen oder wie auch immer. Dann mach es doch tak wie mein Beispiel (nur ohne den Fehler średnia bis ins unendliche hochzuaddieren -)), nur da der letzte Mittelwert den lten Wert des arrays ersetzt: do incr wartość indeksu (indeks) getadc (x) 39 indeks wartość (indeks-1) średnia jeśli wskaźnik 5 to indeks 1 średnia 0 dla zliczenia 1 do 4 średnia wartość średnia (zliczenie) następna średnia zmiana, prawa, 2 39geht schneller als 4 pętla Noch ne Idee zum gltten, ev. etwas trge: - Wert messen als Anfang Dann immer: - neuen Wert messen Wert (3Wert neuer Wert) 4 nur upadek es noch einen interessiert. Sesit ich die bisherigen Varianten hier berblickt habe, wird immer die Summe fr den Mittelwert ausgewertet. Das macht diese Methoden aber langsamer mit steigernder Fensterlnge. Nachdem der Mittelwert liniowy ist, kann ich die Summe auch einfach zerlegen und spare mir so jedmemal die Summe auszuwerten. zdefiniuj WindowSize 4 int samplesWindowSize int index 0 int average 0 while (1) Alten Wert abziehen. średnia - sampleindex Neuen Wert zufgen. sampleindex input WindowSize Neuen Mittelwert bilden. average samplesindex Im Ringbuffer weiterstellen index index WindowSize Der Code jest skrótem od quotoptimalquot, sondern sollte nur die Funktionsweise demonstrieren. Desweiteren muss man bei diesem Verfahren die Rundungsfehler beachten, d. h. bei Benutzung von Integer-Arithmetik ist der gewonnene Mittelwert etwas ungenauer. Autor: Martin (Gast) Data: 02.05.2009 03:29 mal ein ganz anderer Ansatz: Warum erhhst Du nicht einfach die Sampling-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-Average-Filter Nimm einfach ne viermal so hohe Próbkowanie, ist das gleiche, wie wenn Dein AD-Wandler vier Werte aufnimmt und Du den dann wieder mittelst (Okay gesame Sampling - und Convert - Zeit betrachten) ) Wtrącaj się w to, aby nie były w stanie zepsuć się, by nie dopuścić do zepsucia się. (Wyczuwalnie, a nie w sposób, w jaki próbujesz wytłumaczyć). Nur so ein Gedanke. mal ein ganz anderer Ansatz: Warum erhhst Du nicht einfach die Sampling-Zeit am AD-Wandler. Somit hast Du ein Hardware-Moving-Average-Filter N to najlepszy człowiek na świecie. Wenn man vor dem ADC Eingang noch einen RC-Tiefpass mit passender Grenzfrequenz setzt dann wird ein Schuh draus. Ohne diesen schlgt die SampleampHoldstufe des ADCs zu, wir reden ja vom AVR. und die bentigt nur 1.5 ADC Takte um das Eingangssignal zu sampeln. Odpowiedź na schreiben Die Angabe einer E-Mail-Adresse jest freiwillig. Automatyczna synchronizacja dla wiadomości e-mail i wiadomości e-mail, a także informacji o wiadomościach, wiadomościach i rozmowach. Wichtige Regeln - erst lesen, dann posten Gro - und Kleinschreibung verwenden Lngeren Sourcecode nicht im Tekst einfgen, sondern als Dateianhang Formatierung (mehr Informationen.) CC-Codec avrasmAVR-Assembler-Codeavrasm codeCode in anderen Sprachen, ASCII-Zeichnungencode mathFormel w LaTeX-Syntaxmath Titel - Link zu Artikel Verweis auf anderen Beitrag einfgen: Rechtsklick auf Beitragstitel, Adresse kopieren, und in den Tekst einfgen

Comments

Popular posts from this blog

Forex economic calendar desktop widget

Forex Widgety Umieszczaj na żywo dane o Forex na swojej stronie Rynek forex działa w szybkim tempie, a tysiące stron internetowych dostarcza informacji, aby zaspokoić popyt. Niestety, większość webmasterów, blogerów i partnerów marketingowych nie ma danych z rynku forex w czasie rzeczywistym, aby uzupełnić istniejące analizy, wiadomości i komentarze. Realtime Forex ma na celu wzmocnienie Twojej witryny i przyciągnięcie odbiorców dzięki Realtime Forex Widgets. Konfigurowalne, szybkie i darmowe widgety forex Powody, dla których nasza jest lepsza niż konkurencja Darmowy Łatwa integracja Stylowy wyświetlacz Dynamiczny wgląd rynkowy Dostępne widżety Widget tabeli Aktualne stawki Teraz dostępne 22 pary walut zaktualizowane w czasie rzeczywistym czekają na zintegrowanie na twojej stronie internetowej. Zdobądź je w 2 minuty. Rejestracja nie jest wymagana. Dostępny teraz widget gry na rynku Forex Wybierz spośród 22 par walutowych, które przewijają się przez szerokość ekranu, prezentując aktuali...

Definicja opcji delta fx

Opcje Strategie handlowe: Zrozumienie delty pozycji Rysunek 2: Hipotetyczne opcje długich połączeń SampP 500. W tym momencie możesz się zastanawiać, jakie wartości delta Ci mówią. Poniższy przykład ilustruje pojęcie prostej delty i znaczenie tych wartości. Jeśli opcja kupowania SampP 500 ma deltę równą 0,5 (dla opcji bliskiej lub na poziomie pieniężnym), ruch jednopunktowy (o wartości 250) kontraktu terminowego futures spowoduje zmianę o 0,5 (lub 50) ( o wartości 125) w cenie opcji kupna. Wartość delta wynosząca 0,5 oznacza, że ​​na każde 250 zmian wartości bazowych kontraktów terminowych, opcja zmienia wartość o około 125. Jeśli długo trwała ta opcja połączenia, a kontrakty futures SampP 500 podnoszą się o jeden punkt, twój opcja call zyskałaby wartość około 125, zakładając, że w krótkim czasie nie zmieni się żadna inna zmienna. Mówimy w przybliżeniu, ponieważ jako ruchy bazowe zmieni się również delta. Miej świadomość, że w miarę jak opcja dostaje się dalej w pieniądzu, delta zbliża ...

Rynek walutowy mechanizm ppt

Mechanizm obrotu Ile pieniędzy jest potrzebnych do handlu na rynku Forex. Aby się tego dowiedzieć, należy zbadać mechanizmy zawierania transakcji. Po pierwsze, gdy kupiec kupuje walutę, nie kupuje euro ani brytyjskich funtów, kupuje parę walutową, np. euro-dolar (zapisany w następujący sposób: EURUSD). Oznacza to, że kupujemy euro za dolary. Waluta, która jest napisana jako pierwsza, jest nazywana walutą podstawową, a waluta, która jest zapisana jako druga, nazywana jest walutą notowań. I przedsiębiorca nie kupuje kwoty bezpośrednio na rynku Forex, odbywa się przez losowanie. Jedna partia reprezentuje 100 000 jednostek waluty bazowej. Innymi słowy, w naszym poprzednim przykładzie, kupujemy 100 000 EUR na rynku Forex. Ile dolarów powinniśmy za to płacić? Istnieje pojęcie kursu walutowego, które jest nominałem monetarnym kosztu pary walutowej, a dokładniej jednostki waluty bazowej wyrażonej w walucie krajowej. A kiedy mówimy, że eurodolara kosztuje 1,3875, to faktycznie oznacza to, że za...