2008-10-15 10 views
9

Ich lese Daten von einem Gerät, das Abstand misst. Meine Abtastrate ist hoch, so dass ich große Änderungen in der Entfernung (d. H. Geschwindigkeit) messen kann, aber dies bedeutet, dass das Gerät, wenn die Geschwindigkeit niedrig ist, eine Anzahl von Messungen liefert, die identisch sind (aufgrund der Granularität des Geräts). Dies führt zu einer "abgestuften" Kurve.Wie man Daten "glättet" und Liniengradient berechnet?

Was ich tun muss, ist die Kurve zu glätten, um die Geschwindigkeit zu berechnen. Danach muss ich dann die Beschleunigung berechnen.

Wie geht man am besten darüber?

(. Samplerate von bis zu 1000 Hz, Berechnung Rate von 10 Hz wäre ok C# in VS2005 verwenden)

Antwort

25

Der Wikipedia-Eintrag von Moogs ist ein guter Ausgangspunkt für die Glättung der Daten. Aber es hilft dir nicht, eine Entscheidung zu treffen.

Es hängt alles von Ihren Daten und der benötigten Verarbeitungsgeschwindigkeit ab.

Gleitender Durchschnitt Verflacht die oberen Werte. Wenn Sie an dem minimalen und maximalen Wert interessiert sind, verwenden Sie diesen nicht. Ich denke auch, dass die Verwendung des gleitenden Durchschnitts die Messung der Beschleunigung beeinflusst, da sie Ihre Daten (ein bisschen) abflacht, wodurch die Beschleunigung kleiner erscheint. Es kommt auf die nötige Genauigkeit an.

Savitzky-Golay Schneller Algorithmus. So schnell wie der gleitende Durchschnitt. Das wird die Höhen von Spitzen beibehalten. Etwas schwieriger zu implementieren. Und Sie brauchen die richtigen Koeffizienten. Ich würde dieses auswählen.

Kalman Filter Wenn Sie die Verteilung kennen, kann dies Ihnen gute Ergebnisse liefern (es wird in GPS-Navigationssystemen verwendet). Vielleicht etwas schwieriger zu implementieren. Ich erwähne das, weil ich sie in der Vergangenheit benutzt habe. Aber sie sind wahrscheinlich keine gute Wahl für einen Starter in dieser Art von Sachen.

Das oben genannte reduziert das Rauschen Ihres Signals.

Als nächstes müssen Sie den Start- und Endpunkt der "Beschleunigung" erkennen. Sie können dies tun, indem Sie ein Derivative des ursprünglichen Signals erstellen. Die Punkte, an denen die Ableitung die Y-Achse (Null) kreuzt, sind wahrscheinlich die Spitzen in Ihrem Signal und können den Beginn und das Ende der Beschleunigung anzeigen.

Sie können dann eine Ableitung zweiten Grades erstellen, um die minimale und maximale Beschleunigung selbst zu erhalten.

+1

Wenn Sie die Dinge richtig modellieren, gibt der Kalman Filter Ihnen Geschwindigkeit und Beschleunigung direkt. –

+0

ein gutes Codebeispiel für Savitzky-Golay finden Sie auf http://www.procoders.net/?p=11 – Wouter

+0

SG ist trivial zu implementieren, sobald Sie die Koeffizienten haben. Benutze einfach R's Kommando, um sie zu finden. – Paul

9

Sie benötigen einen Glättungsfilter, wäre die einfachste ein „gleitender Durchschnitt“: nur den Durchschnitts der Berechnung letzte n Punkte.

Die Frage hier ist, wie n zu bestimmen, können Sie uns mehr über Ihre Anwendung erzählen?

(Es gibt auch andere, kompliziertere Filter. Sie unterscheiden sich, wie sie die Eingangsdaten erhalten. Eine gute Liste in Wikipedia ist)

bearbeiten !: Für 10Hz, den Durchschnitt der letzten 100 Werte.

+0

korrigiert. Vielen Dank! – moogs

+0

Könnten Sie bitte erklären, warum 100 Werte für 10Hz verwendet werden? Vielen Dank. –

+0

@Guido - von meiner Interpretation dessen, was er sagte, hat er 1000 Werte pro Sekunde, aber nur wirklich muss Daten 10 Mal pro Sekunde bekommen. Ein einfacher Weg besteht also darin, 100 Werte als einen zu behandeln (Durchschnitt). – moogs

1

Zusätzlich zu den oben genannten Artikeln, schauen Sie sich Catmull-Rom Splines.

+0

Catmull-Roms sind großartige Kurven für regelmäßig beabstandete Daten, tendieren jedoch dazu, Rauschen eher hervorzuheben als zu glätten. Ich wäre eher versucht, kubische oder quadratische Splines zu verwenden, obwohl sie nicht alle Datenpunkte passieren. –

0

Zusätzlich zu GvSs ausgezeichnete Antwort oben könnten Sie auch die Glättung/Reduzierung der Stufeneffekte Ihrer gemittelten Ergebnisse mit einigen allgemeinen Kurvenanpassungen wie kubischen oder quadratischen Splines in Erwägung ziehen.

3

Gleitende Mittelwerte sind im Allgemeinen schrecklich - funktionieren aber gut für weißes Rauschen. Beide gleitenden Durchschnitte & Savitzky-Golay führen beide zu einer Korrelation - und sind daher sehr schnell und könnten in Echtzeit umgesetzt werden. Wenn Sie Informationen höherer Ordnung wie erste und zweite Derivate benötigen, ist SG eine gute Wahl. Die Magie von SG liegt in den konstanten Korrelationskoeffizienten, die für den Filter benötigt werden - wenn Sie einmal entschieden haben, dass die Länge und der Grad des Polynoms lokal passen, müssen die Koeffizienten nur einmal gefunden werden. Sie können sie mit R (sgolay) oder Matlab berechnen.

Sie können auch die erste Ableitung eines verrauschten Signals über die Savitzky-Golay-Best-Fit-Polynome schätzen - diese werden manchmal Savitzky-Golay-Derivate genannt - und liefern in der Regel eine gute Schätzung der ersten Ableitung.

Kalman Filterung kann sehr effektiv sein, aber es ist rechenintensiver - es ist schwer, eine kurze Faltung für Geschwindigkeit zu schlagen!

Paul
CenterSpace Software

Verwandte Themen