Thursday 30 November 2017

Moving average microcontroller


LED LYT Meter LED, mikrokontroler PIC i Moving Average Code. Hello everyone, dziękuję za sprawdzenie mojego pierwszego Instructable, z którego korzystałem widząc Twoje dzieła przez lata i kocham wszystko, co przyczyniasz się Ten projekt to odłam Niedawno widziałem tutaj i muszę dać krzyk do Bot1398, bo pokazał mi w Instructable, że można użyć diody LED, aby wykryć zmiany natężenia światła w środowisku i używać go, aby włączyć inną diodę lub wyłączyć wiedziałem, że jeśli dostarczasz trochę energii do diody, to emituje światło Nigdy nie myślałem, że może być używany w drugą stronę Po tym, jak widziałem jego Instructable Light Sensing LED to miało sens, ale chciałem zobaczyć, to rzeczywiście dla siebie. Jestem pisanie tego Instructable, ponieważ Bot1398 użył Arduino i nigdy ich nie używałem Nie mam przeciwko nim nic, kiedy zacząłem używać mikrokontrolerów około 3 lat temu szukałem szybkości i mocy dla konkretnego zastosowania, mikrokontroler PIC serii Microchip To niesamowite, co możesz zrobić z mikrokontrolerami, możesz pozwolić wyobraźni biegać dziko i trochę twórczego programowania osiągnąć dokładnie to, czego chcesz Istnieje wiele języków programowania tam, jak również, ale kiedy zacząłem I szybkość i wiedzę dokładnie, co dzieje się na każdym kroku, dlatego wybrałem Assembly Language, ponieważ wydawało się to bardzo podobne do BASIC, czego dowiedziałem się na IBM PC Jr w latach osiemdziesiątych, gdy dorastałem ten Instructable wymaga mikrokontrolerów PIC i języka assemblera, aby używać diody LED emitującej światło do wykrywania ilości światła otoczenia i wyświetlać liczbową miarę tego światła oraz bargraf na ekranie LCD. Czujnik światła, który działał, kłopot, który zauważyłem, polegał na tym, że wartości nieco wzrosły. Dlatego szukałem rozwiązania tego problemu, myślałem o uśrednieniu wartości, ale jak binarna matematyka robi to coś trudnego, ale zawsze jest jakiś sposób, aby to zrobić Gdy szukałem rozwiązań, natrafiłem na wielką stronę o Moving Averages i jak to zrobić najskuteczniej, aby nawet 8-bitowe mikrokontrolery mogły sobie radzić z łatwością Łącze do strony znajduje się tutaj Efektywnie obliczeniowo średnie kroki i to działa bardzo dobrze Ta implementacja wyświetla Moving Average z ostatnich 256 odczytów światła i wyświetla tę wartość wraz z bargrafem na ekranie LCD Przeciętny średni kod zapobiega wartościom odczytywać z LED dużo skoków i daje lepszy, bardziej dokładny wynik. Kiedy załączamy diody LED do mikrokontrolera zwykle robimy to, aby go rozjaśnić W tym przypadku jednak używamy pozytywnego napięcia do negatywny koniec elektrody Jest to więc możemy skorzystać z czegoś nazywanego pasożytniczą pojemnością Zastosowanie tego dodatniego napięcia wzbudzi małe zasoby ładunków w Internecie powiedzieć wi cienki około 100-200 nanosekund w tej pasożytniczej pojemności diody LED, że używamy Rzeczywista pojemność nie jest bardzo ważna, ale online twierdzi, że jest około 10-15 pF Następnie będziemy przełączać pin mikrokontrolera dołączony do ujemnego końca elektrody z OUTPUT do INPUT i poczekaj, aż ładunek opróżni się Gdy ładunek spłynie wystarczająco dużo, pin będzie teraz odczytywał poziom Logic 0 lub Low, który wyłączy timer i użyj tej wartości do obliczenia średniej ruchomej i wyświetlacza wyniki na ekranie Zajmiemy więcej odczytów i wyświetli je na ekranie w przedziale, który jest napisany w kodzie montażowym W gotowym kodzie, mam to ustawione na jedno czytanie co 20 lub tak mikrosekundy To zdarza się 50 razy dzięki czemu zaktualizowany wynik jest wyświetlany na ekranie w przybliżeniu co sekundę Czas potrzebny na odczyt może się nieco różnić, ponieważ ładowanie trwa dłużej, w ciemnym otoczeniu, a ten czas rs szybciej w środowiskach świetlnych Szybkość rozładowania diody LED jest w jakiś sposób związana bezpośrednio z liczbą fotonów lub ilością światła uderzającego w elementy generujące światło LED Neat isn t it. Now, że wiemy, jak to działa, przejdźmy do kroku 1.Step 1 Zbierz komponenty i zmontuj Circuit. First zbierz następujące elementy, które trzeba zbudować mikrokontroler LED LYT METER. PIC Użyłem ekranów LCD 18F4550 2x20 lub 2x16 LED Breadboard Wires Power Source. Now powinieneś być w stanie śledzić schematycznie zmontować obwód na desce rozdzielczej lub w jakikolwiek inny sposób, że chcesz umieścić swoje obwody razem Jest to dość proste i ma minimalne części I dołączyć dwa różne schematy, jeden ma światło LED pomiarowe podłączone do dwóch różnych mikrokontrolerów szpilki a drugi ma tę diodę z katodą lub ujemnym końcem połączonym z pinem mikrokontrolera i anodą lub dodatnim końcem diody LED podłączonej do uziemienia Wydaje się to wsteczne, ale pamiętaj, że jesteśmy n ot za pomocą diody LED do produkcji światła, ale do pomiaru go zamiast tego dlatego jest podłączony w ten sposób na moich zdjęciach widać, że dioda LED jest podłączony do dwóch pinów mikrokontrolera To dlatego, że chciałem być w stanie korzystać z Dioda LED również wytwarza światło, aby sprawdzić, czy działa ona, gdy program jest uruchomiony. Jeśli wybierzesz podłączyć diodę LED do 2 styków mikrokontrolera, musisz pamiętać o tym, że nie działa znaleźć to udokumentowane gdziekolwiek, więc to trochę eksperymentów, aby to zadziała W celu umożliwienia zapalenia diody LED zarówno mikrokontrolera szpilki będą musiały być ustawione jako OUTPUTS Następnie, aby świecić LED, można ustawić anodę lub pozytywne zakończenie LED wysokiej tak, że prąd płynie przez LED do produkcji światła Na początku myślałem, że będę musiał ustawić katodę lub negatywny koniec diody LED jako INPUT, ale to nie działało. Teraz masz componenets, umieścić je razem na desce rozdzielczej, postępując według schematu, który chcesz do naśladowania Po zmontowaniu, powinien wyglądać nieco podobny do zdjęć poniżej Używam 5 Volt Regulator do zasilania 5 V do zasilania obwodu używam brodawki na ścianie, że dostarcza około 9 V do regulatora. Ekran LCD, który używam jest wyświetlaczem Newhaven NHD C0220AZ FSW FTW COG na szybie szklanym wyświetlaczem ciekłokrystalicznym Używałem wyświetlaczy LCD HD44780, które wielu innych osób używa Możesz bez problemu używać wyświetlaczy HD44780 i jest tam dużo więcej kodu źródłowego je uruchomić Wyświetlacz Newhaven nie miał kodu źródłowego, ale siedząc z kartą danych i używając kodu źródłowego HD44780, natknąłem się na kod, aby sprawić, że będzie on idealnie wyglądał Podoba mi się wyświetlacz z kilku powodów Kontrast jest bardzo łatwy do ustawienia i do tej pory nie musiałem tego zmieniać w różnych porach roku, zawsze pozostaje jasny i bardzo łatwy do odczytania Ma również mniejszy ślad i był dokładnie tym, czego potrzebowałem dla ogromnego projektu, w którym pracuję w miejscu, gdzie są dostępne tempo jest w premie Jest mniejsze i niż na wyświetlaczach HD44780 i nadal wyświetla 20 znaków na każdej z dwóch linii Wreszcie, jest tańsze niż wyświetlacze HD44780, a także wybrałem kilka z nich z Digikey i tylko za cenę z 10 25 każda Sprawdź je tutaj Wyświetlacz LCD Newhaven w Digikey Pamiętaj, że ten wyświetlacz wymaga od 3 do 5 5 woltów, więc pamiętaj o tym przy wyborze źródła zasilania Kod źródłowy dostarczony powinien również wyświetlać wyświetlacze HD44780 bez wszelkie problemy. To jest tak, że mam to skonfigurować Możesz umieścić komponenty do diffent szpilki mikrokontrolera Pamiętaj tylko, które szpilki mikrokontrolera można podłączyć do dodatniego i ujemnego końca światła wykrywania LED Możesz również podłączyć ekran LCD do pracy w trybie 4-bitowym zamiast trybu 8-bitowego, jak zilustrowano To wymagało mniej niż czterech połączeń w obrębie obwodu, ale czyni programowanie nieco bardziej skomplikowane. Na następnych krokach zapisz Pr ogram. One główne zastosowania płyty Arduino są odczytywaniem i rejestrowaniem danych z czujników Na przykład jeden monitoruje ciśnienie co sekundę dnia Ponieważ wysokie częstotliwości próbkowania często generują skoki na wykresach, to również chce mieć średnią z pomiarów pomiary nie są statyczne w czasie, czego często potrzebujemy to średnia bieżąca Jest to średnia z pewnego okresu i bardzo wartościowa podczas analizy trendów. Najmniejsza forma średniej przebiegu może być dokonana przez kod, który opiera się na poprzedniej średniej. Jeśli jeden nie chce używać matematyki zmiennoprzecinkowej - ponieważ zajmuje pamięć i zmniejsza prędkość - można to zrobić całkowicie w domenie całkowitej Podział 256 na przykładowy kod to przesunięcie-prawo 8, które jest szybsze niż powiedz podział przez np. 100 To prawda na każdą moc 2 jako dzielnik i tylko trzeba dbać o sumę wegów równą mocy 2 I oczywiście należy zadbać o to, aby nie było przecięcia pośredniego, jeśli chodzi o użycie unsigned lon g. Jeśli potrzebujesz dokładniejszej średniej pracy, w konkretcie z ostatnich 10 pomiarów, potrzebujesz tablicy lub połączonej listy, aby je przechowywać. Ta tablica działa jak okrągły bufor, a każdy nowy pomiar jest najstarszy. Średnia bieżąca jest obliczona jako suma wszystkich elementów podzielona przez liczbę elementów w tablicy Kod dla bieżącej średniej będzie podobny do tego. Drawback tego kodu polega na tym, że tablica do przechowywania wszystkich wartości może stać się całkiem duża Jeśli masz jeden pomiar na po drugie i chcesz przeciętnej przeciętnej na minutę potrzebujesz tablicy 60 średnio na godzinę potrzebujesz tablicy 3600 To nie można zrobić w ten sposób na Arduino, ponieważ ma tylko 2K pamięci RAM Jednak budując 2-stopniową średnią to może być zbliżył się całkiem dobrze zrzeka się nie dla wszystkich pomiarów W kodzie psuedo. As nowej wewnętrznej tablicy statycznej jest potrzebna dla każdej funkcji RunningAverage, to screams do wdrożenia jako biblioteka class. RunningAverage. Biblioteka RunningAverage sprawia, że klasa funkcji powyżej, aby mogła być wielokrotnie używana w szkicu Decouples add i avg funkcji być nieco bardziej elastyczne, np. można zadzwonić średnio wiele razy bez dodawania rzeczy Proszę zauważyć, że każda instancja klasy dodaje własne tablice do przechowywania pomiarów, a to zwiększa zużycie pamięci Interfejs klasy jest tak mały, jak to możliwe. Uwaga z wersją 0 2 nazwy metod są bardziej opisowe. Mały szkic pokazuje, jak to działa może być używany Generator losowy jest używany do naśladowania czujnika. W konfiguracji myRA jest wyczyszczona, dzięki czemu możemy rozpocząć dodawanie nowych danych. In pętli pierwsze generuje losową liczbę i przekształca się w zmiennoprzepustowy, który ma zostać dodany do myra Następnie uruchomiony jest drukowany do portu szeregowego Można też wyświetlić go na jakimś LCD lub wysłać za pośrednictwem sieci Ethernet itp. Po dodaniu 300 pozycji myRA zostaje skasowana, aby zacząć od nowa. Aby skorzystać z biblioteki, utwórz folder w skryptach SKETCHBOOKPATH z nazwą RunningAverage i włóż plik h i re Opcjonalnie podaj katalog przykładów, aby umieścić przykładową aplikację 2017-01-30 wersja początkowa 2017-02-28 utrwalony destruktor brakujący w pliku h.2017-02-28 usunięto konstrukcję domyślną 2017- - trimValue Yuval Naveh dodano trimValue found na web.2017-11-21 refaktored.2017-12-30 dodano fillValue refakturowano do publikacji.2017-07-03 dodano kod ochrony pamięci - jeśli wewnętrzna tablica nie może zostać przydzielona wielkość staje się 0 To jest rozwiązanie problemu opisanego tutaj. Test szeroko. Template class. RunningAverage h. RunningAverage. Ale innych osób wspomniało, należy rozważyć filtr odpowiedzi impulsowych IIR, a nie filtr odpowiedzi impulsowej FIR firmy FIRST, którego używasz teraz. Jest więcej, ale na pierwszy rzut oka filtry FIR są implementowane jako wyraźne convolutions i filtry IIR z równań. Czy filtr IIR używam wiele w mikrokontrolerach jest jeden biegun filtra dolnoprzepustowego Jest to cyfrowy odpowiednik prostego analogowego filtru RC Dla większości aplikacji, będą one lepsze characteristi cs niż filtr pola, którego używasz Większość zastosowań filtru pudełkowego, który napotkam, jest wynikiem, że ktoś nie zwraca uwagi na klasę przetwarzania sygnału cyfrowego, a nie w wyniku potrzeby ich szczególnych cech Jeśli chcesz złagodzić wysokie częstotliwości że masz 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 trwałego stanu Jest to jedyna trwała zmienna musimy 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 widzimy, że dla FF 0 filtr jest nieskończenie ciężki, ponieważ sygnał wyjściowy nigdy zmiany 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 być 1 2 N, aby mnożyć przez FF może być osiągnięty jako ar ight zmiany N bitów Na przykład, FF może być 1 16 i pomnożyć przez FF, a więc prawo przesunięcia 4 bitów W przeciwnym razie ten filtr potrzebuje tylko jednego odejmowania i jeden dodać, chociaż numery zwykle muszą być szersze niż wartość wejściowa więcej na precyzję numeryczną w oddzielnej sekcji poniżej. Jednak odbieram odczyty AD znacznie szybciej niż są potrzebne i zastosować dwa z tych filtrów kaskadowych Jest to cyfrowy odpowiednik dwóch filtrów RC w szeregu i tłumi o 12 o o oktawę powyżej częstotliwości rolloff Jednakże, dla odczytów AD zwykle bardziej trafne jest przejrzenie filtru w domenie czasowej przez rozważenie odpowiedzi krokowej To informuje o tym, jak szybko Twój system będzie widział zmianę, gdy coś mierzysz zmiany. Aby ułatwić projektowanie tych filtrów, co oznacza jedynie zbieranie FF i zdecydowanie, ile z nich kaskada, używam mojego programu FILTBITS Możesz określić liczbę bitów przesunięcia dla każdego FF w kaskadzie serii filtrów i oblicza krok odpowiedzi i o to rzeczywiście zwykle uruchamiam to za pomocą mojego skryptu do owijania PLOTFILT To uruchamia FILTBITS, które tworzy plik CSV, a następnie plotuje plik CSV Na przykład tutaj jest wynikiem PLOTFILT 4 4.Te dwa parametry PLOTFILT oznaczają, że będą dwa filtry kaskada typu opisanego powyżej Wartości 4 wskazują liczbę bitów przesunięcia, aby zrealizować mnożenie przez FF W tym przypadku dwa wartości FF mają więc wartość 1 16. Czerwony ślad to odpowiedź na jednostkę kroku i jest najważniejsza rzeczą na przykład to mówi, że jeśli dane wejściowe zmienia 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 rozliczanie czasu tylko 26 iteracji. Zielony ślad wskazuje na wyjście z jednego skoku pełnej amplitudy 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. Błękitny ślad jest gi mam subiektywne odczucia 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 w tym utworze PLOTFILT To tylko dać ci szorstkie uczucie, jak bardzo będzie zgniecione i jak gładkie jest. PLOTFILT, może FILTBITS i wiele innych użytecznych rzeczy, szczególnie w zakresie rozwoju oprogramowania PIC jest dostępne w oprogramowaniu PIC Development Tools na stronie pobierania oprogramowania. Narzędzia dotyczące liczb precyzja. Zobaczyłem w komentarzach, a teraz nową odpowiedź, że interesuje się dyskusją na temat liczby bitów potrzebnych do wdrożenia tego filtra Zauważ, że pomnożenie przez FF spowoduje utworzenie nowych bitów FF FF poniżej punktu binarnego W małych systemach FF zwykle wybrany jako 1 2 N, tak że to pomnożenie jest rzeczywiście zrealizowane przez prawo przesunięcia N bitów. FILT jest zatem zazwyczaj liczbą całkowitą stałą Uwaga, że ​​nie zmienia to żadnej matematyki z punktu procesora view Jeśli na przykład filtruję 10 bitowe odczyty AD i N 4 FF 1 16, potrzebujesz 4 bitów ułamkowych poniżej 10-bitowych liczb całkowitych odczytów AD Jeden procesor, wykonujesz 16-bitowe operacje całkowite z powodu 10-bitowego AD odczyty W tym przypadku można nadal wykonywać dokładnie takie same 16-bitowe operacje całkowite, ale zaczynaj od odczytów AD przesuniętych o 4 bitów. Procesor nie zna różnicy i nie potrzebuje wykonywania matematyki na całych 16-bitowych liczb całkowitych, czy uważasz je za 12 4 stały punkt lub prawdziwy 16 bitowych liczb całkowitych 16 0 stały punkt. Ogólnie trzeba dodać N bitów każdego bieguna filtra, jeśli nie chcesz dodać hałasu z powodu liczbowej reprezentacji W powyższym przykładzie, drugi filtr dwóch musiałoby mieć 10 4 4 18 bitów, aby nie zgubić informacji W praktyce na 8-bitowej maszynie, która oznacza, że ​​używasz 24 bitowych wartości Technicznie tylko drugi biegun dwóch wymagałby szerszej wartości, ale dla uproszczenia oprogramowania I zwykle używają tej samej reprezentacji, a tamtej y 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ą bardziej istotne w tym konkretnym projekt W każdym razie używam pewnego stanu, aby przejść NOWOŚĆ do makra podprocedury, który aktualizuje plik FILT, ale ładuje się do tego samego stanu początkowego NOWY był w To ułatwia stosowanie wielu biegunów, ponieważ aktualizacja FILT jednego bieguna jest NOWOŚĆ z następnej Jeśli jest procedura podprogramu, pożytecznie wskaż wskaźnik na 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. Wszystkie t Te przykłady są implementowane jako makra przy użyciu mojego preprocesora montera 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 drugiej w każdej iteracji Co to jest zaletą tego.

No comments:

Post a Comment