Moving Average Filter Arduino


Eine der Hauptanwendungen für das Arduino-Board 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 Mittelwert der Messungen haben. Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt. Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Die einfachste Form eines laufenden Durchmessers kann durch einen Code ausgeführt werden, der auf dem vorherigen laufenden Durchschnitt basiert: Wenn man keine Gleitkomma-Mathematik verwenden möchte - da dies Speicherplatz einnimmt und Geschwindigkeit verringert - kann man dies in der Integer-Domäne vollständig durchführen. Die Teilung durch 256 in dem Beispielcode ist ein Schiebe-Recht 8, das schneller ist als eine Teilung durch z. B. 100. Dies gilt für jede Potenz von 2 als Teiler und man muss nur darauf achten, dass die Summe der Gewichte gleich der Potenz von 2 ist. Und natürlich sollte man darauf achten, dass es keinen Zwischenüberlauf gibt (erwägen Sie unsigned long) Eine genauere laufende Durchschnitt, in concreto aus den letzten 10 Messungen, benötigen Sie ein Array (oder verkettete Liste), um sie zu halten. Diese Anordnung wirkt wie ein kreisförmiger Puffer und bei jeder neuen Messung wird die älteste entfernt. Der laufende Durchschnitt wird als die Summe aller Elemente geteilt durch die Anzahl der Elemente in dem Array berechnet. Der Code für den laufenden Durchschnitt wird etwa so aussehen: 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 durchschnittliches pro Stunde würde ein Array von 3600 benötigen. Das könnte nicht auf diese Weise auf einem Arduino getan werden, da es nur 2K RAM hat. Allerdings kann durch den Bau eines 2-stufigen Durchschnitts kann es ganz gut angegangen werden (Disclaimer: nicht für alle Messungen). Im psuedo-Code: Da für jede runningAverage-Funktion ein neues internes statisches Array benötigt wird, wird dieses als Klasse implementiert. RunningAverage-Bibliothek Die RunningAverage-Bibliothek bildet eine Klasse der oben genannten Funktion, so dass sie mehrfach in einer Skizze verwendet werden kann. Es entkoppelt die add () - und die avg () - Funktion, um ein wenig flexibler zu sein, z. B. Kann man den Durchschnitt mehrmals nennen, ohne eine Sache hinzuzufügen. Beachten Sie, dass jede Instanz der Klasse ein eigenes Array hinzufügt, um Messungen zu halten, und dass dies die Speicherauslastung addiert. Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Anmerkung: Bei Version 0.2 werden die Namen der Methoden beschreibender. Eine kleine Skizze zeigt, wie sie verwendet werden kann. Ein Zufallsgenerator wird verwendet, um einen Sensor nachzuahmen. In setup () wird der myRA gelöscht, so dass wir mit dem Hinzufügen neuer Daten beginnen können. In Schleife () wird zuerst eine Zufallszahl erzeugt und in einen Float umgewandelt, der myRA hinzugefügt wird. Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD-Display oder über ethernet etc. Wenn 300 Elemente hinzugefügt myRA ist gelöscht, um neu zu beginnen. Um die Bibliothek zu verwenden, machen Sie einen Ordner in Ihrem SKETCHBOOKPATHlibaries mit dem Namen RunningAverage und legen Sie die. h und. cpp dort. Fügen Sie optional ein Beispielunterverzeichnis hinzu, um die Beispielanwendung zu platzieren. 2011-01-30: Anfangsversion 2011-02-28: fester fehlender Zerstörer in der. h Akte 2011-02-28: entfernter Standardkonstruktor 2012--. TrimValue () Yuval Naveh hinzugefügt trimValue (gefunden im Web) 2012-11-21: refactored 2012-12-30: hinzugefügt fillValue () refactored für die Veröffentlichung 2014-07-03: hinzugefügt Speicherschutz-Code - wenn interne Array nicht zugeordnet werden kann Größe Wird 0. Dies ist, um das hier beschriebene Problem zu lösen - forum. arduino. cc/index. phptopic50473.msg1790086msg1790086 - Test ausführlich. Template-Klasse RunningAverage. h RunningAverage. cpp 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 Onboard als Hauptregler bedient. 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 das 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 entnommen: Arduino Tutorial: Einfache High-Pass, Bandpass und Band-Stop-Filter In diesem Beitrag zeigen wir Ihnen, wie Sie sehr einfache High-Pass implementieren. Bandpass - und Bandsperrfiltern auf einem Arduino. Es wird dringend empfohlen, dass Sie unseren vorherigen Beitrag über Potentiometer und EMA (Exponential Moving Average) - Filterung sowie den Plotter mehrerer Werte in der Arduino IDE lesen, bevor Sie fortfahren, da wir ähnliche Schaltkreise, Filtermethoden und Plotverfahren in diesem Tutorial verwenden. Wir verwenden ein einfaches Potentiometer und den ADC, um ein Signal zu erzeugen, das wir durch die Filter laufen lassen. Verschiedene Arten von Filtern. X-Achse ist Frequenz und Y-Achse ist 8220gain8221, die ist, wie viel Signal durchgelassen (oder manchmal sogar verstärkt) ist. (Quelle: Wikipedia) Hochpass-Filterung Hochpaß-Filterung ist das Gegenteil von Tiefpaß-Filterung. Anstatt ein Signal zu glätten, bleiben Sie mit dem ganzen Rauschen und schnellen Änderungen stehen. Wenn das ursprüngliche Signal um jeden stationären Wert stabilisiert wird, geht das Hochpass-Signal auf Null. 8230 ein Tiefpaßfilter und subtrahieren das Ergebnis vom ursprünglichen Signal. Es gibt problaby mehr richtige und effiziente Wege zur Umsetzung Hochpass-Filter, aber die Art, wie wir es tun möchten, ist es, ein Tiefpass-Filter laufen und subtrahieren das Ergebnis aus dem ursprünglichen Signal. So verlassen Sie nur die hohen Frequenzen des ursprünglichen Signals. Dies ist die Art und Weise, wie wir es auf einem Arduino Leonardo: Bandpass Filtering Stellen Sie sich vor, Sie haben ein hochpassgefiltertes Signal, das zu laut ist. Dann könnte ein Bandpassfilter für Sie sein. Ein bandpassgefiltertes Signal ist grundsätzlich ein glattes, hochpaßgefiltertes Signal. 8230 zwei getrennte EMA-Filter mit unterschiedlichen Grenzfrequenzen. Unsere Idee hinter der Implementierung eines Bandpassfilters besteht darin, dass wir zwei getrennte EMA-Filter mit unterschiedlichen Grenzfrequenzen betreiben. Dann subtrahieren wir das gefilterte Signal mit der niedrigsten Grenzfrequenz aus dem gefilterten Signal mit der höchsten Grenzfrequenz. Auf diese Weise verbleiben wir mit den Frequenzen zwischen den beiden Cutoff-Frequenzen, die beide entscheidend sind, um die gewünschte Leistung aus dem Filter zu erhalten. Es ist leicht, den Unterschied zwischen dem Hochpass-Signal (blau) und dem Bandpass-Signal (orange) zu sehen. Letzteres ist in der Praxis ein tiefpaßgefiltertes Hochpasssignal. Band-Stop-Filter Dies ist diejenige, die am schwierigsten sein könnte, um Ihren Kopf umwickeln. Dieser Filter ließ nur die niedrigsten und die höchsten Frequenzen durch. Das heisst, es unterscheidet sich einiges von dem Hochpass und dem Bandpass, da es immer wieder auf Null zurückkehrt, sondern stattdessen dem stetigen Wert des Signals folgt (wie ein Tiefpassfilter). Im Gegensatz zu einem Tiefpaßfilter enthält es jedoch auch hohe Frequenzen wie Rauschen und schnelle Änderungen. 8230 subtrahieren das bandpassgefilterte Signal von dem ursprünglichen Signal. Unsere Idee hinter dieser Implementierung ist es, das bandpassgefilterte Signal vom ursprünglichen Signal zu subtrahieren. Dies ist ein inverses Bandpaßfilter. Die beiden Grenzfrequenzen sind hier ebenso wichtig wie im Bandpassfilter. In dieser Grafik sehen Sie, dass bei niedrigen Frequenzen das bandgestoppte Signal (rot) sich wie das Tiefpass-Signal (orange) verhält, während es sich bei höheren Frequenzen eher wie das ursprüngliche Signal (blau) verhält. Ein interessantes Phänomen, bei dem das bandgestoppte Signal auf einer (nahen) Sprungantwort anfänglich dem ursprünglichen Signal folgt, bevor es nach einem Transienten sich wie das tiefpassierte Signal verhält. Das kleine Kapitel an der Unterseite Wie zuvor erwähnt, ist dies wahrscheinlich nicht das meiste Effiziente oder richtigste Art, diese Arten von Filtern zu implementieren. Allerdings, wenn Sie einige schnelle und schmutzige Filter-Implementierungen benötigen, können diese nicht zu schäbig sein. Denken Sie daran, dass die Verzögerung am unteren Rand der Schleifen in diesen Beispielen für die Plotrate und die Filtercharakteristika entscheidend ist. Probieren Sie es aus, spielen Sie mit den Cutoff-Frequenzen und viel Spaß

Comments