Thursday 2 November 2017

Przenoszenie średnia filtr arduino


Pracuję nad robotem mobilnym sterowanym za pomocą bezprzewodowego łącza 2,4 GHz. Odbiornik jest podłączony do Arduino Uno, który służy jako główny kontroler na pokładzie. Najbardziej krytyczny (i główny) kanał wejściowy pochodzący z odbiornika wytwarza bardzo głośny sygnał, który prowadzi do wielu drobnych zmian w wyjściu siłowników, nawet jeśli nie są one potrzebne. Szukam bibliotek, które mogą wydajnie wygładzać. Czy są jakieś biblioteki wygładzające sygnał dostępne dla Arduino (Uno) zapytane 16 lutego 14 o 13:57 Myślę, że widzę dużo pojedynczych próbnych szumów w hałaśliwym sygnale. Filtr medianowy lepiej eliminuje impulsy szumowe pojedynczej próbki niż jakikolwiek filtr liniowy. (Jest lepszy niż jakikolwiek filtr dolnoprzepustowy, średnia ruchoma, ważona średnia ruchoma itp. Pod względem czasu reakcji i jego zdolności do zignorowania takich pojedynczych zniekształceń sparowanych pojedynczej próbki). W rzeczywistości istnieje wiele bibliotek wygładzających sygnał dla Arduino, z których wiele zawiera filtr medianowy. wygładzanie sygnałów w bibliotekach arduino. cc: wygładzanie sygnału w github: Czy coś takiego działa w twoim robocie (Mediana-3 wymaga bardzo niewielkiej mocy procesora, a więc szybko): Możesz filtrować to cyfrowo przy użyciu niskiego poziomu pass filter: Zmień 0.99, aby zmienić częstotliwość odcięcia (bliższa 1,0 to niższa częstotliwość). Rzeczywistym wyrażeniem dla tej wartości jest exp (-2piffs), gdzie f jest żądaną częstotliwością odcięcia, a fs jest częstotliwością, z której próbkowane są dane. Innym rodzajem filtru cyfrowego jest filtr zdarzeń. Działa dobrze na danych, które mają wartości odstające, np. 9,9,8,10,9,29,25,9. Filtr zdarzeń zwraca najczęściej występującą wartość. Statystycznie jest to tryb. Średnie statystyczne, takie jak Mean, Mode itd. Można obliczyć za pomocą średniej biblioteki Arduino. Oto przykład zaczerpnięty ze strony Arduino Library: 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. cppMoże zaimplementować średnią ruchomą w C bez potrzeby użycia okna z próbkami, które mogę zoptymalizować nieco, wybierając rozmiar okna o potędze dwóch, aby umożliwić przesunięcie bitów zamiast dzielić, ale nie potrzebować bufora byłoby miło. Czy istnieje sposób wyrażenia nowego wyniku średniej kroczącej tylko jako funkcję starego wyniku i nowej próbki Zdefiniuj przykładową średnią ruchomą w oknie 4 próbek: Dodaj nową próbkę e: Średnia ruchoma może zostać zaimplementowana rekurencyjnie , ale do dokładnego obliczenia średniej ruchomej trzeba zapamiętać najstarszą próbkę wejściową w sumie (tj. a w twoim przykładzie). Dla długości N średniej ruchomej obliczamy: gdzie yn jest sygnałem wyjściowym, a xn jest sygnałem wejściowym. Eq. (1) może być napisany rekurencyjnie jako Więc zawsze musisz zapamiętać próbkę xn-N w celu obliczenia (2). Jak wskazał Conrad Turner, można zamiast tego użyć (nieskończenie długiego) okna wykładniczego, które pozwala obliczyć wyjście tylko z poprzedniego wyjścia i bieżącego wejścia: ale nie jest to standardowa (nieważona) średnia ruchoma, ale wykładniczo ważona średnia ruchoma, gdzie próbki w przeszłości mają mniejszą masę, ale (przynajmniej teoretycznie) nigdy niczego nie zapominasz (ciężary stają się mniejsze i mniejsze dla próbek daleko w przeszłości). Zaimplementowałem średnią ruchomą bez pamięci pojedynczych elementów dla programu do śledzenia GPS, który napisałem. Zaczynam od 1 próbki i dzielę przez 1, aby uzyskać aktualną średnią. Następnie dodaję próbkę anothe i dzielę przez 2 do aktualnej avg. To trwa, dopóki nie osiągnę długości średniej. Za każdym razem dodawam nową próbkę, otrzymuję średnią i usuwam tę średnią z całości. Nie jestem matematykiem, ale wydawało mi się, że to dobry sposób. Pomyślałem, że to zmieni żołądek prawdziwego matematyka, ale okazuje się, że jest to jeden z akceptowanych sposobów robienia tego. I działa dobrze. Pamiętaj tylko, że im większa długość, tym wolniej podążasz za tym, co chcesz obserwować. To może nie mieć większego znaczenia, ale gdy podążamy za satelitami, jeśli jesteś wolny, trasa może być daleko od aktualnej pozycji i będzie wyglądać źle. Możesz mieć przerwę między sob i końcowymi kropkami. Wybrałem długość 15 aktualizacji 6 razy na minutę, aby uzyskać odpowiednie wygładzenie i nie za bardzo oddalić się od faktycznej pozycji siedzącej z wygładzonymi kropkami. odpowiedziała 16 listopada 16 o 23:03 zainicjalizuj całość 0, count0 (za każdym razem, gdy zobaczysz nową wartość Następnie jedno wejście (scanf), jedno dodaj totalnewValue, jeden przyrost (count), jedna średnia dzieląca (totalcount) Byłaby to średnia ruchoma ponad wszystkie wejścia Aby obliczyć średnią tylko z ostatnich 4 wejść, wymagałyby 4 zmiennych wejściowych, być może skopiowania każdego wejścia do starszej zmiennej wejściowej, a następnie obliczenia nowej średniej ruchomej jako sumy 4 zmiennych wejściowych, podzielonej przez 4 (prawe przesunięcie 2 byłoby dobrze, jeśli wszystkie dane wejściowe były dodatnie, aby uzyskać średnią obliczoną odpowiedź 3 lutego 15 o 4:06 To faktycznie obliczyć całkowitą średnią, a NIE średnią ruchomą. Jak liczba staje się większa wpływ nowej próbki wejściowej staje się znikały małe ndash Hilmar lutego 3 15 at 13:53 Your Answer 2017 Stack Exchange, Inc

No comments:

Post a Comment