Moin!
Ich bekomme von einem externen Kompassmodul einen fertig berechneten
Kompass-Wert (0.0 bis 359.9 Grad) über eine serielle Schnittstelle (als
ASCII mit einer Dezimalstelle und einem Zeilenende als Abschluss).
Der Wert ist allerdings mit einem Rauschen von etwa 2 Grad Spitze-Spitze
überlagert und taugt noch nicht zur direkten Anzeige - das wackelt zu
viel.
Da die Messfrequenz ungefähr 30 Hertz beträgt und mein Messobjekt nicht
besonders dynamisch ist, könnte ich über ungefähr 20 bis 40 Werte
tiefpassfiltern. Das habe ich auch schon umgesetzt und es funktioniert
auch ganz gut, die Anzeige schwankt nur um 0.1 Grad.
Allerdings gibt es an einer Stelle (logischerweise) ein Problem: Wenn
der Wert bei Nordkurs zwischen 359 bis 1 Grad schwankt, erhalte ich als
Ergebnis aus dem Tiefpaßfilter 180 Grad als Anzeige. Das ist nun ganz
und gar ein unerwünschtes Verhalten!
Wie kann man diese Filterung eleganter lösen, so dass ein stabiler
Kompasswert herauskommt, insbesondere wenn sich das Messobjekt langsam
dreht? Sprich - wie filtert man einen Messwert, der eine Diskontinuität
im Bereich hat?
Gerhard schrieb:> Sprich - wie filtert man einen Messwert, der eine Diskontinuität> im Bereich hat?
Rechne mit cos(KpK) und sin(KpK). Da tritt keine Diskontinuität auf.
Scheint mir auch die eleganteste Lösung zu sein. Falls du sin & cos
einigermaßen brauchbar berechnen kannst.
Ansonsten könntest du deinen Wertebereich um 180° drehen, sobald es in
die Nähe der 0° geht, damit die Diskontinuität dann woanders liegt.
Schwierig wird es, da den Grenzwert einzustellen, denn genau da tritt
wieder ein Schalten auf. Vermutlich möchte man das glatte, gefilterte
Signal als Entscheidungsgrundlage nehmen und etwas Hysterese einbauen.
Das wird vermutlich schwieriger, als es klingt...
sollte aber auch machbar sein.
Joe F. schrieb:> Ein Median-Filter wäre auch noch eine Möglichkeit.> Da kommt immer ein sinnvoller Wert heraus.
Das ist doch Unfug.
Es kommt zwar kein um rund 180° falscher Wert raus, aber bei Anwendung
auf Kompasskurse im Bereich 360/0° werden gerade die richtigen Werte
(nahe 0/360°) durch die Medianberechung rausgeschmissen. Als Ergebnis
aus dem Median kommt nämlich in dem Fall einer raus, der gerade von
0/360° weit weg liegt :-(
Wolfgang schrieb:> Als Ergebnis> aus dem Median kommt nämlich in dem Fall einer raus, der gerade von> 0/360° weit weg liegt :-(
Nein, denn man nimmt natürlich den Wert, der in der Mitte der Liste
liegt.
Nachtrag:
Achso, du hast natürlich recht. Sorry.
Medianfilter ist Quatsch.
Was Sinn machen würde, ist den am häufigsten auftretenden Wert zu
nehmen.
Andere Idee:
Du berechnest für jeden eingehenden Wert die Abweichung vom aktuell
angezeigten Kurs (kann dann auch negativ sein).
Wenn die Abweichung des Messwertes >180° ist, nimmst du einen Überlauf
über 0° an, und ziehst 360° ab.
Wenn die Abweichung <-180° ist, addierst du 360°.
Diese Abweichungen mittelst du, rechnest dieses Mittel zum aktuellen
Kurs dazu, und bringst das Ergebnis wieder in den Wertebereich 0.0-359.9
(<0 -> +360.0 , >=360 -> -360.0)
Das ist dann der neue Kurs.
Das trifft sich gerade prima, mache nämlich just in diesem Moment etwas
Ähnliches. N Kompass ist aber nicht dabei :>
Wolfgang schrieb:> Rechne mit cos(KpK) und sin(KpK). Da tritt keine Diskontinuität auf.
Hättest du Lust und Zeit das zu erläutern?
EDIT: Nach etwas googlen habe ich das hier gefunden:
sum_i_from_1_to_N sin(a[i])
a = arctangent ---------------------------
sum_i_from_1_to_N cos(a[i])
Reginald L. schrieb:> Wolfgang schrieb:>> Rechne mit cos(KpK) und sin(KpK). Da tritt keine Diskontinuität auf.> Hättest du Lust und Zeit das zu erläutern?
Guck dir den Kurvenverlauf von sin(x) und cos(x) in der Nähe von 0°/360°
an. Da ist alles wunderschön stetig. So ganz unproblematisch ist eine
Mittelung bei den Umkehrpunkten aber auch nicht (z.B. cos(x) für x nahe
0).
Die Idee von Joe F. ist aber viel praktischer, weil keiner wegen einer
simplen Mittelung trigonometrische Funktionen hoch und runter rechnen
möchte.
Joe F. schrieb:> Andere Idee: ...
Wolfgang schrieb:> Die Idee von Joe F. ist aber viel praktischer, weil keiner wegen einer> simplen Mittelung trigonometrische Funktionen hoch und runter rechnen> möchte.
Deshalb überlasse ich das meinem Rechner ;)
Reginald L. schrieb:> Deshalb überlasse ich das meinem Rechner ;)
Mit dieser Einstellung wird es auch weiterhin gelingen, Fortschritte in
der Rechnerleistung sinnlos durch Faulheit bei der Programmierung und
Entwicklung von Algorithmen zu verpulvern.
Wolfgang schrieb:> Mit dieser Einstellung wird es auch weiterhin gelingen, Fortschritte in> der Rechnerleistung sinnlos durch Faulheit bei der Programmierung und> Entwicklung von Algorithmen zu verpulvern.
Du kannst ruhig weiterhin stundenlang an der Entwicklung eines
Algorithmus sitzen um deinen 4x3GHz Rechner dann mit dem kleinen
EinMalEins zu malträtieren :)
Es dient letztendlich als Mittel zum Zweck. Möchte man sowas in einen
kleinen langsamen 8-Bitter implementieren stellt sich die Frage
inwieweit die "Faulheit" noch taugt.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.