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!
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.
@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.
..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)
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.
@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.
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?
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 ;-)
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.
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
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.
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.
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.