Monday 26 June 2017

Durchschnittlicher C Code Verschieben 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 Dies ist nicht so schnell beim Ändern 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. Beantwortet Okt 4 12 am 6: 08MOVING AVERAGE FILTER Es gibt viele verschiedene Arten von Filtern können Sie schreiben, und die Boxcar (oder gleitenden Durchschnitt, wie Sie es nannten) oder rechteckigen Filter ist nur eine von em. Hier ist ein Vergleich einer Vielzahl von Filtern, und die Art der Wirkung, die sie auf Ihre Daten haben können, als eine Funktion der Frequenz. Um einen einfachen gleitenden durchschnittlichen Filter zu machen, müssen Sie nur die Daten addieren, dann dividieren durch die Anzahl der Datenelemente. Wenn Sie alle Elemente addieren, jedes Mal wenn Sie den Durchschnitt berechnen, kostet es Sie n Zusätze plus eine Abteilung. Wenn Sie andererseits verfolgen, wo sich die ältesten Daten befinden, fügen Sie beim Fortschreiten der Daten nur die neuen Daten hinzu, subtrahieren Sie die ältesten Daten und wiederholen Sie die Teilung. Diese Methode kostet nur eine einzige Addition, eine einzelne Subtraktion und eine Division. Viel schneller. Ich schreibe nicht den Code für Sie. Ich hoffe, dies hilft, though. Home gtgt Inventory Accounting Themen Moving Average Inventory-Methode Gleitende durchschnittliche Inventory-Methode Überblick Unter der gleitenden durchschnittlichen Inventurmethode werden die durchschnittlichen Kosten für jedes Inventar Item auf Lager nach jedem Inventar Kauf neu berechnet. Dieses Verfahren tendiert dazu, Inventarwerte und die Kosten der verkauften Waren zu erbringen, die zwischen denjenigen liegen, die unter der ersten In-First-Out-Methode (FIFO-Methode) und der LIFO-Methode (LIFO-Methode) abgewickelt werden. Dieser Mittelungsansatz wird als ein sicherer und konservativer Ansatz für die Berichterstattung der finanziellen Ergebnisse betrachtet. Die Berechnung ist die Gesamtkosten der gekauften Artikel geteilt durch die Anzahl der Artikel auf Lager. Die Kosten für die Beendigung des Inventars und die Kosten der verkauften Waren sind dann auf diese Durchschnittskosten festgelegt. Es werden keine Kostenschichten benötigt, wie es für die FIFO - und LIFO-Methoden erforderlich ist. Da sich die gleitenden Durchschnittskosten bei jedem Neukauf ändern, kann die Methode nur mit einem Perpetual-Inventory-Tracking-System verwendet werden, so dass ein solches System die aktuellen Bestände von Bestandsguthaben aufbewahrt. Sie können die gleitende durchschnittliche Bestandsmethode nicht verwenden, wenn Sie nur ein periodisches Inventarsystem verwenden. Da ein solches System nur am Ende jedes Abrechnungszeitraums Informationen sammelt und keine Aufzeichnungen auf der Ebene der einzelnen Einheiten verwaltet. Auch wenn Inventarbewertungen mit Hilfe eines Computersystems abgeleitet werden, ist es durch den Computer relativ einfach, Bestandsbewertungen mit dieser Methode kontinuierlich anzupassen. Umgekehrt kann es sehr schwierig sein, die gleitende Durchschnittsmethode zu verwenden, wenn Inventurdatensätze manuell beibehalten werden, da das klerikale Personal durch das Volumen der erforderlichen Berechnungen überwältigt würde. Moving Average Inventory Methode Beispiel Beispiel 1. ABC International hat 1.000 grüne Widgets auf Lager am Anfang des April, zu einem Preis pro Einheit von 5. Damit ist die Anfangsbestände-Balance der grünen Widgets im April 5.000. ABC kauft dann 250 zusätzliche greeen Widgets am 10. April für 6 jeder (insgesamt Kauf von 1.500), und weitere 750 grüne Widgets am 20. April für 7 jeweils (insgesamt Kauf von 5.250). In Abwesenheit von Verkäufen bedeutet dies, dass die gleitenden Durchschnittskosten pro Einheit Ende April 5,88 betragen würden, was als Gesamtkosten von 11.750 (5.000 beginnend 1.500 Anschaffungen 5.250 Anschaffungen) berechnet wird, Hand-Einheit zählen 2.000 grüne Widgets (1.000 Anfang Gleichgewicht 250 Einheiten gekauft 750 Einheiten gekauft). Somit waren die gleitenden Durchschnittskosten der grünen Widgets 5 pro Einheit zu Beginn des Monats und 5,88 am Ende des Monats. Wir werden das Beispiel wiederholen, aber jetzt mehrere Verkäufe. Denken Sie daran, dass wir den gleitenden Durchschnitt nach jeder Transaktion neu berechnen. Beispiel 2. ABC International hat ab Anfang April 1.000 grüne Widgets auf Lager, zu einem Preis von 5 Stück. Sie verkauft am 5. April 250 dieser Einheiten und erhebt eine Gebühr für die Kosten der verkauften Waren von 1.250 Wird als 250 Einheiten x 5 pro Einheit berechnet. Dies bedeutet, dass es jetzt 750 Einheiten auf Lager, zu einem Kosten pro Einheit von 5 und einem Gesamtbetrag von 3.750 Einheiten. ABC kauft dann 250 zusätzliche grüne Widgets am 10. April für jeweils 6 (insgesamt Kauf von 1.500). Die gleitenden Durchschnittskosten liegen nun bei 5,25, was als Gesamtkosten von 5.250 geteilt durch die noch vorhandenen 1.000 Einheiten berechnet wird. ABC verkauft dann 200 Einheiten am 12. April und zeichnet eine Gebühr auf die Kosten der verkauften Waren von 1.050, die als 200 Einheiten x 5,25 pro Einheit berechnet wird. Dies bedeutet, dass es jetzt 800 Einheiten auf Lager, zu einem Kosten pro Einheit von 5,25 und einer Gesamtkosten von 4.200. Schließlich kauft ABC weitere 750 grüne Widgets am 20. April für je 7 (insgesamt Kauf von 5.250). Am Ende des Monats betragen die gleitenden Durchschnittskosten pro Einheit 6,10, die als Gesamtkosten von 4 200 5 250 berechnet werden, geteilt durch die insgesamt verbleibenden Einheiten von 800 750. Im zweiten Beispiel beginnt ABC International den Monat mit einer 5.000 Beginnend Balance der grünen Widgets zu einem Preis von 5 jeder verkauft 250 Einheiten zu einem Preis von 5 am 5. April, revidiert seine Stückkosten auf 5,25 nach einem Kauf am 10. April verkauft 200 Einheiten zu einem Preis von 5,25 am 12. April und Schließlich korrigiert seine Einheit Kosten auf 6,10 nach einem Kauf am 20. April. Sie können sehen, dass die Kosten pro Einheit ändert sich nach einem Inventar Kauf, aber nicht nach einem Inventar Verkauf. Wenn Sie den Durchschnitt von N Proben, einfach multiplizieren Sie den Durchschnitt mit N , Füge die neue Probe hinzu und dividiere 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 sites. google/site/or. Kleinstein Level: Posten Freak Registriert: 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 Beigetreten: Sa. Feb 12, 2005 Ort: Wormshill, England Geschrieben von david. prentice. Sonne. Jan 18, 2009 - 04:51 PM durchschnittlich insgesamt / Beispiele. 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 Registriert seit: Wed. Sep 21, 2005 Geschrieben von curtvm. Mon. Jan 19, 2009 - 04:40 AM (dies ist die gleiche / ähnlich 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 nehmen kontinuierliche (Interrupt-getriebene) Sampling aller verwendeten A / D Proben Speicherung der Rohwert in einem Array. Jede 10ms eine oder mehrere Konvertierungen wurden auf jedem Kanal durchgeführt. (Bei einer 57600 ADC Uhr, die 226us / Umwandlung mit ISR Overhead vielleicht 250Es so etwa 40 Konvertierungen alle 10ms.) Am 10ms Punkt füge ich den Rohwert, der die neueste Umwandlung Ergebnis zu einer Summe 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 1/2 oder 1/4 oder 1/8 Gewicht sein, empirisch bestimmt, was am besten in einem bestimmten Fall funktioniert. Unten ist Code von einer App, wo 1/2 war zu grob, und das Finale verwendet 1/16: 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 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-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, 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 vom init-moving-average zurückgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthält. 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, kann 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 Reihenfolge 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 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS 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 daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen ist ebenfalls kleiner, der korrekte Wert (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) .) Summiert sie sum (.) / (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern Verwenden eines Schließens und Erstellen einer Funktion


No comments:

Post a Comment