www.mikrocontroller.net

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


Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: manoh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mark Brandis (markbrandis)
Datum:

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

Öhm ja, kann sein :)

Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwie Blum (zwieblum)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Franko Phil (sgssn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

danke an Alle. ich versuch das mal.

Gerhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.