(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: Algorithmus gesucht für Reduktion von Messdaten
24. Jun 2006, 19:59
Er will doch die 'Treppen' behalten, da bringt eine Interpolation oder Regression leider gar nichts.
Ich habe es so gelöst:
Ich habe eine Liste von Punkten P.
Jetzt nehme ich aus P irgend einen Punkt P[i] weg.
Über die verbliebene Punkteschar P[1..i-1, i+1..n] kann ich einen kubischen Spline legen. Zwischen den Punkten P[i-1] und P[i+1] (P[i] ist ja weg) liegt ein Spline-Segment. Dieses Spline-Segment ist einfach nur ein Polynom 3.Grades. Es läuft von P[i-1].x bis P[i+1].x und berührt die Punkte p[i-1].y und p[i+1].y....
So... es läuft auch durch P[i].x. Wenn der Y-Wert des Splines an diesem Punkt sehr nahe an P[i].y liegt, dann benötigen wir den Punkt P[i] nicht, denn er wird hinreichend genau durch unsere Splinefunktion beschrieben. Der Punkt P[i] ist also 'überflüssig'.
Super, wir haben nun aus der riesigen Menge P einen Punkt entfernt, ohne dass sich der Graph (egal wie der aussieht) ändert. Das wiederholen wir nun so lange, bis es keinen 'überflüssigen' Punkt mehr gibt.
Auf diese Weise haben wir genau solche Messwertreihen auf die 'relevanten' Punkte reduziert. Bereiche, in denen sich alle Punkte auf einer flatten Kurve befinden, werden einfach weggekürzt. Peaks, Treppen etc., also alles, was wirklich wichtig ist, bleibt dagegen erhalten.
Man kann das Verfahren natürlich optimieren, in dem man sich z.B. nur Segmente mit 6-8 Punkten anschaut, aber damals war ich zu faul dazu, denn das Ergebnis war, wie oben beschrieben, sehr gut und auch relativ fix (auf einem 10Mhz 68000 mit HP-Basic), also sollte das mit einem PC doch wirklich schnell gehen.
Kubische Splines sind sehr einfach zu berechnen (Gleichungssystem erstellen, Gauß rüberlaufen lassen, fertig). Googel mal danach.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
|