Thursday 15 June 2017

Einfach Gleitend Durchschnittlich Arduino


Eine der Hauptanwendungen für die Arduino-Platine ist das Lesen und Protokollieren von Sensordaten. Zum Beispiel überwacht man jeden zweiten Tag den Druck. Da hohe Abtastraten oft Spikes in den Graphen erzeugen, will man auch einen Durchschnitt der Messungen haben. Da die Messungen nicht zeitlich statisch sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Zeit und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchschnitts kann durch einen Code erfolgen, der auf dem vorherigen laufenden Durchschnitt aufbaut: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da das Speicher aufnimmt und die Geschwindigkeit verringert - kann man das gleiche vollständig in der Integer-Domäne ausführen. Die Teilung um 256 in dem Beispielcode ist ein Verschiebungsrecht 8, das schneller ist als die Teilung durch z. B. 100. Dies 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 es keinen Zwischenüberlauf gibt (wenn man unsigned long nennt) Wenn du brauchst Ein genauer laufender 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 Summe aller Elemente dividiert durch die Anzahl der Elemente im Array berechnet. Der Code für den laufenden Durchschnitt wird so etwas wie dieses sein: Nachteil dieses Codes ist, dass das Array, um alle Werte zu halten, ziemlich groß werden kann. Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie ein Array 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 hat. Durch den Aufbau eines 2-stufigen Durchschnitts kann man aber ganz gut angefahren werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, schreit dies als Klasse um. RunningAverage-Bibliothek Die runningAverage-Bibliothek macht eine Klasse der obigen Funktion, so dass sie in einer Skizze mehrfach verwendet werden kann. Es entkoppelt die add () und die avg () - Funktion, um ein bisschen flexibler zu sein, z. B. Man kann den Durchschnitt mehrfach anrufen, ohne eine Sache hinzuzufügen. Bitte beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen durchzuführen, und das fügt dem Speicherverbrauch hinzu. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei der Version 0.2 werden die Namen der Methoden alle beschreibender gemacht. Eine kleine Skizze zeigt, wie sie benutzt werden kann. Ein zufälliger Generator wird verwendet, um einen Sensor nachzuahmen. Im Setup () ist die myRA gelöscht, damit wir mit dem Hinzufügen neuer Daten beginnen können. In Schleife () wird zuerst eine Zufallszahl generiert und in einen Float umgewandelt, der zu myRA hinzugefügt werden soll. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD anzeigen oder über Ethernet versenden. Wenn 300 Artikel hinzugefügt werden, wird myRA gelöscht, um wieder von vorne anzufangen. Um die Bibliothek zu benutzen, mache ich einen Ordner in deiner SKETCHBOOKPATHlibaries mit dem Namen RunningAverage und lege den. h und. cpp dort. Geben Sie optional ein Beispiel-Unterverzeichnis an, um die Beispiel-App zu platzieren. 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Destruktor in. h Datei 2011-02-28: entfernter Standardbauer 2012--. TrimValue () Yuval Naveh hat TrimValue hinzugefügt (gefunden auf Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 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 hier beschrieben - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Test extensiv. Template-Klasse RunningAverage. h RunningAverage. cppThis ist eine Sammlung von Routinen für die Durchführung mathematischer Analyse von Arrays von Zahlen. Aktuelle Funktionsunterstützung: Alle Funktionen sind vollständig überlastet, um folgende Datentypen zu unterstützen: Mit Ausnahme von stddev () geben sie alle den gleichen Datentyp wie das Array zurück. Ein Array von int-Werten gibt eine einzelne int zurück. Stddev () gibt immer einen float zurück. Alle 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 () nimmt ein drittes Argument - den neuen Eintrag, der dem Array hinzugefügt werden soll. Rolling Average Format: durchschnittliches RollingAverage (Historyarray, Slicecount, Wert) Fügt dem Array Historyarray Wert hinzu, der alle Werte um einen Platz verschiebt. Der mittlere Mittelwert wird dann zurückgegeben. Format: Mittelwert (Array, Slicecount) Berechnet den mittleren Mittelwert der Werte im Array. Slicecount ist die Anzahl der Einträge im Array. Format: Mittelmodus (Array, Slicecount) Findet die häufigste Nummer im Array. Format: max maximum (array, slicecount) Findet den größten Wert im Array. Format: min Minimum (array, slicecount) Findet den kleinsten Wert im Array. Standardabweichung Format: Abweichung stddev (array, slicecount) Die Standardabweichung ist die Quadratwurzel des Mittelwerts der Summe der Quadrate der Differenz zwischen jedem Datenpunkt und dem mittleren Mittelwert des Arrays. Dies ist die einzige Funktion, die nicht denselben Datentyp wie das Array zurückgibt. Die Standardabweichung wird immer als Float zurückgegeben. Ich arbeite an einem mobilen Roboter, der über einen drahtlosen 2,4 GHz Link gesteuert wird. Der Empfänger ist mit dem Arduino Uno verbunden, der als Hauptregler an Bord dient. Der kritischste (und Haupt-) Eingangskanal des Empfängers erzeugt ein sehr lautes Signal, was zu vielen geringfügigen Änderungen der Leistung der Aktoren führt, auch wenn diese nicht benötigt werden. Ich suche Bibliotheken, die eine effiziente Glättung durchführen können. Gibt es irgendwelche Signal Glättung Bibliotheken für die Arduino (Uno) gefragt 16. Februar 14 um 13:57 Ich denke, ich sehe eine Menge von Single-Probe Rauschen Spikes in Ihrem lauten Signal. Der Median-Filter ist besser bei der Beseitigung von Single-Probe Rauschspitzen als jeder lineare Filter. (Es ist besser als irgendein Tiefpassfilter, gleitender Durchschnitt, gewichteter gleitender Durchschnitt usw. in Bezug auf seine Reaktionszeit und seine Fähigkeit, solche Einzelproben-Rauschspitzen-Ausreißer zu ignorieren). Es gibt in der Tat viele Signalglättungsbibliotheken für den Arduino, von denen viele einen Medianfilter enthalten. Signal-Glättungsbibliotheken bei arduino. cc: Signalglättungsbibliotheken bei github: Würde so etwas in deinem Roboter arbeiten (Der Median-of-3 erfordert sehr wenig CPU-Leistung und damit schnell): Du könntest diese digital mit einem Low filtern Pass-Filter: Ändern Sie die 0,99, um die Cut-Off-Frequenz zu ändern (näher bei 1,0 ist die niedrigere Frequenz). Der tatsächliche Ausdruck für diesen Wert ist exp (-2piffs) wobei f die Cutoff-Frequenz ist, die du willst und fs die Frequenz ist, die die Daten abgetastet werden. Eine andere Art von Digitalfilter ist ein Ereignisfilter. Es funktioniert gut auf Daten, die Ausreißer, z. B. 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 aus der Seite der Arduino-Bibliothek:

No comments:

Post a Comment