Moving Average C Code Avr
Ich habe wenige laufende Mittelung techs für das Glätten der Änderung in ADC-Daten in AtMega48 zum Steuern von Leuchten (PWM) beim Drehen eines Topfes (ADC) versucht. Die Filter (Pseudocodes): Ich bemerkte, dass die Filter sehr schön sind. Aber langsam in Reaktion, die erwartet wird. Ich suche nach einem Techniken wie Exponential gleitenden Durchschnitt. Reagiert werden soll. Gibt es eine andere wie diese Wie es heißt: Wo ist zwischen 0 und 1. Wie Code und Optimierung dieser Code klug (ohne Floats) Oder Wie würde ich die Floats in entsprechende ganze Zahlen für die Herstellung von kleinen, schnellen und reaktionsschnellen Code konvertieren. Und ich hielt 1 Andere dann, dass es nicht wie erwartet funktioniert. Weil Idve alle Variablen zu Float ändern. Bitte konzentrieren Sie sich nicht auf folgende Aussage vorerst, sondern beachten Sie. Halten Floats in meinem Code-Basis ist das Ausfüllen der Programmspeicher von 45 bis 137, im Falle von Sie können mit minimalem Overhead durch Begrenzung auf binäre Brüche implementieren. Ich habe dies mit guten Ergebnissen verwendet. Nehmen Sie das bestehende Ergebnis, Shift it N Orten rechts zu teilen durch 2N Subtrahieren Sie es aus dem bestehenden Ergebnis. Neue Daten hinzufügen Das ist nicht so schnell beim Wechsel mit einer Stufenänderung der Eingangsdaten, wie Sie es wünschen, ist aber in vielen Fällen einfach zu implementieren und effektiv genug als Filter. Sie können ihre Reaktion beschleunigen, indem sie informelle Entscheidungen über sein Verhalten in Fällen, die zu unterschiedlich sind. B. eine Anzahl von sequentiellen Eingängen beibehalten, die mehr als eine Grenze sind, die sich von dem existierenden Ergebnis unterscheidet. Wenn dieser Zählwert einen Schwellenwert überschreitet, dann das N-Teilungsverhältnis um einen Faktor ändern. ZB N ist in der Regel 4- Ergebnisse werden rechts verschoben 4 mal 16 teilen. Wenn Eingang mehr als xxx weg von der Antwort ist, tun Sie nur zwei Verschiebungen nach rechts und multiplizieren Sie neue Probe durch 4, bevor Sie addieren. Wenn Sie den Durchschnitt von N Proben haben, multiplizieren Sie einfach den Durchschnitt mit N, fügen Sie die neue Probe hinzu, und teilen Sie durch N1. Das bekommt Sie nicht einen gleitenden Durchschnitt. Sie müssen bereit sein, 150 Proben zu speichern. Dann, wenn Sie eine neue Probe erhalten, multiplizieren Sie den Durchschnitt mit 150, subtrahieren Sie die ältesten, fügen Sie die neueste und dividieren durch 150. Legen Sie die neueste in den 150-dimensionierten Puffer und entfernen Sie die älteste. Es gibt andere Systeme, die NAverage halten, die die Multiplikationen ein wenig reduziert. Jim Wagner Oregon Research Electronics, Unternehmensberatung Div. Tangent, OR, USA oderelectronics Kleinstein Level: Posting Freak Dabei seit: Sa. Sep 22, 2007 Posted by Kleinstein. Sonne. Es gibt keine Möglichkeit um das Speichern der letzten N (ca. 150) Proben, wenn nötig die realen gleitenden Durchschnitt für jede Position. 150 Samles sollten immer noch in den RAM passen. Sie können die Multiplikationen jedoch speichern. Füge die neue Probe hinzu und subtrahiere die letzte, die fallen gelassen wird. Dann teilen Sie die Summe durch N für das Ergebnis und halten Sie die Summe für den nächsten Schritt. Devision wird viel einfacher, wenn Sie 128 Proben verwenden können. Level: 10k Briefträger angemeldet: Sa. Feb 12, 2005 Ort: Wormshill, England Geschrieben von david. prentice. Sonne. Jan 18, 2009 - 04:51 PM durchschnittliche Gesamtproben. Newaverage (total new) (Beispiele 1) Wenn Sie sich Sorgen wegen der Meldung eines gültigen Durchschnitts machen, bis die Anzahl der Proben 150 beträgt, verzögern Sie den Bericht nur, bis er gültig ist. 16000 Proben von regulären Ints wird leicht in eine lange Gesamtmenge passen. Sie teilen sich, wenn Sie aufgefordert werden, den Durchschnittswert zu melden. Alternativ berechnen Sie den Durchschnitt und setzen Ihre Summe alle 150 Samples zurück. Sie melden diesen Durchschnitt bis zur nächsten Berechnung. Ein bisschen wie die Geschwindigkeit auf meinem Fahrrad-Computer. Das Vorderrad muss mehr als eine Umdrehung ausführen, bevor die Geschwindigkeit berechnet werden kann. Curtvm Level: Raving Lunatic Dabei seit: Wed. Sep 21, 2005 Geschrieben von curtvm. Mon. Jan 19, 2009 - 04:40 AM (das ist samesimilar zu Kleinsteins Idee). Level: 10k Briefträger Beigetreten: Mo. Feb 19, 2001 Ort: Wisconsin USA Geschrieben von theusch. Mon. Jan 19, 2009 - 02:58 PM Durch die Art der Beschreibung, Rolling Durchschnitt über eine große Anzahl von Proben, ist das Signal langsam. Wenn ich meine Apps verallgemeinern musste, ist es typisch, die Schleife alle 500ms zu schließen. Ich habe die ADC die kontinuierliche (unterbrechungsgesteuerte) Probenahme aller verwendeten AD Proben, die den Rohwert in einem Array speichern. Jede 10ms eine oder mehrere Konvertierungen wurden auf jedem Kanal durchgeführt. (Bei einer 57600 ADC-Uhr, die 226usconversion mit ISR Overhead vielleicht 250us so etwa 40 Konvertierungen alle 10ms.) Am 10ms Punkt füge ich den Rohwert, der die neueste Conversion-Ergebnis für eine insgesamt für jeden Kanal. Alle 500ms wird der Durchschnitt zum Schließen der App-Schleife verwendet. Dies funktioniert bei langsam laufenden Signalen wie Thermistoren, Stromaufnahme und Steuerspannungen gut. Der Summendurchschnitt nimmt eine Menge von dem Rauschen und Lesungen sind typischerweise steinig. (Es gab eine Menge von Threads über beobachtete Bobble in ADC Messwerte.) Beachten Sie, dass die Verwendung der Summe anstatt der Durchschnitt bewahrt ein paar mehr niedrige Bits, aber Heck - sogar ein langsam bewegendes Signal könnte beginnen, in einem Segment zu ändern Dass 500ms so was ist der Punkt Nun, schneller bewegte Signale oder diejenigen, die eine schnellere Reaktion benötigen einen anderen Ansatz. Eine gemeinsame Situation für mich ist die Überwachung der Roh-DC für eingehende Verlustleistung. Dieses Signal kann gut roh gleichgerichtet AC und haben eine Menge Kräuselung. Oder es kann andere Faktoren, die es gyrate machen könnte. In diesen Fällen mache ich ein einfaches Mittelungsschema wie Kleinstein, wobei die neue Probe ein Gewicht hat, um den vorherigen Wert zu ändern. Nein, kein echter Rollendurchschnitt, da alle Proben nicht beibehalten werden. Für die Leistungsüberwachung kann die neue Probe 12 oder 14 oder 18 Gewicht sein, empirisch bestimmt, was am besten in einem bestimmten Fall funktioniert. Unten ist Code aus einer App, wo 12 war zu grob, und die endgültige verwendet 116: Sie können Lippenstift auf ein Schwein, aber es ist immer noch ein Schwein. Ive traf nie ein Schwein, das ich nicht mag, solange Sie etwas Salz und Pfeffer haben. Durchschnittliche gleitende durchschnittliche Durchschnittswerte Einfacher gleitender Durchschnitt Sie werden angeregt, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, unter Verwendung jeder möglicher Sprache, die Sie kennen können. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktionclassinstanz, die eine Periode annimmt und eine Routine zurückgibt, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160-Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Abfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND1 gefunden werden, und Mittelwert kann in ListOPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Index-Variable, und es zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so dass die folgende Gleichung negative Indizes vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen wird ebenfalls kleiner sein, der korrekte Wert ist (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Wird summe sie sum (.) (Iz) ri wird sie durchschnittlich und speichern Sie das Ergebnis an der entsprechenden Stelle in der Ergebnisliste Verwenden eines Schließens und Erstellen einer Funktion
Comments
Post a Comment