Jak wspomnieli inni, należy rozważyć filtr IIR (nieskończona odpowiedź impulsowa) zamiast filtru FIR (skończona odpowiedź impulsowa), którego teraz używasz. 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. Jaka jest korzyść z średniej kroczącej AveragesSimple średniej ruchomej AveragesSimple Zachęcamy do rozwiązania tego zadania zgodnie z opisem zadania, przy użyciu dowolnego znanego języka. Obliczanie prostej średniej kroczącej z serii liczb. Utwórz stateful functionclassinstance, która pobiera kropkę i zwraca procedurę, która przyjmuje liczbę jako argument i zwraca prostą średnią ruchomych argumentów. Prosta średnia ruchoma to metoda obliczania średniej strumienia liczb przez uśrednienie tylko ostatnich 160 liczb P 160 ze strumienia, 160 gdzie 160 P 160 jest znane jako okres. Można go wdrożyć, wywołując procedurę inicjującą z 160 P 160 jako argumentem 160 I (P), 160, który powinien następnie zwrócić procedurę, która po wywołaniu z indywidualnymi, kolejnymi członkami strumienia liczb, oblicza średnią (w górę). do), ostatnie 160 P 160 z nich, pozwala wywołać to 160 SMA (). Słowo 160 stanowe 160 w opisie zadania odnosi się do potrzeby 160 SMA () 160, aby zapamiętać pewne informacje między wywołaniami do niego: 160 Okres, 160 P 160 Zamówiony pojemnik z co najmniej ostatnich 160 numerów P 160 z każdego z nich. jego indywidualne połączenia. Stateful 160 oznacza również, że kolejne wywołania do 160 I (), 160 inicjalizatora, 160 powinny zwracać oddzielne podprogramy, które mają 160 zapisany stan 160 akcji, aby mogły być użyte na dwóch niezależnych strumieniach danych. Pseudo-kod dla implementacji 160 SMA 160 to: Ta wersja używa trwałej kolejki do przechowywania najnowszych wartości p. Każda funkcja zwrócona przez init-moving-average ma swój stan w atomie utrzymującym wartość kolejki. Ta implementacja używa okrągłej listy do przechowywania liczb w oknie na początku każdego wskaźnika iteracji odnosi się do komórki listy, która przechowuje wartość właśnie wyprowadzającą się poza okno i do zastąpienia przez wartość dodaną. Używanie edycji zamknięcia Obecnie ta wartość nie może być równa nogc, ponieważ alokuje zamknięcie na stercie. Niektóre analizy ucieczki mogą usunąć przydział sterty. Używanie edycji Struct Ta wersja unika alokacji sterty zamknięcia, zachowując dane w ramce stosu głównej funkcji. Ten sam wynik: aby uniknąć przybliżania się liczby zmiennoprzecinkowej i rosnąć, kod mógłby wykonywać okresową sumę na całej okrągłej tablicy kolejek. Ta implementacja generuje dwa (funkcjonalne) obiekty udostępniające stan. W E jest idiomatyczne oddzielanie danych wejściowych od danych wyjściowych (odczyt z zapisu) zamiast łączenia ich w jeden obiekt. Struktura jest taka sama jak implementacja Standard DeviationE. Poniższy program eliksiru generuje anonimową funkcję z osadzonym okresem p, który jest używany jako okres prostej średniej kroczącej. Funkcja run odczytuje dane numeryczne i przekazuje je do nowo utworzonej funkcji anonimowej, a następnie sprawdza wynik do STDOUT. Dane wyjściowe przedstawiono poniżej, przy średniej, a następnie w ujęciu grupowym, stanowiącym podstawę dla każdej średniej ruchomej. Erlang ma zamknięcia, ale zmienne niezmienne. Rozwiązaniem jest wówczas wykorzystanie procesów i prostego API opartego na przekazywaniu komunikatów. Języki macierzy mają rutyny do obliczania szybujących średnich dla danej sekwencji przedmiotów. Pętla jest mniej wydajna niż w poniższych poleceniach. Ciągle monituje o wejście I. który jest dodawany na końcu listy L1. L1 można znaleźć naciskając 2ND1, a średnie można znaleźć w ListOPS Naciśnij ON, aby zakończyć program. Funkcja, która zwraca listę zawierającą uśrednione dane dostarczonego argumentu Program, który zwraca prostą wartość przy każdym wywołaniu: lista jest uśredniana dla listy: p jest okresem: 5 zwraca uśrednioną listę: Przykład 2: Używanie programu movinav2 (i , 5) - Inicjalizacja obliczeń średniej ruchomej i zdefiniowanie okresu 5 movinav2 (3, x): x - nowe dane na liście (wartość 3), a wynik zostanie zapisany na zmiennej x i wyświetlony movinav2 (4, x) : x - nowe dane (wartość 4), a nowy wynik zostanie zapisany na zmiennej x i wyświetlony (43) 2. Opis funkcji movinavg: zmienna r - jest wynikiem (uśredniona lista), która będzie zwracaną zmienną i - jest zmienną indeksową, i wskazuje na koniec listy podrzędnej, której lista jest uśredniana. zmienna z - zmienna pomocnicza Funkcja wykorzystuje zmienną i do ustalenia, które wartości z listy będą brane pod uwagę przy następnych obliczeniach średnich. Przy każdej iteracji zmienna i wskazuje na ostatnią wartość na liście, która będzie używana w obliczeniach średnich. Dlatego musimy tylko ustalić, która będzie pierwszą wartością na liście. Zwykle trzeba wziąć pod uwagę elementy p, więc pierwszym elementem będzie ten indeksowany przez (i-p1). Jednak w pierwszych iteracjach obliczenia będą zazwyczaj ujemne, więc poniższe równanie pozwoli uniknąć indeksów ujemnych: max (i-p1,1) lub, ustawiając równanie, max (i-p, 0) 1. Ale liczba elementów w pierwszych iteracjach również będzie mniejsza, poprawna wartość będzie (indeks końcowy - początek indeksu 1) lub, ustalenie równania, (i - (max (ip, 0) 1) 1), a następnie , (i-max (ip, 0)). Zmienna z zawiera wspólną wartość (max (ip), 0), więc beginindex będzie (z1), a liczbafelementów będzie (iz) mid (lista, z1, iz) zwróci listę wartości, która będzie uśrednioną sumą ( .) zsumuje ich sumę (.) (iz) ri je uśredni i zapisze wynik w odpowiednim miejscu na liście wyników fp1 tworzy częściową aplikację naprawiającą (w tym przypadku) drugie i trzecie parametry wbudowane Engineering In. pokażę ci, jak zaimplementować najprostszy możliwy filtr dziesiętny filtrujący średnią wartość. choć jest to bardzo łatwe do wdrożenia, ale nadal w wielu aplikacjach jest to więcej niż wystarczająco dobre. na przykład zmniejszenie losowego szumu z sygnału. Oczywiście, gdy jest to bardzo proste, nie ma problemów, takich jak. nie ma bardzo ostrego filtra Odpowiedź. Wejście kanału 1. zamiatanie od 20Hz do 6Khz, Channel 4 (Green) 15 punktowe filtrowane wyjście, M (Red) wyjście w domenie freq Sobota, 1 października 2018 Ten projekt jest końcowym etapem w tworzeniu naprawdę potężnego światła słonecznego. w tym projekcie wyślemy LTC3478 Oparty na philipsie zestaw kontrolera ładowania Li-Ion ze sterownikiem Driver i BQ24650 na MPPT Solar. Będziemy zużywać łącznie 3 9 Watt na każdą kartę LED Driver i jeden kontroler ładowania, aby ładować baterię 6 komórek 7.6V 20000 mAh li-lion. Jest tam 4 wskaźnik diodowy LED pokazujący szacowany poziom naładowania baterii i jeden przycisk do kontroli Onoff, Different Level Jasności. i wybierz jedną. wszystkie lub kilka tablic LED do rozświetlenia. nie ma wiele do opisania pod względem schmeatic i firmware, jak wszystkie Firmware i Schmeatic aer już na moim koncie github. Interfejs panelu Panelu wykonany jest z PCB z 4 diodami LED statusu baterii, portem do panelu słonecznego Złącze i przełącznikiem sterującym. kiedy bateria jest naładowana Status diody LED wyświetla się odpowiednio, a gdy bateria się rozładowuje, status diody odpowiednio się zmienia. Oprócz małego projektu oświetlenia słonecznego, nad którym pracowałem, stworzyłem ten mały regulator ładowania słonecznego, aby ładować baterię litowo-jonową (litowo-jonową). Circuit Wykorzystaj Texas Instrument BQ24650 w sercu pętli do sterowania ładowaniem. ponieważ obwód ma zewnętrzny mosfet, więc maksymalny prąd ładowania może być dostosowany do naprawdę wysokich wartości. 160Circuit akceptuje wartości paneli słonecznych od 5V do 28V. testowałem go z napięciem 12V (otwarty obwód 17V) 160. i napięciem nominalnym 24 V przy zasilaniu bateryjnym prąd do 4A. Aktualnie instalowany w moim domu od kilku miesięcy Ładowanie baterii o pojemności 20000 mah. Obwód ma dużą 4-pinową wtyczkę Molex o dużej wydajności dla panelu słonecznego. 6-stykowe złącze baterii i przełącznika obciążenia. Możliwe jest również podłączenie NTC do monitorowania temperatury baterii. BQ24650 może automatycznie monitorować tem - peraturę akumulatora. Mikrokontroler ma dedykowane wyjście 3 PWM do ściemniania LED i 6 pinów gpio dla informacji o stanie bettery i klucz interfejsu użytkownika. Hallo zu Deutsch Leser. Das ist mein erste Artikel auf Deutsch. Jestem w stanie wydać opinię o tym, kto jest zainteresowany Jetzt ab, ich werde auf auf Deutsch publijeren weil ich Detusch lerne und ich mchte mehr bungen. Jedes Artikel wird auf Deutsch und English. wenn wir Widerspruch zwischen dem Artikel auf Deutsch und Englisch haben, die English berwiegt weil meine erfahrungen auf deutsch kurze ist.160 160 160 160So beginnen wir. Heutzutage arbeite ich einem Projekt. quotMPPT Solar Li-ion Laderquot. bei diesem projekt brauche ich eine160sehr160vollmacht 25W LED leicht. aber 25W ist viel fur ein160LED-Triber. Es erforden viele kentnisse ein 25 W LED-Triber zu entwerfen. Hauptsorge auf die Projket quotMPPT Solar - lon Laderquot ist zu Lernen wie der MPPT Larder Arbeitet und wie die software Algorithmus sind. Das Projekt ist ein von ein Projekt was publiziere ich spter.160 160 160 160 Reticently pracowałem nad projektem 160little Solar lighting , potrzebuję naprawdę jasnego, szalonego oświetlenia 25W 160LED. Ale problem był dla 25W to dużo energii dla LED i to wymaga pewnych umiejętności, aby stworzyć taki sterownik LED o wysokiej mocy. Głównym celem tego projektu jest uzyskanie wiedzy na temat kontrolerów ładowania MPPT i algorytmów ładowania MPPT. ten projekt jest częścią projektu. które opublikuję później. 160160160 Ten post będzie czwartą częścią z serii tworzenia płyty ARM z obsługą Linuxa w domu. kliknij Pierwszy. Drugi i trzeci, aby przejść do poprzednich części, więc zacznijmy. co to jest bootloader, dlaczego go potrzebujemy160 program ładujący jest programem, który jest pierwszym, który zostanie wykonany przez procesor. to zrywa jakiś bardzo specyficzny cel przytaczając kilka bardzo istotnych rzeczy przed załadowaniem głównego programu (może być OS) do głównej pamięci. dlatego jest nazywany programem ładującym. w zależności od potrzeb program ładujący może wykonać inne zadanie (omówimy je tutaj). istnieją różne kształty i rozmiary bootloaderów. wszystkie służą niemal temu samemu celowi. z mikrokontrolerami. czasami nie ładuje głównego programu do pamięci, ale przekazuje wskaźnik wykonawczy do programu głównego, tak aby główny program mógł działać bezpośrednio z pamięci, gdzie jest. Płytka z 4,3-calowym ekranem LCD z uruchomioną aplikacją Qt5 do wyświetlania obrazu JPEG i czasu
CARA MEMBUAT ROBOT FOREX EA SENDIRI Pengertian Forex Robot Apa sebenarnya pengertian dari forex robot ini Forex Robot atau biasa disebut Expert Advisors (EA) program adalah sebuah komputer yang dirancang dla rynku handlu walutami secara otomatis. Forex robot bisa melakukan otwórz transaksi dan zamknij transaksi secara mandiri tanpa campur tangan manusia. Dirancang z algorytmem yang i dan hanya wsparcie dla platformy handlu tertentu, platforma yang blown banyak digunakan yaitu Meta Trader 4. MQL4 adalah bahasa pemrograman yang terdapat pada platforma MetaTrader 4. MQL4 ini bling umum digunakan dla membuat Expert Advisor (EA), niestandardowy wskaźnik, dan Script. Expert Advisor EA, seperti yang sudah kita ketahui, program adalah dla mengotomasi trading anda berdasarkan logika2 dan paramater2 tertentu. Indywidualny wskaźnik, hampir sama seperti EA, cuma tidak bisa melakukan trading. Dan dapat menggunakan function2 indicator. Skrypt, sama seperti EA, hanya saja dilakukan hanya 1x saat scri...
Comments
Post a Comment