Plotten von unterschiedlichen Signalen gegeneinander

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
zweihorn
User
Beiträge: 27
Registriert: Donnerstag 11. Mai 2017, 17:09

Hallo,

ich bin schon länger mit Python im wissenschaftlichen Bereich unterwegs, komme aber bei folgendem Problem weder zu einer sinnvollen noch zu einer funktionierenden Lösung.

Aus einer Messung mit zwei unterschiedlichen Geräten habe ich zwei x-y Datensätze.

x1 = Zeit in min.
x2 = Zeit in sec.

y1 = Signal1
y2 = Signal2

Leider haben die beiden Messgeräte unterschiedliche Sampling-Raten die zusätzlich auch nicht konstant sind. Signal1 ist stetig und hat einen unspektakulären Verlauf. Signal2 hingegen ist unstetig und sieht einem Sägezahn-Profil ähnlich:

Code: Alles auswählen

   __    __
 /   | /
/    |/
Des Weiteren sind beide Signale zwar jeweils ein zusammenhängender Datensatz, allerdings muss ich diese an bestimmten Punkten auftrennen. Und zwar so, dass ich je einen Sägezahn einzeln habe. Signal1 muss dann an den gleichen Stellen getrennt werden.

Mein Ziel ist letztlich ein Plot: y: Signal1, x: Signal2 für jedes Sägezahnsegment zu erhalten. Leider gestaltet sich dies, aufgrund der unterschiedlichen Sampling-Raten schwierig.


Bisher habe ich versucht mit scipy.interpolate (linear) ein resampling der beiden Signale durchzuführen. Prinzipiell funktioniert das zwar, aber die Grenzen beim Trennen der Signalsegmente leiden durch die Interpolation.

Da die Zeitsignale keine Integer, sondern Floats mit einigen Dezimalstellen sind, kann ich die Segmente auch schlecht mittels der jeweiligen Zeitwerte trennen, da ich die Grenzen nicht exakt zuordnen kann. Wenn ich die Zeiten runde und einen kleinen Shift in kauf nehme, dann zieht mir das resampling, wegen der Interpolation, mein Signal in unsinnige Bereiche (der Fuß des Sägezahn wird z.B. < 0). Ich bräuchte eine Interpolationsmethode zum resampling die den Start- und Endpunkt exakt beibehält.

Kann mir jemand einen Tipp geben, wie ich so etwas bewerkstelligen kann?

Vielen Dank!

zweihorn
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@zweihorn: bei linearer Interpolation kann es zu keinen Überschwingern kommen, wenn also alle Werte >0 sind, kann es nach interpolationen keinen geben, der <0 ist. Da nicht ganz klar ist, wie das Auftrennen aussieht und was Du mit den Daten weiter machen willst, hier nur ein paar allgemeine Tipps: wenn interpolieren, dann auf das Signal, das unstetig ist und feiner gesamplet ist. Wenn der Sägezahn nur zum Trennen ist, dann gar nicht interpolieren, sondern den x-Wert bestimmen und dann mit bisect den passenden Zeitpunkt im anderen Signal finden.
zweihorn
User
Beiträge: 27
Registriert: Donnerstag 11. Mai 2017, 17:09

hi,

es sind auch keine Überschwinger. Das passiert, weil durch das Trennen der unterschiedlichen Signale ein kleiner Offset in der Zeit entsteht: Dort wo ich bei Signal1 einen Punkt habe, muss nicht zwangsläufig einer bei Signal2 sein. Durch das Setzen von Zwischenpunkten und anschließendes Interpolieren wandert das Signal (linear!) auf Werte < 0.

Ich habe es jetzt allerdings hinbekommen:

Zuerst das Sägezahn-Signal trennen und die Start- und Endzeit des jeweiligen Segmentes zum resamplen mit neuer, fester Samplerate verwenden. Direkt im Anschluss das zweite Signal komplett interpolieren

Code: Alles auswählen

tck = interpolate.splrep(Signal1[:,0],Signal1[:,1],k=1,s=0)
und es dann mit der neuen Samplerate auf das jeweilige Segment "mappen":

Code: Alles auswählen

Signal1_neu = interpolate.splev(T,tck,der=0)
Das Ganze steckt dann in einer for-Schleife und arbeitet die Segmente ab. Vllt. nicht schön aber tut seinen Zweck und das ist momentan das Wichtigste.

Allerings beschreibt dein Tipp mit bisect, glaube ich zumindest (kenne es nicht), ein von mir geplantes Vorgehen, welches ich mangels passenden Funktionen nicht umsetzen konnte. Das werde ich mir mal noch angucken! Danke!

EDIT: ja, es sieht so aus, als hätte bisect eine gute Alternative geliefert :)
Antworten