Saturday 9 December 2017

Ruchome średnie okrągłe bufora


Wiem, że jest to osiągalne z boost jak per. But naprawdę chciałbym uniknąć przyśpieszenia mam googled i nie znalazłem żadnych odpowiednich lub czytelnych przykładów. Zasłalnie 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ąć. Jestem eksperymentował z wykorzystaniem okrągłej tablicy, wykładniczej średniej ruchomej i bardziej prostej średniej ruchomej i stwierdził, że wyniki z okrągłej tablicy odpowiadały moim potrzebom najlepiej. zaked 12 czerwca 12 w 4 38. Jeśli Twoje potrzeby są proste, możesz spróbować użyć wykładniczej średniej ruchomej. Wystarczy, że zmienisz akumulator, a kod wygląda na każdą próbkę, kod aktualizuje akumulator z nowa wartość Wybierasz stałą wartość alfa, która wynosi od 0 do 1, i oblicz ją. Wystarczy, że znajdzie się wartość alfa, gdzie efekt danej próbki trwa tylko około 1000 próbek. Hmm, nie jestem pewien, czy to jest nadaje się dla ciebie, teraz t kapelusz I've put it here Problem polega na tym, że 1000 jest dość długie okno dla wykładniczej średniej ruchomej Nie jestem pewien, że istnieje alfa, który rozprzestrzeniałby średnią w ciągu ostatnich 1000 numerów, bez underflow w obliczeń zmiennoprzecinkowych Ale jeśli chciał mniejsze średnie, jak 30 numerów lub tak, jest to bardzo łatwy i szybki sposób to zrobić. jak 12 czerwca 12 w 4 44. 1 na swoim punkcie Mnożona średnia ruchoma może pozwolić alpha na zmienną Więc pozwala to do obliczania średniej podstawy czasu, np. bajtów na sekundę Jeśli czas od ostatniej aktualizacji akumulatora przekracza 1 sekundę, oznacza to, że alfa wynosi 1 0. W przeciwnym razie możesz zezwolić usłudze alpha jako ostatnią aktualizacją 1000000 jxh cze 12 12 w 6 21.Taktycznie chcę śledzić średnią ruchową ciągłego strumienia strumienia liczb zmiennoprzecinkowych przy użyciu najnowszych 1000 numerów jako próbki danych. Zauważ, że poniżej uaktualnia całkowite jako elementy dodawane zastępując, unikając kosztownego przechodzenia ON w celu obliczenia suma - potrzebna na th e średnia - na żądanie. Wszystko jest wykonane z innego parametru od T do wsparcia, np. przy długiej długości, gdy wynosi 1000 długich s, int dla char s lub podwójne do całkowitego float s. This jest nieco błędem, że numsamples could przejść przez INTMAX - jeśli zależy Ci na długie długie unsigned lub użyć dodatkowych danych bool członka do rejestrowania, gdy pojemnik jest po raz pierwszy wypełnione podczas cyklicznego numsamples wokół tablicy najlepiej, a następnie zmienić nazwę na coś nieszkodliwego jak pos. answered Jun 12 12 at 5 19.net przyjmuje założenie, że próbka operatora pustego T jest faktycznie nieważnym operatorem T próbka oPless 08 czerwca 14 w 11 52. oPhim ahhh dobrze spotted faktycznie miałem na to być nieważne operatora T próbki, ale oczywiście można użyć dowolnej notatce lubisz Naprawić, dzięki Tony D Jun 8 14 w 14 27. Naukowiec i inżynier Inżynier ds. cyfrowego przetwarzania sygnału Steven W Smith, Ph. D. Rozdział 28 Cyfrowe procesory sygnałowe. Digital Signal Procesory są zaprojektowane do szybkiego wykonywania filtrów FIR i podobnych technik Aby zrozumieć hardwar e najpierw musimy zrozumieć algorytmy W tej części zamieszczamy szczegółową listę kroków niezbędnych do wdrożenia filtru FIR W następnej sekcji zobaczymy, jak DSP są zaprojektowane tak, aby jak najskuteczniej wykonać te kroki. Na początek potrzebujemy odróżnić przetwarzanie off-line i przetwarzanie w czasie rzeczywistym W przetwarzaniu poza sieciowym cały sygnał wejściowy znajduje się w tym samym czasie na komputerze Na przykład geofizyk może używać sejsmometru do rejestrowania ruchu ziemi podczas trzęsienia ziemi Po trzęsieniu ziemi jest zakończona, informacje mogą być odczytywane do komputera i analizowane w inny sposób Innym przykładem przetwarzania off-line jest obrazowanie medyczne, takie jak tomografia komputerowa i MRI Zestaw danych jest pobierany, gdy pacjent znajduje się wewnątrz maszyny, ale rekonstrukcja obrazu może być opóźniony do późniejszego czasu Kluczowym punktem jest to, że wszystkie informacje są jednocześnie dostępne dla programu przetwarzania Jest to powszechne w badaniach naukowych i inżynierii, ale nie w produkty konsumenckie Przetwarzanie off-line to dziedzina komputerów osobistych i mainframeów. W przetwarzaniu w czasie rzeczywistym sygnał wyjściowy jest wytwarzany w tym samym czasie, w którym pobiera się sygnał wejściowy Na przykład jest to konieczne w komunikacji telefonicznej, aparatach słuchowych, i radar Te aplikacje muszą mieć natychmiast dostępną informację, chociaż może zostać opóźniona przez krótką kwotę Na przykład nie można wykryć 10 milisekundowego opóźnienia w rozmowie telefonicznej przez głośnik lub słuchacza Podobnie nie ma różnicy, jeśli sygnał radaru jest opóźnione o kilka sekund przed wyświetleniem do operatora Aplikacje w czasie rzeczywistym wprowadzają próbkę, wykonują algorytm i wyprowadzają próbkę, over-and-over Alternatywnie, mogą wprowadzać grupy. of próbek, wykonać algorytm i grupa próbek Jest to świat cyfrowych procesorów sygnałów. Teraz spójrzmy na rys. 28-2 i wyobraźmy sobie, że jest to filtr FIR, który jest realizowany w czasie rzeczywistym Aby obliczyć próbkę wyjściową, musimy ha dostaję dostęp do pewnej liczby najnowszych próbek z wejścia Przykładowo, załóżmy, że używamy w filtrze 8 współczynników a 0 a 1 a 7 Oznacza to, że musimy znać wartość ośmiu ostatnich próbek z sygnału wejściowego, xn, xn -1, xn -7 Te osiem próbek musi być przechowywane w pamięci i stale aktualizowane w miarę pobierania nowych próbek Jaki jest najlepszy sposób na przechowywanie przechowywanych próbek Odpowiedź brzmi okrągłym buforowaniem. Ilustracja 28-3 ilustruje ośmiokątną okrągłą próbkę bufor Budujemy ten okrągły bufor w ośmiu kolejnych miejscach pamięci, 2004-1 do 20048 Rysunek a pokazuje, jak osiem próbek z wejściowego mogłoby być przechowywane w określonej chwili w czasie, a b pokazuje zmiany po kolejnej próbce bufora kołowego jest to, że koniec tej liniowej tablicy jest podłączony do jego początkowej pamięci 20041 jest postrzegana jako obok 20048, podobnie jak 20044 jest obok 20045 Możesz śledzić tablicę za pomocą wskaźnika zmienną o wartości i s adres wskazujący, gdzie znajduje się najnowsza próbka Na przykład w indeksie zawiera adres 20044, podczas gdy w b zawiera 20045 Po otrzymaniu nowej próbki zastępuje ona najstarszą próbkę w tablicy, a wskaźnik jest przenoszony jeden adres przed Sprzęgła okrągłe są skuteczne, ponieważ tylko jedna wartość musi zostać zmieniona, gdy zostanie pobrana nowa próbka. Każdy parametr jest potrzebny do zarządzania okrągłym buforem Najpierw musi być wskaźnik wskazujący początek okrągłego buforu w pamięci na przykład 20041 Po drugie, musi być wskazówka wskazująca koniec tablicy np. 20048 lub zmienna, która ma długość np. 8 Po trzecie, należy podać wielkość kroku adresowania pamięci na rys. 28-3 rozmiar kroku jest równy na przykład adres 20043 zawiera jedną próbkę, adres 20044 zawiera następną próbkę i tak dalej Często nie jest to przypadek Na przykład adresowanie może dotyczyć bajtów, a każda próbka może wymagać dwóch lub czterech bajtów, aby utrzymać wartość I W tych przypadkach rozmiar kroku musiałby wynosić odpowiednio dwa lub cztery. Te trzy wartości określają rozmiar i konfigurację okrągłego bufora i nie ulegną zmianie podczas działania programu. Czwarta wartość, wskaźnik do ostatniej próbki, musi zostać zmodyfikowana w miarę nabywania nowej nowej próbki Innymi słowy, musi istnieć logika programu, która kontroluje, jak ta czwarta wartość jest aktualizowana w oparciu o wartość trzech pierwszych wartości Chociaż ta logika jest dość prosta, musi być bardzo szybka Jest to cały punkt tej dyskusji DSP należy zoptymalizować przy zarządzaniu buforami kołowymi, aby osiągnąć możliwie najwyższą szybkość wykonywania. Na marginesie, buforowanie okrągłe jest również przydatne w przetwarzaniu off-line Rozpatruj program, w którym zarówno sygnały wejściowe, jak i wyjściowe są całkowicie zawarte pamięć Nie wymaga buforowania okrągłego, aby obliczyć convolution, ponieważ każda próbka może być natychmiast dostępna Ale wiele algorytmów są realizowane w etapach z pośrednim sygnałem be utworzony między każdym etapem Na przykład rekurencyjny filtr przeprowadzony w wyniku działania biquadów w ten sposób Metoda brutalnej siły polega na przechowywaniu całej długości każdego pośredniego sygnału w pamięci Buffer bufora okrągłego zapewnia inną opcję przechowywania tylko tych pośrednich próbek potrzebnych do obliczenia pod ręką To zmniejsza wymaganą ilość pamięci kosztem bardziej skomplikowanego algorytmu Ważnym założeniem jest to, że bufory kołowe są użyteczne w przetwarzaniu off-line, ale są kluczowe dla aplikacji w czasie rzeczywistym. Teraz możemy spojrzeć na kroki potrzebne do wdrożenia filtru FIR z użyciem bufora kołowego zarówno dla sygnału wejściowego, jak i współczynników Lista ta może wydawać się trywialna i nadmierna - nie jest to Skuteczna obróbka tych pojedynczych zadań polega na oddzieleniu DSP od tradycyjnego mikroprocesora Dla każdej nowej próbki wszystkie należy podjąć następujące kroki. Celem jest szybki wykonywanie tych kroków. Powtarzaj kroki 6-12 kilka razy jeden raz dla każdego współczynnik filtru, należy zwrócić szczególną uwagę na te operacje Tradycyjne mikroprocesory muszą na ogół wykonywać te 14 kroków szeregowo jeden za drugim, podczas gdy DSP są zaprojektowane do ich wykonywania równolegle W niektórych przypadkach wszystkie operacje w krokach pętli 6 -12 można wykonać w jednym cyklu zegara Spójrzmy na architekturę wewnętrzną, która pozwala na to wspaniałe osiągi. Jednym z głównych zastosowań płyty Arduino jest odczytywanie i rejestrowanie danych czujników. Na przykład jeden monitoruje ciśnienie co sekundę w ciągu dnia wysokie odsetki próbek często generują skoki na wykresach również chce mieć średnią z pomiarów Ponieważ 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 bieżącej może być dokonana przez kod, który opiera się na poprzedniej średniej. Jeśli nie chcesz używać matematyki zmiennoprzecinkowej - jako t s zajmuje pamięć i zmniejsza prędkość - można to zrobić całkowicie w domenie całkowitej Podział 256 w przykładowym kodzie jest przesunięciem prawej 8, czyli szybszym niż powiedzenie podziału przez np. 100 Jest to prawda dla każdej mocy 2 jako rozdzielacz i jeden tylko musi dbać o sumę weights jest równa mocy 2 I oczywiście należy zadbać o to, aby nie było przepełnienia pośredniego za pomocą długiego bez znaku. Jeśli potrzebujesz dokładniejszej średniej, w concreto z ostatnich 10 pomiarów, potrzebna jest tablica lub lista powiązana, aby je utrzymać Tablica ta działa jak okrągły bufor, a każdy nowy pomiar najstarszy jest usuwany Średnia średnia jest obliczana 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 jest to, że tablica do przechowywania wszystkich wartości może stać się całkiem duża Jeśli masz jeden pomiar na sekundę i chcesz średnią na minutę potrzebujesz tablicy 60 a średnia na godzinę potrzebuje tablicy 3600 To nie może być zrobione w ten sposób na Arduino, ponieważ ma tylko 2K pamięci RAM Jednak przy budowie 2 etapowej średniej może być zbliżył się całkiem dobrze zrzec się nie dla wszystkich pomiarów W psuedo code. As a nowa wewnętrzna tablica statyczna jest potrzebna dla każdej funkcji RunningAverage, to screamy mają być implementowane jako biblioteka class. RunningAverage. Biblioteka RunningAverage sprawia, że ​​klasa funkcji jest powyżej, dzięki czemu może być użyta wielokrotnie w szkicu. Decouples dodaje i średnią funkcja jest nieco bardziej elastyczna, np. można dzwonić średnio wiele razy bez dodawania rzeczy Należy pamiętać, że każda instancja klasy dodaje własną tablicę do przechowywania pomiarów, a to zwiększa zużycie pamięci Interfejs klasy jest przechowywane tak małe, jak to możliwe. Zauważ z wersją 0 2 nazwy metod są wszystkie bardziej opisowe. Mały szkic pokazuje, jak może być używany losowo Generator losowy jest używany do naśladowania czujnika. W ustawieniach myra jest wyczyszczona tak w e może rozpocząć dodawanie nowych danych. In pętli pierwsze losowe liczby są generowane i konwertowane do float, który ma być dodany do myRA Następnie uruchomiony napój jest drukowany do portu szeregowego można też wyświetlić go na niektórych LCD lub wysłać przez ethernet itp. Gdy 300 pozycji są dodawane myRA jest czyszczone, aby zacząć od nowa. Aby skorzystać z biblioteki, utworzyć folder w bibliotekach SKETCHBOOKPATH z nazwą RunningAverage i umieścić h i tam Opcjonalnie tworzyć przykładowe podkatalogu, aby umieścić próbkę app.2017-01-30 wersji początkowej .2017-02-28 utrwalony destruktor brakujący w pliku h.2017.02-28 usunięty konstruktor domyślny 2017- - trimValue Yuval Naveh dodał trimValue znaleziony na stronie web.2017-11-21 refactored 2017-12-30 dodano fillValue refactored for publishing.2017-07-03 dodany kod ochrony pamięci - jeśli wewnętrzna tablica nie może zostać przydzielona rozmiar staje się 0 To jest rozwiązanie problemu opisanego tutaj. Test szeroko rozliczne. Template class. RunningAverage h. RunningAverage.

No comments:

Post a Comment