Grüßt euch,
ich habe zwei Messreihen von Beschleunigungssensoren. EIn Beschleunigungssensor ist besonders genau und präzise und dessen Werte möchte ich als absolute Messwerte betrachten. Der zweite Beschleunigungssensor ist der Sensor um den sich im Prinzip alles dreht. Hier möchte ich die Abweichung vom absoluten Messwert (der andere Beschleunigungssensor) berechnen. Ich plane hierbei einen absoluten Fehler zu berechnen.
Problem ist hierbei allerdings, dass die beiden Messreihen mit unterschiedlichen Abtastraten aufgenommen wurden. D.h. eine Messreihe hat mehr Werte als die andere obwohl die Dauer identisch ist.
Wie „matche“ ich die Messreihen sodass ich den Fehler bei einigen Punkten berechnen kann? Klar, ich könnte das abschätzen - aber gibts da vll bessere Möglichkeiten oder Verfahren wie ich vielleicht sogar „automatisch“ mir dies berechnen lassen kann? Händisch geht das auch, dauert aber klar viel länger.
Die Daten liegen mir als CSV Dateien vor. Zum plotten arbeite ich mit Gnuplot.
Wäre klasse wenn ihr mir mal eure Meinung dalasst
Danke schön!
Hallo!
Gnuplot kann grundsätzlich keine Berechnungen zwischen spalten unterschiedlicher Dateien vornehmen. Auch kann es nicht in dem Sinn die Form der einen Daten in den anderen wiederfinden.
Du hast also keine Zeitinformation? Haben beide Messungen denn zumindest Zeitgleich begonnen /aufgehört? Dann kann man ja die Zeilennumnern, die auf die x-achse kommen, so Mut nem Faktor multiplizieren, das beide kurven gleich breit sind.
Die andere Möglichkeit ist, eine Funktion in eine Kurve zu fitten, und dann zu ermitteln, wie man sie verzerren/verschieben muß, damit sie auch in die andere paßt.
Du siehst, es gibt da ein paar Möglichkeiten, es kommt drauf an, wie die Daten aussehen, und was du machen willst.
Gnuplot kann ich, wenn du mir die Daten gibst, schau ich mal, wie das am besten geht.
Die Abtastrate ist bekannt, die Gesamtdauer auch. Ergo kann man sich alle benötigten Zeitpunkte ziemlich einfach berechnen. Und dann sollte auch das Plotten klappen.
Gruß
anf
Hallo!
Ah, OK, Beginn und Ende der Messung sind also in beiden Fällen gleich. Dann vielleicht so:
Ich gehe davon aus, daß eine Datei fine.csv
und eine coarse.csv
vorliegt, in denen jeweils nur eine Spalte mit den Messwerten ist. Ich habe mir mal Sinus-Werte von 0° bis 360° gemacht, einmal in 15°-Schritten, und einmal in 5°-Schritten.
stats "fine.csv" using 1 prefix "F"
stats "coarse.csv" using 1 prefix "C"
macht ne Statistik für die erste Spalte der Dateien, und legt einige Variablen darüber an. Näheres in der Hilfe. Wichtig sind mir die Variablen F_records
und C_records
, die die Anzahl der gültigen Zeilen (innerhalb der aktuellen Achsen-ranges) liefert. In meinem Fall sind es 73 bzw. 13 Zeilen.
Zum Plotten werden die Messwerte (Spalte 1) gegen die Zeilennummer (Virtuelle Spalte 0) geplottet. Dafür hätte ich zwei Möglichkeiten im Angebot:
Zwei x-Achsen
set xlabel "Fine"
# Marker der unteren x-Achse nicht auch an der oberen zeichnen
set xtics nomirror
#Zweite, obere x-Achse aktivieren und konfigurieren
set x2tics
set x2label "Coarse"
# "Stauchungsverhältnis" der beiden Achsen berechnen
r=(C_records-1)/(F_records-1)
# Beide Achsen verlinken, so daß gnuplot weiß, daß sie über eine Formel umzurechnen sind:
set link x2 via x*r inverse x/r
# Daten Plotten, die groben auf die 2. x-Achse:
plot "fine.csv" using 0:1, "coarse.csv" using 0:1 axes x2y1
Denk dran, die x-Achsen sind die Zeilennummern der Werte, allerdings bei 0 beginnend. (Daher das -1
bei der Berechnung von r
)
Eine x-Achse
# "Stauchungsverhältnis" der beiden Achsen berechnen
r=(C_records-1)/(F_records-1)
plot "fine.csv" using 0:1, "coarse.csv" using ($0/r):1
Die Klammer um ($0/r)
muß sein, damit gnuplot weiß, daß hier ein Rechenausdruck kommt, das $
bedeutet, daß hier der Wert der nullten Spalte eingefügt werden soll.
Diese Möglichkeit ist etwas simpler als die erstgenannte, aber man hat eben nur eine x-Achse:
Achtung:
Wenn du in der gleichen Session / Batch-Datei einen weiteren Datensatz bearbeiten willst, solltest du zunächst die Ranges mit set xrange [*:*]; set x2range [*:*]
auf ‚automatisch‘ stellen, denn wie gesagt, stats
schaut nur auf die Daten innerhalb der aktuellen Ranges!