DSP (1) Glättung von Signalen

Inhalt

  • Digitale Signalverarbeitung (Mittelwertfilter) zur Glättung von Sensorwerten
  • Ringbuffer zur Implementierung eines Mittelwertfilters

Vorraussetzung

Einführung

Bei Messungen mit analogen Sensoren sind die Ergebnisse oft verrauscht, d.h. sie weichen sie weichen zueinander leicht ab.

Beispiel: eine saubere Wertefolge mit langsam ansteigenden Werten

15,15,15,15,15,15,16,16,16,16,16,16,17,17,17,17,17,17,17

Beispiel: eine verrauschte Wertefolge mit langsam ansteigenden Werten

15,14,17,14,15,16,17,18,14,16,17,15,16,17,18,16,19,17,18

Im Durchschnitt ist das saubere und das verrauschte Signal fast gleich, allerdings ist dies beim verrauschten Signal viel schlechter zu erkennen. Leider hat man in der Realität fast immer mit rauschhaften Signalen zu tun. Es werden daher Methoden benötigt, wie das Rauschen aus dem Signal gefiltert werden kann.

Im Gebiet der Digitalen Signalverarbeitung (Digital Signal Processing – DSP), bei der Wertefolgen auf digitalen Prozessoren verarbeitet werden, gibt es eine Reihe von Methoden um rauschhafte Signale zu verbessern.

Mittelwertfilterung (Running Average)

Eine einfache Methode, um ein verrauschtes Signal zu glätten ist eine Mittelwertfilterung. Dabei wird aus den letzten Messergebnissen der Durchschnitt gebildet und dieser Durchschnitt als der aktuelle Messwert angesehen.

Um eine bestimmte Anzahl von Messwerten abzuspeichern werden wir zunächst einen Ringbuffer mit einem Array erstellen. In einem Ringbuffer wird ein neuer Messwert immer an den nächsten Arrayindex geschrieben (der Wert an dieser Stelle ist der älteste im Array und wird überschrieben). Erreicht man das Ende des Arrays wird der Index wieder auf Null gesetzt und man fängt wieder am Anfang zu zählen an.

Für die Durchschnittsberechnung werden alle Werte des Arrays aufsummiert und anschließend durch die Anzahl der Werte dividiert.

Der berechnete Durchschnittswert über den zeitlichen Verlauf hin wesentlich ruhiger. Ein Nachteil dieses Filters ist, dass er relativ träge ist. Das bedeutet, schnelle Änderungen wirken sich aufgrund der Durchschnittberechnung nur relativ langsam auf das Endergebnis aus.

Beispiel 1: Running Average in Arduino

Für dieses Beispiel ist ein Aufbau mit einem LDR, wie im Abschnitt Sensoren (1) gezeigt, notwendig. Das Beispiel zeigt, wie mit Hilfe eines Ringbuffers ein Running-Average einer Messung gebildet werden kann. Die Ausgabe ist der aktuelle, tatsächliche Messwert sowie der Durchschnittswert über die letzten Messungen.

Code-Analyse

Anfangs wird das Array sensorValues mit einer vorher festgelegten Größe ( arraySize ) erstellt.

In setup wird das Array zunächst einmal mit einem Messwert voll beschrieben, damit die erste Durchschnittsberechnung den gemessenen Werten sehr ähnlich ist.

In loop wird zunächst die Messung vorgenommen und an den aktuellen Index des Array sensorValues  geschrieben. Über den Aufruf der Funktion getAverage(), die weiter unten definiert ist, wird der Mittelwert der im Array vorhandenen Werte berechnet.

Anschließend wird der gemessene Wert und der Mittelwert über die serielle Konsole ausgegeben.

Nun wird noch die Index-Variable erhöht, damit bei der nächsten Messung die folgende Stelle im Array beschrieben wird. Für den Fall, dass wir das Ende des Arrays erreicht haben, fangen wir wieder bei Null an.

Die Ausgabe

Klar erkennbar ist, dass die Messwerte im Durchschnitt ungefähr gleich bleiben, während die tatsächlich gemessenen Werte teilweise erheblich voneinander abweichen.

Zusammenfassung

Analoge Messwerte sind sehr oft von Rauschen betroffen. Mittels digitaler Signalverarbeitung kann das Rauschen vermindert werden. Eine Methode hierfür ist die Mittelwertfilterung (Running Average). Diese speichert eine Reihe von Messwerten und bildet anschließend daraus den Durchschnitt. Eine Möglichkeit einen Mitterlwertfilter zu implementieren ist der Ringbuffer.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.