Friday 17 November 2017

Gewichtet Gleitend Durchschnittlich Arduino


Eine der Hauptanwendungen für die Arduino-Platine ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, möchte man auch einen Durchschnitt der Messungen haben Nicht statisch in der Zeit, was wir oft brauchen, ist ein laufender Durchschnitt Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Simplest Form eines laufenden Durchschnitts kann durch Code, der auf dem vorherigen laufenden Durchschnitt aufbaut. Wenn man doesn Ich möchte Floating-Point-Mathematik verwenden - da das Speicher aufnimmt und die Geschwindigkeit verringert - man kann das gleiche vollständig in der Integer-Domain machen Die Division von 256 im Sample-Code ist ein Shift-Right 8, was schneller ist, als zB Division zu zählen 100 Das gilt für jede Macht von 2 als Teiler und man muss nur darauf achten, dass die Summe der Witterungen gleich der Kraft von 2 ist. Und natürlich sollte man darauf achten, dass kein Zwischenüberlauf mit unsigned long. If y gilt Ou brauchen einen genaueren laufenden Durchschnitt, in concreto von den letzten 10 Messungen, benötigen Sie ein Array oder verknüpfte Liste, um sie zu halten Dieses Array fungiert als kreisförmiger Puffer und bei jeder neuen Messung wird der älteste entfernt. Der laufende Durchschnitt wird als der berechnet Summe aller Elemente geteilt durch die Anzahl der Elemente in der Array Der Code für den laufenden Durchschnitt wird so etwas wie dies sein. Drawback dieses Codes ist, dass das Array, um alle Werte zu halten kann ziemlich groß werden Wenn Sie eine Messung pro Sekunde und Sie haben Ich möchte einen laufenden Durchschnitt pro Minute, die Sie benötigen eine Reihe von 60 ein Durchschnitt pro Stunde würde ein Array von 3600 Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM Aber durch den Aufbau eines 2-Bühnen-Durchschnitt kann es angefahren werden Ganz gut Haftungsausschluss nicht für alle Messungen In psuedo code. As ein neues internes statisches Array wird für jede runningAverage Funktion benötigt, diese schreit, um als class. RunningAverage Bibliothek implementiert zu werden. Die runningAverage Bibliothek macht eine Klasse Der Funktion oben, so kann es mehrfach in einer Skizze verwendet werden Es entkoppelt die add und die avg-Funktion, um ein bisschen flexibler zu sein, zB kann man den Durchschnitt mehrfach anrufen, ohne eine Sache hinzuzufügen. Bitte beachten Sie, dass jede Instanz der Klasse ihre Eigenes Array, um Messungen zu halten, und das fügt dem Speicherverbrauch hinzu Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Hinweis mit Version 0 2 Die Namen der Methoden werden alle beschreibender gemacht. Eine kleine Skizze zeigt, wie es kann Verwendet werden Ein zufälliger Generator wird verwendet, um einen Sensor zu imitieren. In Setup ist die myRA gelöscht, so dass wir beginnen können, neue Daten hinzuzufügen. In der Schleife wird zuerst eine Zufallszahl generiert und in einen Float umgewandelt, um zu myRA hinzugefügt zu werden. Dann wird das runningAverage gedruckt Der serielle Port Man könnte es auch auf einem LCD anzeigen oder über Ethernet versenden. Wenn 300 Items hinzugefügt werden, wird myRA gelöscht, um wieder von vorne zu beginnen. Um die Bibliothek zu benutzen, mache ich einen Ordner in deiner SKETCHBOOKPATH libaries mit dem Namen RunningAverage und setze den h und Dort opt Ionally machen ein Beispiel-Unterverzeichnis, um die Probe zu platzieren app.2011-01-30 initial version.2011-02-28 fester fehlender destruktor in h file.2011-02-28 entfernt default constructor.2012- - trimValue Yuval Naveh hat TrimValue gefunden Web.2012-11-21 refactored.2012-12-30 hinzugefügt fillValue refactored für publishing.2014-07-03 hinzugefügt Memory-Schutz-Code - wenn interne Array nicht zugeordnet werden kann Größe wird 0 Dies ist zu lösen Problem beschrieben hier. Test extensiv. Template class. RunningAverage h. RunningAverage. Ich arbeite an einem mobilen Roboter, der über einen drahtlosen 2-4-GHz-Empfänger gesteuert wird, ist mit dem Arduino Uno verbunden, der als Hauptregler an Bord dient. Der kritischste und wichtigste Eingangskanal, der vom Empfänger kommt, erzeugt sehr Lautes Signal, das zu vielen kleineren Änderungen in der Ausgabe der Aktoren führt, obwohl diese nicht benötigt werden. Ich suche Bibliotheken, die eine effiziente Glättung durchführen können. Gibt es irgendwelche Signalglättungsbibliotheken, die für den Arduino Uno. asked verfügbar sind 14 bei 13 57. Ich denke, ich sehe eine Menge von Single-Probe Rauschen Spikes in Ihrem lauten Signal. Der Median-Filter macht es besser, loszuwerden Single-Probe Rauschspitzen als jeder lineare Filter Es ist besser als jeder Tiefpass-Filter, bewegt Durchschnittlichen, gewichteten gleitenden Durchschnitt, etc. in Bezug auf seine Reaktionszeit und seine Fähigkeit, solche Single-Probe Rauschen Spike Ausreißer zu ignorieren. Es gibt in der Tat viele Signal-Glättung Bibliotheken für die Arduino, von denen viele ein Median-Filter. Signal enthalten - Geschäftsbibliotheken an. Signal-Glättungsbibliotheken bei github. Would etwas wie diese Arbeit in deinem Roboter Der Median-of-3 erfordert sehr wenig CPU-Leistung und damit schnell. Sie können diese digital mit einem Tiefpassfilter filtern. Wählen Sie die 0 99, um die Cut-Off-Frequenz näher zu 1 0 zu ändern ist die niedrigere Frequenz Der tatsächliche Ausdruck für diesen Wert ist exp -2 pi f fs wobei f die Cutoff-Frequenz ist, die gewünscht wird und fs die Frequenz ist, in der die Daten abgetastet werden Filter ist ein Event-Filter Es funktioniert gut auf Daten, die Hat Ausreißer zB 9,9,8,10,9,25,9 Ein Ereignisfilter gibt den häufigsten Wert zurück Statistisch ist dies der Modus. Statistische Mittelwerte wie Mean, Mode etc. können mit der Arduino Average Library berechnet werden. Ein Beispiel genommen Von der Arduino-Bibliothek Seite erwähnt. Dies ist eine Sammlung von Routinen für die Durchführung der mathematischen Analyse von Arrays von Zahlen. Current Funktion Unterstützung. Alle Funktionen sind vollständig überlastet, um die folgenden Datentypen zu unterstützen. Mit Ausnahme von stddev sie alle wieder das gleiche Datentyp als Array Ein Array von int-Werten gibt ein einzelnes int stddev zurückgibt immer einen float. All die Funktionen außer rollingAverage nehmen zwei Argumente Das erste ist das Array zu arbeiten Die zweite ist die Anzahl der Einträge im Array rollingAverage dauert ein Drittel Argument - der neue Eintrag, der dem Array hinzugefügt wird. Rolling average. Format durchschnittlich rollingAverage historyarray, slicecount, value. Adds Wert auf das Array historyarray Verschiebung aller Werte nach einem Ort Der mittlere Durchschnitt ist t Henne zurückgegeben. Format durchschnittliche mittlere Array, slicecount. Calculates der durchschnittliche Durchschnitt der Werte in Array Slicecount ist die Anzahl der Einträge in der array. Format durchschnittliche Modus-Array, slicecount. Finds die häufigste Zahl in der array. Format max maximale Array, Slicecount. Finds der größte Wert in der array. Format min Minimum Array, slicecount. Finds der kleinste Wert in der array. Standard Deviation. Format Abweichung stddev Array, slicecount. The Standardabweichung ist die Quadratwurzel der Mittelwert der Summe der Quadrate der Differenz zwischen jedem Datenpunkt und dem Array Mittelwertmittel. Dies ist die einzige Funktion, die nicht den gleichen Datentyp wie das Array zurückgibt. Die Standardabweichung wird immer als Float zurückgegeben.

No comments:

Post a Comment