Berechnung von Toleranzkurven

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

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
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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:

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
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
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

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.

Code: Alles auswählen

       ..................             
       |  ____________  |     
       | |  _._._ ._  | |       
       | | |        | | |          
       | | |        | | |          
.......| | |        | | |.....
_________| |        | |_______
_._._._._._|        |._._._._
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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Hier mal einen Ansatz mit einer Verschiebung auch auf der X-Achse:

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)
Die Verschiebung wird mit Hilfe von Minovski-Summen (besser bekannt als Erosion & Dilation ^= Minimum & Maximumfilter) realisiert.

MFG HerrHagen
george
User
Beiträge: 109
Registriert: Mittwoch 11. Januar 2006, 20:28
Wohnort: Berlin

Hi Herr Hagen,

danke, danke, danke.
Das war ein super Hinweis + Beispiel.

gruss george
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Hab das Problem so gelöst:
Bild

Der Code dazu:
http://nopaste.cwsurf.de/226
Antworten