Forum: PC-Programmierung Signal-hub ermitteln


von Marcel K. (memeqri)


Angehängte Dateien:

Lesenswert?

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
von Vlad T. (vlad_tepesch)


Lesenswert?

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 :)?

von Marcel K. (memeqri)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Marcel K. (memeqri)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

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.

von Marcel K. (memeqri)


Lesenswert?

Vielen Dank. Ich werde mir nach den Feiertagen mal dein Beispiel 
ansehen.

Frohe Ostern allen Mitforisten :)

von Daniel A. (daniel-a)


Lesenswert?

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
Noch kein Account? Hier anmelden.