Forum: PC-Programmierung Daten (numerisch) integrieren in C


von Franko P. (sgssn)


Lesenswert?

Hallo
ich habe Datenblöcke zu 1024 Messwerten aus einer 
Beschleunigungsmessung. Jetzt brauche dazu die Auslenkung, also den Weg. 
Das kann man durch zweimaliges integrieren der Messwerte erhalten. Aber 
ich hab keinen Plan wie so ein Programm in C aussieht. Grundsätzlich 
müsste das doch in Richtung Tiefpass gehen ode liege ich da falsch ?

Gerhard

von Remote O. (remote1)


Lesenswert?


von Mark B. (markbrandis)


Lesenswert?

Könnte das nicht so gehen (Pseudocode):

define DeltaT Zeitwert // Konstante: Zeit zwischen zwei Messwerten
var Beschleunigung, Geschwindigkeit, Weg;
Weg = 0;

Iteriere über alle Messwerte der Beschleunigung
Lese aktuelle Beschleunigung;
Geschwindigkeit = Betrag von(Beschleunigung * DeltaT);
Weg = Weg + Geschwindigkeit * DeltaT;
Iteration Ende

(Wenn man jetzt z.B. von einem Auto ausgeht, das sowohl bei positiver 
als auch bei negativer Beschleunigung einen Vorwärtsgang eingelegt hat)

von Franko P. (sgssn)


Lesenswert?

Hallo
danke erst mal für die Posts.
Zur Präzisierung: Ich brauche nicht die Fläche unter der Kurve und auch 
nicht den gesamten Weg. Das Signal ist sinus-ähnlich, aber nicht 
wirklich periodisch. Wenn man das 1* integriert, muss wieder eine Kurve 
herauskommen, ebenso beim 2. integrieren.

Gerhard

von Mark B. (markbrandis)


Lesenswert?

Dann vielleicht so?

Iteriere über alle Messwerte der Beschleunigung
Lese aktuelle Beschleunigung;
Geschwindigkeit = Beschleunigung * DeltaT;
Auslenkung = Auslenkung + Geschwindigkeit * DeltaT;
Iteration Ende

Wenn die Beschleunigung positiv wie negativ sein kann, und hiernach auch 
die Geschwindigkeit, so kann auch die Auslenkung zu- wie abnehmen.

von manoh (Gast)


Lesenswert?

"Numerical integration in C" ist das Stichwort für eine Suche im 
Internet.



Mark Brandis schrieb:
> Geschwindigkeit = Betrag von(Beschleunigung * DeltaT);

müsste das nicht eher

Geschwindigkeit = Geschwindigkeit + (Beschleunigung * deltaT);

sein?

von Mark B. (markbrandis)


Lesenswert?

manoh schrieb:
> müsste das nicht eher
>
> Geschwindigkeit = Geschwindigkeit + (Beschleunigung * deltaT);
>
> sein?

Öhm ja, kann sein :)

von Franko P. (sgssn)


Lesenswert?

Hallo Mark

stimmt eigentlich. Hab mal wieder zu kompliziert gedacht. Müsste 
eigentlich so funktionieren. Und ich krieg für jeden Term wieder einen 
Punkt meiner Geschwindigkeitskurve bzw Wegkurve.
Danke!

Gruß
Gerhard

von Karl H. (kbuchegg)


Lesenswert?

Gerhard G. schrieb:
> Hallo Mark
>
> stimmt eigentlich. Hab mal wieder zu kompliziert gedacht. Müsste
> eigentlich so funktionieren. Und ich krieg für jeden Term wieder einen
> Punkt meiner Geschwindigkeitskurve bzw Wegkurve.

Bedenke aber auch, das das Ergebnis nicht wirklich berauschend sein 
wird.

Es ist ein Trugschluss zu denken, dass eine Wegmessung ganz leicht 
realisierbar ist nach dem Muster

  man nehme einen Beschleunigungssensor und integriere 2-mal

In der Praxis funktioniert das nur sehr schlecht. Die Ergebnisse sind, 
gelinde gesagt, mies bis unbrauchbar.
Grund: du integrierst auch das unvermeindliche Rauschen mit auf. Und 
durch das 2-malige Integrieren verstärkst du das Rauschen extrem, bis es 
dir die Ergebnisse unbrauchbar macht.

In der Theorie: Super Ansatz
In der Praxis: wenn du keine Präzissionsinstrumente hast - unbrauchbar

von Franko P. (sgssn)


Lesenswert?

Hallo Karl heinz Buchegger

was wäre eine Alternative ? Wie machen "Profi-Programme" so etwas ?

Beim Differenzieren fallen Konstante raus, solche, falls vorhanden 
können also beim Integrieren auch nicht restauriert werden. Gegen das 
Rauschen könnte man ja filtern (Mittelwert über 3 Werte oä) oder was 
gibts sonst noch ?
Ich brauche nicht die Gesamtheit des Wegs. Die Beschleunigungswerte 
erwarte ich irgendwo konstant, dazu will ich die Auslenkung haben, die 
müsste also auch irgendwo konstant sein - als Maximal-Wert.


Gerhard

von Karl H. (kbuchegg)


Lesenswert?

Gerhard G. schrieb:
> Hallo Karl heinz Buchegger
>
> was wäre eine Alternative ? Wie machen "Profi-Programme" so etwas ?

Die benutzen zuallererst einmal eine Inertialplatform, auf der die 
Bewegungssensoren installiert sind.
Bzw. eine Kombination aus Gyros und Beschleunigungssensoren um sich 
rechnerisch eine Inertialplatform zu schaffen, die als Referenzsystem 
absolut stabil im Raum steht.

Aber ich will dich nicht aufhalten. Probiers aus.
Für kurzzeitige Messungen mags trotzdem immer noch gehen. Du sollst nur 
im Hinterkopf halten, dass du in der Kette

   Eingabe - Verarbeitung - Ausgabe

den Fehler nicht notwendigerweise im Schritt Verabreitung zu suchen 
hast, wenn hinten nichts Vernünftiges rauskommt.

von Zwie B. (zwieblum)


Lesenswert?

Kalman Filter macht was du brauchst.
http://www.cs.unc.edu/~welch/kalman/ - irgendwo gibt's genau dein
Problem im Beispielcode, musst ein bischen suchen.

von mano (Gast)


Lesenswert?

Gerhard G. schrieb:
> Wie machen "Profi-Programme" so etwas ?

Zu aller erst muss man möglichst genau messen bzw. genau genug und 
richtig. Ein Profi-Programm macht das genauso gut/schlecht wie ein 
Nicht-Profi-Programm (was auch immer Profi-Programme sind...). Ein 
Ansatz ist sicher zuerst einen gleitenden Mittelwert bilden und dann zu 
Integrieren. Jedenfalls kenne ich es so von Erschütterungsmessungen.

von Franko P. (sgssn)


Lesenswert?

Hallo

danke an Alle. ich versuch das mal.

Gerhard

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.