Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Median Filter zur einfacheren, störungsfreien Steuerung #947

Open
mikkey1000 opened this issue Jun 27, 2024 · 7 comments
Open

Median Filter zur einfacheren, störungsfreien Steuerung #947

mikkey1000 opened this issue Jun 27, 2024 · 7 comments

Comments

@mikkey1000
Copy link

Beim Messen kommen Störungen (z.b. Wolke bei Beschattung, Strom-Überschussverbrauch, ...) recht häufig vor.
Diese Störungen sind Ausreißer, die die gesamte Verarbeitung stören.

Funktionsbeschreibung

Der Medianfilter speichert N Messwerte in einem sortierten Array und verwendet nur den Wert an der mittleren Position des Arrays. Enthält das Array eine gerade Anzahl von Elementen, dann wird der Mittelwert der beiden mittleren Elemente zurückgegeben.

Wird ein neuer Messwert an den Medianfilter übergeben, dann wird der älteste Messwert durch den neuen ersetzt und die Liste neu sortiert.

Quelle: https://www.mikrocontroller.net/articles/Median_Filter

@Apollon77
Copy link
Collaborator

Machen nicht percentile heutzutage viel mehr sinn als der median? https://www.dynatrace.com/news/blog/why-averages-suck-and-percentiles-are-great/

@Apollon77
Copy link
Collaborator

PS: genertall den Wert in einem der StatistikAdapter erfassen und dann dort über den gewünschten zeitraum entweder average (wäre der median grob) oder besser percentile abfragen, so arbeite ich in meiner Auto Ladesteuerung ... percentile 50 über letzte 10 minuten PV produktion

@mikkey1000
Copy link
Author

PS: genertall den Wert in einem der StatistikAdapter erfassen und dann dort über den gewünschten zeitraum entweder average (wäre der median grob) oder besser percentile abfragen, so arbeite ich in meiner Auto Ladesteuerung ... percentile 50 über letzte 10 minuten PV produktion

schau ich mir an. Danke

@mcm1957
Copy link
Collaborator

mcm1957 commented Jun 27, 2024

Ev als Feature Issue im Adapter SMOOTHED einbringen. Würde dort wahrscheinlich passen.
https://github.com/BenAhrdt/ioBroker.smoothed

@BenAhrdt
Würde das nicht zum smoothed passen?

@mikkey1000
Copy link
Author

Ev als Feature Issue im Adapter SMOOTHED einbringen. Würde dort wahrscheinlich passen. https://github.com/BenAhrdt/ioBroker.smoothed

@BenAhrdt Würde das nicht zum smoothed passen?

den Adapter hatte ich mir in den letzten Tagen auch angeschaut. da würde es gut reinpassen!

@BenAhrdt
Copy link

BenAhrdt commented Jun 27, 2024

Also weitere Filtermethode?
Die zu grundeliegende Berechnugnen für Mittelwert / PT1 basieren auf der Methode, dass intern ein Array abgelegt wird, welches der Filterzeit entspricht. hier werden entweder (je nach einstellung) in einem bestimmten Zyklus Werte abgelegt,oder bei Wertänderung des zu filternden werts.

Die logik:
Der Medianfilter speichert N Messwerte in einem sortierten Array und verwendet nur den Wert an der mittleren Position des Arrays. Enthält das Array eine gerade Anzahl von Elementen, dann wird der Mittelwert der beiden mittleren Elemente zurückgegeben.

ist mit der aktuellen Logik im Adapter nicht so einfach umsetzbar, da die Anzahl der Elemente, davon abhängig wie lange ein wert anstand. (Bspw. Filterzeit 1min ... Wert: 50s auf 1 und 10s auf 100 ergibt 2 Werte im array. (Es sei denn ich lasse es immer zyklisch aktualisieren).

Allerdings, würde ich für die gewünschte Funktion eher einen Mittelwert empfehlen mit entsprechender einstellung der erlaubten standardabweichung.

Die Logik der beschriebenen wertbildung, erscheint mir nicht wirklich gut. (wenn ein außreiser direkt die eiden mittleren werte betrifft, werden diese trotzdem ausgegeben)

@mikkey1000 Hast Du Dir die vorhandenen Logiken zur Gefilterten Wertbildung mal angesehen?
Also ich könnte noch eine Logik mit rein bringen, die die beiden mittleren Werte nimmt.
Wie gesagt, die Idee hinter der Wertbildung des Adapters ist nicht eine Anzahl X an Werten zu haben und daraus einen Mittelwert zu bilden, sondern anhand einer Filterzeit einen Wert zu bilden.
Je nachdem wie schnell sich der Wert ändert, können bei einer Filterzeit von 30s auch 100 Werte im Array sein, oder eben auch nur einer. Die Werte werden allerdings gewichtet anhand ihrer Dauer genommen.

Hier mal ein Beispiel meines PV-Wertes und dem mit Mittelwert gefilterten Wert.
Ich habe den Wert manuell immer mal wieder auf 0 gesteuert und wie Du siehst, tut es dem gefilteten Wert kaum etwas.

objects-iobroker-Google-Chrome-2024-06-27-19-59-12

@BenAhrdt
Copy link

BenAhrdt commented Aug 1, 2024

@mikkey1000 konntest Du meinen Vorschlag nochmal ansehen?
Zusätzlich habe ich noch eine Verständnisfrage bezüglich deiner Logik?
Das Array wird neu sortiert: Verstehe ich es richtig, dass es nach der Größe sortiert wird?
Denke, dass nur der mittlere Wert genommen wird, oder?

Wenn ja, würde das ja bedeuten:
10 x Wert = 0
1 x Wert = 1
10 x Wert = 100

Wenn ich es richtig verstanden habe, würde ja dann der Wert 1 ausgegeben werden.
Das erscheint mir allerdings keine gute Ausgabe.
Hier würde ich zumindest über den Mittelwert schon den Wert 47,6 erhalten.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants