Vielleicht hatte jemand schon einmal etwas ähnliches gemacht und hat ein paar Ideen zu einer sinnvollen Umsetzung in Programmcode. Ein ähnliches wie das abgebildete Signal wird über Tage, Wochen oder Monate eingelesen (I2C Sensor an einem Microcontroller). Es stellen sich immer wieder gleichbleibende Level ein, dann kommt eine Störung über mehrere Minuten oder Stunden und danach stellt sich ein neuer Level ein (mal höher, mal niedriger). Was ich benötige ist ein Algorithmus, der die Hübe auf ein anderes Level erfasst und ganz simpel addiert. Die Störungen sollen ignoriert werden. Ich habe bereits einen gleitenden Mittelwert integriert um das normale Rauschen etwas zu filtern. Eine grobe Idee würde mir reichen (Pseudocode quasi). Ich weiß nur leider nicht wie ich am geschicktesten erfasse, dass eine Störung im Signal vorliegt und wann ich von einem neuen Level ausgehen kann. Ich hoffe ihr habt in etwa verstanden was ich meine :-)
:
Bearbeitet durch User
Mir ist noch nicht klar, was der Output sein soll? Die Werte der Plateaus? ein ein "geschlossenes" Signal, ohne die Störungen...? Woran unterscheiden sich die Störungen von dem Signal? Was ist der Erwartete Wertebereich des Signals. Was wird da überhaupt gemessen :)?
Ich benötige den Wert des aktuellen Plateaus (gemittelt) und des letzten um den Hub zu ermitteln. Über die Zeit soll der gesamte Hub ermittelt werden. Die Werte liegen zwischen 0 und 1023. Die Störung bewirkt eine Änderung des Signals und versetzt es auf ein anderes Niveau.
was ist dir denn über die Störungen bekannt? wie lange dauern die an? wie groß ist der Unterschied zu dem Signal? Ist das immer so eine deutliche Flanke nach unten? verarbeitest du das komplette Signal auf einmal, oder soll das adHoc mitlaufen? Mein erster Ansatz, sähe in etwa so aus: Mit einem Ausreichend breitem Filter glätten, wahrscheinlich am besten mit einem Gaußkernel. dann einen Kantenfilter, bei dem man ein wenig mit der Länge spielt. Der Kantenfilter sollte dann an den Übergängen große, positive oder negative Ausschläge geben. Anhand der Richtung kann man sehen, ob es nach unten oder oben geht und so zwischen Störung und Normalfall unterscheiden. Zusätzlich könnten man noch zur Plausibilisierung zwischen jeweils 2 solchen Ausschlägen in den Orginaldaten Mittelwert und Sigma berechnen. Für die Plateaus sollte sich ein ziemlich geringes Sigma ergeben
Vlad Tepesch schrieb: > was ist dir denn über die Störungen bekannt? > wie lange dauern die an? wie groß ist der Unterschied zu dem Signal? Ist > das immer so eine deutliche Flanke nach unten? > > verarbeitest du das komplette Signal auf einmal, oder soll das adHoc > mitlaufen? Danke für deine Mühe. Ich beantworte die Fragen gerne mal: Die Störungen sind zufällig und absolut nicht vorhersagbar, sowohl von der Dauer als auch von auftretenden Amplituden. Es können also auch Flanken nach oben oder ein deutlich(!) erhöhtes Rauschen sein. Alle 2,5s wird ein neuer Wert erfasst. Nach ausreichend vielen Plateauwechseln und dadurch ausreichend großem Gesamthub wird eine Aktion ausgelöst. Das Signal liegt somit nicht sofort vor sondern wird nach und nach erfasst und ausgewertet.
das grundsätzliche Vorgehen muss deswegen ja nicht anders sein. Wahrscheinlich reicht es sich eine Pufferlänge auszusuchen (zb 200 - 500 Messungen) und mit jedem neuem Messwert darüber die Standardabweichung und Mittelwert zu berechnen. Liegen innerhalb der letzten n Messungen m Messungen außerhalb des 2 fachen Sigmas, handelt es sich Wahrscheinlich um eine Störung. Um das Ende einer Störung zu erkennen, würde ich genau umgedreht vorgehen. Den Mittelwert und das Sigma ausgehend von der neusten Messung berechnen. Wenn über mind. 50 Messungen das Sigma plausibel klein ist, dann schauen, ab wo von hinten nach vorne wandernd, die Werte außerhalb dieser liegen.
Im oberen Bild sieht es so aus, als ob das Rauschen bei einem konstanten "level" innerhalb einer gewissen Toleranz bleibt. Deshalb würde ich Anfang und Ende mit einem Schwellwert berechnen. Mein Versuchscode ist im Anhang.
Vielen Dank. Ich werde mir nach den Feiertagen mal dein Beispiel ansehen. Frohe Ostern allen Mitforisten :)
Es ist nun einen Monat her. Für welche Implementationsvariante hast du dich entschieden?
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.