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.
Wie groß ist der Meßbereich? In der Kurve stehen Werte größer 33E3 also vermutlich >= 16Bit, dann ist +-50 nicht besonders viel.
@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. ein Kalman-Filter verwenden?
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 ;-)
Hier mal ein paar Musterdaten: https://dl.dropboxusercontent.com/u/13720935/beispieldaten9t509g9sdgihjotega.csv Das Ergebnis zum Schluss sollte in etwa 12x +65,-65 sein
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.