Hi,
ich stehe momentan mathematisch auf dem Schlauch. Ich möchte gerne zwei Toleranzkurven (oben, unten) für eine Messreihe automatisch berechnen. Hintergrund ist, dass ich anhand einer als gut deklarierten Messkurve eine obere und untere Toleranzkurve ermitteln will und alle weiteren Messkurven automatisch vergleichen möchte, ob diese in dem berechneten Toleranzband sind.
Wichtig ist, das die Auflösung zweidimensional ist. Damit meine ich:
- 1. Toleranz, vertikal, Amplitudenhöhe
- 2. Toleranz, horizontal, Zeitpunkt des Peaks (dieser kann anhand von Jitter zu unterschiedlichen Zeitpunkten kommen)
Habt ihr hierfür ein Idee?
Danke und Gruss
george
Berechnung von Toleranzkurven
Hi,
ich bin mir nicht ganz sicher, was du eigentlich vorhast. Wie ist denn deine Toleranz definiert? Vielleicht hilft ein Blick in die Dokumentation von SciPy, insbesondere die Module "Optimization" und "Statistics".
Grüße
Gerrit
ich bin mir nicht ganz sicher, was du eigentlich vorhast. Wie ist denn deine Toleranz definiert? Vielleicht hilft ein Blick in die Dokumentation von SciPy, insbesondere die Module "Optimization" und "Statistics".
Grüße
Gerrit
Ich weiß nicht genau ob es das ist was du vorhast, aber: Wenn du vertikal einen dynamischen Schlauch drüber legen willst (um irgendwelche Peaks zu erkennen) würd ich als ersten Schritt eine Glättung der Reihe vornehmen (z.B. mit einer Faltung) und dann die Toleranz punktweise addieren bzw. subtrahieren:
Für die horizontale Position muss du eine Funktion schreiben, die die Peaks findet. Da ich nicht weiß wie deine Kurven aussehen kann ich auch nicht sagen was die beste Methode dafür ist. Evtl. nach Nulldurchgängen in der 2. Ableitung schauen und dann die Höhe des Sprungs in der 1. Ableitung berechnen.
Es gibt auch das Modul scipy.signal. Das könnte evtl. auch interessant für dich sein. In jedem Falle würst du bei numpy/scipy fündig.
MFG HerrHagen
Code: Alles auswählen
>>> import numpy
>>> import pylab
>>> x = numpy.sin(numpy.linspace(0, 2*3.14, 50))
>>> SIGMA = 0.2
>>> x += numpy.random.normal(0, SIGMA, len(x)) # add noise
>>> TOL = 0.4
>>> x_tol_above = numpy.convolve(x, numpy.ones(5)/5., "same") + TOL
>>> x_tol_below = numpy.convolve(x, numpy.ones(5)/5., "same") + TOL
>>> pylab.plot(x); x_tol_below; x_tol_above
Es gibt auch das Modul scipy.signal. Das könnte evtl. auch interessant für dich sein. In jedem Falle würst du bei numpy/scipy fündig.
MFG HerrHagen
Hi,
erst mal danke für eure Antworten. Das mit den "Schlauch drüber legen" trifft es schon ganz gut. Der Schlauch ist hierbei das GUT Fenster. Liegen die nachfolgenden Messreihen innerhalb dieses Fensters, so sollen diese als gut bewertet werden.
Ich habe mal einen beispielhaften Verlauf dargestellt.
- die mittlere Linie entspricht der GUT Kennlinie
- die obere und untere Toleranzkurve sollen den "Schlauch" zum Aufspannen des GUT Prüffensters darstellen
Ich hoffe man erkennt, dass nicht eine einfache Kurvenverschiebung nach oben/unten reicht sondern man ab einer gewissen Signalsteigung auch einen "Schlauch" auf der Zeitachse legen muss.
Ich denke mal, dass dies der Ansatz sein wird. Also ab einer gewissen Signalsteigung muss für die Berechnung der oberen und unteren Toleranzkurve auch eine Verschiebung auf der Zeitschase berücksichtigt werden.
Danke und Gruss
george
erst mal danke für eure Antworten. Das mit den "Schlauch drüber legen" trifft es schon ganz gut. Der Schlauch ist hierbei das GUT Fenster. Liegen die nachfolgenden Messreihen innerhalb dieses Fensters, so sollen diese als gut bewertet werden.
Code: Alles auswählen
..................
| ____________ |
| | _._._ ._ | |
| | | | | |
| | | | | |
.......| | | | | |.....
_________| | | |_______
_._._._._._| |._._._._
- die mittlere Linie entspricht der GUT Kennlinie
- die obere und untere Toleranzkurve sollen den "Schlauch" zum Aufspannen des GUT Prüffensters darstellen
Ich hoffe man erkennt, dass nicht eine einfache Kurvenverschiebung nach oben/unten reicht sondern man ab einer gewissen Signalsteigung auch einen "Schlauch" auf der Zeitachse legen muss.
Ich denke mal, dass dies der Ansatz sein wird. Also ab einer gewissen Signalsteigung muss für die Berechnung der oberen und unteren Toleranzkurve auch eine Verschiebung auf der Zeitschase berücksichtigt werden.
Danke und Gruss
george
Einfach für mein Verständnis noch 2 Fragen:
1. Musst du das Signal zuerst synchronisieren, damit möglichst viele Punkte in der Toleranz sind?
2. danach musst du nur noch die vertikale Toleranzabweichung bestimmen, da du schon optimal synchronisiert hast?
die Synchronisation machst du soweit ich weiss mit der Faltung der beiden Signale. Beim Minimum der Faltung, dort sind die Kurven am besten synchronisiert.
Punkt 2 ist dann trivial zu lösen, zu jedem Punkt bestimmst du ob das Signal im Toleranzbereich ist oder nicht.
1. Musst du das Signal zuerst synchronisieren, damit möglichst viele Punkte in der Toleranz sind?
2. danach musst du nur noch die vertikale Toleranzabweichung bestimmen, da du schon optimal synchronisiert hast?
die Synchronisation machst du soweit ich weiss mit der Faltung der beiden Signale. Beim Minimum der Faltung, dort sind die Kurven am besten synchronisiert.
Punkt 2 ist dann trivial zu lösen, zu jedem Punkt bestimmst du ob das Signal im Toleranzbereich ist oder nicht.
Hier mal einen Ansatz mit einer Verschiebung auch auf der X-Achse:
Die Verschiebung wird mit Hilfe von Minovski-Summen (besser bekannt als Erosion & Dilation ^= Minimum & Maximumfilter) realisiert.
MFG HerrHagen
Code: Alles auswählen
import numpy
import pylab
from scipy.ndimage import filters
Y_TOL = 0.4
X_TOL = 25
SMOOTH_FACTOR = 5
NOISE = 0.1
# create signal
x = numpy.zeros(100)
x[25:75] = 1
# add noise
x += numpy.random.normal(0, NOISE, len(x))
# smoothing
x_smooth = filters.gaussian_filter(x, SMOOTH_FACTOR, mode="wrap")
# add tolerances
x_tol_above = filters.maximum_filter(x_smooth, X_TOL) + Y_TOL
x_tol_below = filters.minimum_filter(x_smooth, X_TOL) - Y_TOL
# plot
pylab.plot(x)
pylab.plot(x_tol_below)
pylab.plot(x_tol_above)
MFG HerrHagen