Forum: Digitale Signalverarbeitung / DSP / Machine Learning Benötige Dynamisches Filter um Sprünge in Messwerte zu erfassen


von muhkuhµc (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

für ein kleines Projekt versuche ich nun schon seit einiger Zeit aus 
meinen unzähligen Messwerten die markanten Stellen automatisch 
herauszufiltern.

Leider ist das Rauschen des Sensors sehr hoch und wird noch durch alle 
möglichen Umwelteinflüsse verstärkt. Dennoch lässt sich mein Ziel, wenn 
auch ungenauer als ursprünglich erhofft, prinzipiell erreichen.

Wichtig ist dafür aber die Höhe der Sprünge möglichst präzise 
automatisch aus den Messwerten herauszufiltern. Das Problem ist, dass 
der "Sprung" mal nur einen mal aber auch 10 Messwerte dauert.. und auch 
die Dauer variiert. Die Höhe sowieso quasi beliebig... Zum Beispiel kann 
es einen Sprung von 5000 auf 5050 in einer Viertelsekunde von einem zum 
nächsten Messwert geben (Messintervall 250ms). Dann 2 Sekunden also 8 
Messwerte später einer von 5050 auf 5150 aber verteilt auf 3 Messwerte 
und der erste Sprung wieder zurück erst eine Stunde später und dann 
nicht in einem sondern über 2 Messwerten von 5180 auf 5130 +/- erfolgen.


Ich bin für jegliche Ideen oder Verweise offen, vielen Dank schon mal im 
voraus!

von J. S. (engineer) Benutzerseite


Lesenswert?

Du brauchst ein FIR-Tiefpassfilter mit justiertem Integral/Periode, 
welches das Rauschen beseitigt und dann ein Hochpassfilter für die 
Sprünge.

Dann brauchst Du ein diskretes Filter, welches ab einem gewissen Abstand 
einen gesuchten Sprung ermittelt - also eine Art Komparator mit 
Hysterese.

Einfach auf die Schnelle aufgrund der optischen Interpretation Deines 
Beispiels:

- 8 Werte mitteln, dabei die mittleren stärker
- im Abstand von 8 Datenpunkten die Werte vergleichen und die quadrierte 
Differenz ausplotten

Das ergibt eine Kurve, die in der Mitte der Steigung einen Hochpunkt 
hat.

von Vonbis (Gast)


Lesenswert?

Wie groß ist der Meßbereich?

In der Kurve stehen Werte größer 33E3 also vermutlich >= 16Bit, dann ist 
+-50 nicht besonders viel.

von muhkuhµc (Gast)


Lesenswert?

@Vonbis: Die absoluten Werte liegen zwischen 2E6 und 4E6. Für das 
Rauschen siehe Anhang.
Sprünge die erkannt werden sollen liegen so zwischen 20 und ~4000. 
Messauflösung 3.

Ich dachte daran, irgendwie dynamisch die Steigung zu ermitteln um über 
den Gradienten herauszufinden ab wann ein neuer gleitender Mittelwert 
beginnt. Aber bei den vielen Variationsmöglichkeiten müsste ich ja eine 
Menge verschiedener Gradienten berechnen, da der erste Sprung ja z.B. 
nur über einen Messwert ist der darauf aber übere mehrere.. Habe 
wirklich gar keine Ahnung von Filtern^^

@Jürgen: Vielen Dank! Ich werde dem ganzen mal nachgehen, klingt 
zunächst jedoch noch etwas starr. Am liebsten würde ich das ganze in 
Excel an den Messreihen probieren. Es stünde aber auch Matlab zur 
Verfügung oder die Möglichkeit das ganze direkt in C zu programmieren.

von muhkuhµc (Gast)


Lesenswert?

..der vergessene Anhang. Auch wenn er nicht wirklich viel weiterhelfen 
wird.
Y: Abweichung
X: Absolute Häufigkeit der Abweichung. (Aus 9600 Messwerten im 
Ruhezustand die Differenz zum jeweils vorherigen)

von muhkuhµc (Gast)


Angehängte Dateien:

Lesenswert?

nc.

von Vonbis (Gast)


Lesenswert?

muhkuhµc schrieb:
> @Vonbis: Die absoluten Werte liegen zwischen 2E6 und 4E6. Für das
> Rauschen siehe Anhang.
> Sprünge die erkannt werden sollen liegen so zwischen 20 und ~4000.
> Messauflösung 3.

Also 2000/4, liegt das innerhalb der Toleranz des Sensors? Zeig mal das 
Datenblat des Sensors.

von muhkuhµc (Gast)


Lesenswert?

@Vonbis: Bei 2000/4 kann ich nicht ganz folgen - wie kommt das zustande 
und was genau ist damit gemeint?

Die Auflösung des Sensors liegt bei 3,6. Die absoluten Toleranzen im 
benötigtem Temperaturbereich nur bei +/- 10000, was für die Messwerte 
und deren Deutung jedoch keine Rolle spielt.

von Vonbis (Gast)


Lesenswert?

muhkuhµc schrieb:
> @Vonbis: Bei 2000/4 kann ich nicht ganz folgen - wie kommt das zustande
> und was genau ist damit gemeint

2E6/4E6 = 2000/4 = 500 => 0.2%

Und welcher Sensor ist das nun? Und wie ist der beschaltet?

von muhkuhuc (Gast)


Lesenswert?

Kann noch immer nicht folgen.
Sensor: http://www.meas-spec.com/product/pressure/MS5803-05BA.aspx

von Gerd E. (robberknight)


Lesenswert?

Evtl. ein Kalman-Filter verwenden?

von Arne (Gast)


Lesenswert?

Evtl. hilft dir die Wavelettransformation weiter. Damit kannst du dein 
Signal in mehrere Spektralbereich aufteilen und den für das Rauschen 
verantwortliche ausblenden.

Ein Beispiel für die Anwendung ist hier zu sehen:
https://de.mathworks.com/help/wavelet/ref/cmddenoise.html

Fals  Matlab abschreckt, es gibt auch C++-Libs, die die 
Wavelettransformation beherschen oder GNU Octave ;-)

