Sunday 4 June 2017

Exponential Moving Average Arduino

Dies ist eine Sammlung von Routinen für die Durchführung mathematischer Analysen von Arrays von Zahlen. Aktuelle Funktionsunterstützung: Alle Funktionen werden vollständig überlastet, um die folgenden Datentypen zu unterstützen: Mit Ausnahme von stddev () geben sie alle denselben Datentyp wie das Array zurück. Ein Array von int-Werten gibt ein einzelnes int zurück. Stddev () gibt immer einen float zurück. Alle Funktionen außer rollingAverage () nehmen zwei Argumente. Das erste ist das Array zu bearbeiten. 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: average rollingAverage (historyarray, slicecount, value) Fügt dem Array Historyarray einen Wert hinzu, der alle Werte um eine Stelle verschiebt. Der mittlere Mittelwert wird dann zurückgegeben. Format: average mean (array, slicecount) Berechnet den mittleren Mittelwert der Werte im Array. Slicecount ist die Anzahl der Einträge im Array. Format: average mode (array, slicecount) Findet die häufigste Zahl im Array. Format: max maximum (array, slicecount) Sucht den größten Wert im Array. Format: min minimum (array, slicecount) Sucht den kleinsten Wert im Array. Standardabweichung Format: Abweichung stddev (array, slicecount) Die Standardabweichung ist die Quadratwurzel des Mittelwertes 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 verrauschtes Signal, was zu vielen kleinen Änderungen am Ausgang der Aktoren führt, obwohl diese nicht benötigt werden. Ich suche Bibliotheken, die effiziente Glättung durchführen können. Gibt es ein Signal Glättung Bibliotheken zur Verfügung für die Arduino (Uno) Ich glaube, ich sehe eine Menge von Single-Sample Rauschspitzen in Ihrem lauten Signal. Der Medianfilter ist besser bei der Beseitigung von Einzelprobenrauschspitzen als bei jedem linearen Filter. (Es ist besser als jedes Tiefpaßfilter, gleitender Durchschnitt, gewichteter gleitender Durchschnitt usw. in Bezug auf seine Ansprechzeit 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. Signalglättungsbibliotheken bei arduino. cc: Signalglättungsbibliotheken bei github: Würde sowas in Deinem Roboter so funktionieren (Der Median-of-3 erfordert sehr wenig CPU-Leistung und damit schnell): Du könntest diese digital mit einem Tief filtern Filter: Ändern Sie die 0,99, um die Grenzfrequenz zu ändern (näher an 1,0 ist die niedrigere Frequenz). Der tatsächliche Ausdruck für diesen Wert ist exp (-2pif / fs) wobei f die Grenzfrequenz ist, die gewünscht wird und fs die Frequenz ist, an der die Daten abgetastet werden. Ein anderer Typ eines digitalen Filters 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 Hilfe der Arduino Average Library berechnet werden. Ein Beispiel aus der Arduino Library-Seite: Double Exponential Moving Average Filter 8211 Beschleunigung der EMA Manchmal haben Sie ein verrauschtes Signal, das Sie zu einem weniger verrauschten Signal tiefpassieren möchten. Der exponentielle Moving Average Filter (EMA) ist ein schöner und einfacher Filter für das eingebettete System. Lesen Sie hier mehr über den EMA-Filter. Allerdings kann manchmal die EMA zu langsam sein. Der Kompromiss zwischen Geräuschunterdrückung und Geschwindigkeit könnte einfach nicht gut genug sein. Entweder bewegt sich das gefilterte Signal nicht schnell genug oder das Signal ist zu laut. Dies ist kein sehr gutes Vergleichsbild zwischen EMA und DEMA. Wir wollten nur ein cooles Bild hier. Lesen Sie weiter unten für einen richtigen Vergleich 8230die DEMA ist untergedämpft, während die EMA überbeansprucht wird. Eine Lösung hierfür könnte der Double Exponential Moving Average (DEMA) Filter sein. Bei einer gegebenen der DEMA hat schnellere Reaktion als die EMA, während immer noch die Aufrechterhaltung der gleichen Rauschunterdrückung. Ein möglicher Nachteil beim DEMA-Filter besteht darin, dass Sie ein Überschwingen erhalten. Mit anderen Worten, die DEMA wird unterdrückt, während die EMA überbeansprucht wird. Schauen Sie sich diesen Beitrag an, um herauszufinden, was wir damit meinen. Der Algorithmus ist ziemlich direkt: Die heikelste Sache hier ist das letzte Wort, wo Sie die EMA der EMA. Um dies zu erreichen, müssen wir zwei globale Variablen anstelle von einem haben. Implementierung Hierbei handelt es sich um eine schnelle Implementierung des DEMA-Filters auf Arduino. Beachten Sie, dass wir zwei globale Variablen für die Filterung anstelle von eins verwenden. Blaue Linie: ursprüngliches Signal, orange Linie: reguläre EMA, rote Linie: DEMA. Wie Sie hier sehen können, gelingt es der DEMA, dem Originalsignal besser ohne Lärm zu folgen. Beachten Sie auch das Überschwingen bei der Sprungantwort. Das Kapitel an der Unterseite Die DEMA wurde im Seesaw-Projekt mit positiven Ergebnissen nach dem Schreiben des letzten Blogposts getestet. Dies ist ein Szenario, in dem wir die hohe Geschwindigkeit benötigen, die die DEMA bereitstellen kann. Es gibt auch etwas, das als Triple Exponential Moving Average (TEMA) bezeichnet wird. Dieser Filter verwendet die gleichen Prinzipien wie DEMA, aber nehmen sie noch weiter. In Verbindung stehende Artikel


No comments:

Post a Comment