von muhkuhµc (Gast)


Lesenswert?

Hier mal ein paar Musterdaten: 
https://dl.dropboxusercontent.com/u/13720935/beispieldaten9t509g9sdgihjotega.csv

Das Ergebnis zum Schluss sollte in etwa 12x +65,-65 sein

von Falk S. (db8fs)


Angehängte Dateien:

Lesenswert?

Ich hab mal deine Meßreihe durch 'nen 1D-Kalman gejagt und dir mal im 
Anhang das Ergebnis beigelegt. Die Varianz des Sensors hatte ich hierfür 
mit 5 belegt, die Varianz der Prädiktion mit 1. Der Algorithmus arbeitet 
ganzzahlig mit long-Werten. Zum Entrauschen deiner Datensätze scheint 
der Filter recht gut geeignet. Die 1D-Variante davon ist im Netz sehr 
gut dokumentiert - daher verzichte ich auf fertige Sourcecodes.

von muhkuhµc (Gast)


Lesenswert?

Falk S. schrieb:
> 1D-Kalman gejagt und dir mal im
> Anhang das Ergebnis beigelegt.

Vielen Dank dafür! Habe jetzt mal beides spontan etwas miteinander 
verglichen....

Im Hinblick auf das anschließende herauskristallisieren der einzelnen 
Sprungwerte per Algorithmus:

+ Bei Anstieg/Abstieg wirklich nur Anstieg/Abstieg (also bei einem 
positivem Sprung keine negative Steigung während des Anstieges) => 
Vorzeichenwechsel könnte bei Algorithmus berücksichtigt werden

von Falk S. (db8fs)


Lesenswert?

muhkuhµc schrieb:
> Im Hinblick auf das anschließende herauskristallisieren der einzelnen
> Sprungwerte per Algorithmus:
>
> + Bei Anstieg/Abstieg wirklich nur Anstieg/Abstieg (also bei einem
> positivem Sprung keine negative Steigung während des Anstieges) =>
> Vorzeichenwechsel könnte bei Algorithmus berücksichtigt werden

Dimensionierst Du deinen Filter groß genug, fliegt dein Rauschen 
weitgehend raus und das Signal wird halbwegs stabil. Vielleicht kannst 
Du Dir die Schritte danach durch eine geschickte Auswahl der Varianz 
hier schon noch weiter erleichtern.

Und ich weiß nicht, ob Du Dir 'nen Gefallen tust, da mit Vorzeichen 
herumzuhantieren. Sich auf die Gradientenänderung zu verlassen, denke 
ich wäre nicht von Vorteil - mach lieber 'ne Statistik und entscheide 
anhand davon.

An Deiner Stelle würde ich nach der Filterung als erstes den Vorschlag 
von Jürgen S. ausprobieren und eine adaptive Threshold-Operation 
(Schwellenwert) versuchen (bist du über dem Mittelwert der gefilterten 
Werte: High, ansonsten Low).

Wäre im Endeffekt ein einfacher binärer Klassifikator, der das leisten 
könnte, was Du bräuchtest.

von J. S. (engineer) Benutzerseite


Lesenswert?

muhkuhµc schrieb:
> @Jürgen: Vielen Dank! Ich werde dem ganzen mal nachgehen, klingt
> zunächst jedoch noch etwas starr.

Nö. Ist autoadaptiv, da Du die Parameter ja selber bestimmen und dem 
Problem anpassen kannst. Das kann permanent geschehen. Das kann sogar 
mit mehreren Annahmen gleichzeitig passieren und parallel gerechnet 
werden mit einer Entscheidung post calculation.

von Lukas K. (carrotindustries)


Lesenswert?

Wenn du die Samples, die einen Sprung enthalten isoliert hast, kannst du 
von diesen ein Histogramm erstellen und darin nach den zwei Maxima 
suchen.

Siehe dazu auch:
http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=744309
http://de.mathworks.com/help/signal/ref/statelevels.html

von Falk S. (db8fs)


Angehängte Dateien:

Lesenswert?

Ne andere Idee, die man zur Klassifikation auch machen kann, ist 'ne 
Regression auf den kalmanisierten Werten (nachdem der sich 
eingeschwungen hat).

Wenn sich die Werte z.B. wie in dem gefilterten Datensatz verhalten, 
würde u.U. eine einfache lineare Regression reichen. Alles was über der 
Gerade liegt, wäre logisch 'High', alles drunter: 'Low'. Veranschaulicht 
siehe Anhang.

Schwieriger wird das allerdings, wenn der Sensor während seiner 
Betriebszeit mit den Werten auch wieder 'nach unten' kippen kann. Dann 
sind SVMs besser geeignet, aber auch etwas teurer, als einfach bei jedem 
Sample den Anstieg der linearen Regressionsfunktion aufzuakkumulieren 
und zu vergleichen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.