mir liegen zwei Messreihen einer Rauigkeitsmessung des ein und selben Profils mit einer Länge von 4mm vor. Die erste Messreihe wurde mit einer Abtastrate von 3Pixel, die zweite mit einer Abtastrate von 10Pixel Abstand gemacht.
Ich wollte jetzt nun die Abweichung der beiden Profile errechnen, in dem ich einfach die Z-Werte der ersten von der zweiten Messreihe abziehe und dann ein Differenzprofil erhalte. Weicht das Differenzprofil signifikant von 0 ab, wüsste ich, dass die Abstastrate von 10Pixel zu grob ist oder im anderen Fall noch ausreichend genau ist.
Mir will aber einfach nicht in den Sinn kommen, wie ich nun die beiden Messreihen voneinander abziehen kann, da sie ja unterschiedlich viele Punkte haben. Messreihe 10 Pixel hat 20212 und 3Pixel hat 223304
Mein einziger Ansatz ist zur Zeit der Weg über ein Histogramm. ICh plotte das Histogramm für beide Z-Werte und vergleiche dies mit dem Auge. Allerdings ist mir das nicht wissenschaftlich genug. Ein Differenzprofil wäre mir lieber. Zumal die Histogramme nur Qualitativ passen... siehe Anhang.
Wie kann ich denn die bieden Messreihen auf die gleiche Länge normieren?
mit Hilfe von interp1 kannst du interpolierte Werte des Profils mit der Abtastrate von 10Pixel bestimmen. Anschließend ist es möglich das Differenzprofil zu bestimmen.
Danke für deine Antwort. Ich habe auch bereits einen ersten Ansatz unternommen und unten ein Ergebnis angehängt. Irgendwie habe ich diese Funktion noch nicht verstanden. Das Ergebnis ist nämlich komisch.
Oben ist das ursprüngliche Profil der 10x10 Pixel Probe gezeigt, und unten die Annäherung. Eigentlich haette ich erwartet, dass das untere Profil das obere abbildet, aber dem ist nicht so. Was habe ich falsch gemacht oder was habe ich falsch verstanden?
Meinen Code und die beiden Rauheitsprofile habe ich unten abgebildet. Statt der 1x1-Probe ist die 3x3 Probe angefügt, 1x1 ist nämlich 50 MB groß
Code:
function[ output_args ] = histo()
%HISTO Summary of this function goes here
% Detailed explanation goes here
% Lese Datei A ein und Interpoliere
a = load('test_3x3.asc');
disp(['Länge: ' num2str(length(a))]);
xa = a(:,1);
ya = a(:,2);
za = a(:,3);
za2 = interp1(za,0:0.001:100,'linear');
% Lese Datei B ein und Interpoliere
b = load('test_10x10.asc');
disp(['Länge: ' num2str(length(b))]);
xb = b(:,1);
yb = b(:,2);
zb = b(:,3);
zb2 = interp1(zb,0:0.001:100,'linear');
% Differenzprofil
zdiff = za2-zb2;
% Plotte Histogramme der Rauheitsprofile für A und B und Diff subplot(3,1,1); hist(za,400); title('3x3') subplot(3,1,2); hist(zb,400); title('10x10') subplot(3,1,3); hist(zdiff,400); title('diff')
% Plotte Rauheitsprofile von A und B unnd Diff figure
ich habe folgende Fragen ehe ich dir helfen kann, jedoch ist dein interp1-Ansatz für dein Problem, soweit ich das beurteilen kann, falsch:
1. Wenn du eine Abtastung hasst würde ich 2 Messwerte erwarten, einen für die Position (x-Wert) und einen für die Profilhöhe (y-Wert). Deine Daten enthaltn aber 3 Werte (xa, ya, za). Was sind die einzelnen Werte?
2. Ich frage mich warum du als Dartellungsform "hist" verwendest und die Daten nicht einfach mit Plot darstellen lässt? Oder möchtest du wirklich die Häufigkeit jeder Profilehöhe ermitteln? Damit lässt sich keine Aussage für dein Problem machen. Siehe folgendes Minimalbeispiel:
Code:
za = [115202525]; % Profil a
zb = [252012551]; % Profil b
Wie du siehst sind die Histogramme identisch, jedoch die Profile komplett unterschiedlich, d.h. "hist" als Gleichheits-Kriterium (und sei es nur visuell) zu verwenden ist nicht möglich (wenn du es positionsgebunden machen möchtest).
Ansonsten wird im folgenden Beispiel die prinzipielle Verwendung von interp1 gezeigt:
Code:
x = 1:10;
y = sin(x);
x2 = 1:0.001:10; % hierfür werden die y-Werte gesucht
y2 = interp1(x,y,x2,'spline');
figure,plot(x,y);
figure,plot(x2,y2)
die Histogramme waren mein erster Ansatz und ich dachte tatsächlich, dass ich anhand der Ähnlichkeit der Histogramm-Glocke bzw. Kurve auf ähnliche Profile rückschließen könnte. Aus Interesse habe ich den Code nun einfach noch drin gelassen um mir anzusehen, wie die hist-Diagramme aussehen. Aber wie du sagst, deren Aussagegehalt schwindet.
Die mir zur Verfügung gestellten ASC-Files sind dreidimensionale Oberflächenprofile einer Rechteckfläche. Daher auch die X, Y udn Z Werte. Ich hab diese dann als eine endliche Anzahl (X-Stück) von Rauigkeitsprofile der Form z = f(y) interpretiert und betrachte daher alle Z-Werte. Vermutlich wird man später dann noch eine Betrachtung der Form z = f(x) für alle y machen müssen. Aber soweit bin ich noch nicht.
Das eigentlich ärgerliche ist, dass die Messeinrichtung keine reduzierte Vermessung vornehmen kann. Diese kann lediglich mit voller Feinheit messen (1x1-Pixel) und diese Messung eben grob exportieren. Druch Weglassen des 2ten oder 3ten Pixels usw. Daher die Bezeichnung der Profile: 3x3, 10x10 usw. Jeweils nur der 3te bzw 10te Pixel in x und y wurde exportiert.
Ich habe unten ein Oberfläche als jpg angefügt. Gezeigt wird ein 1x1-Export von ca. 2 mio. Punkte. Die Idee ist nun aber weniger Punkte verarbeiten zu müssen da diese 2 mio Punkte schon recht intensiv das System belasten. Vorallem die Plots lassen sich kaum drehen oder betrachten.
Ich hoffe, dass alle Fragen beseitigt sind und der Ansatz über interp1 nicht sooo falsch ist - einen anderen habe ich nämlich noch nicht
ok nun habe ich es verstanden . In deinem Fall funktioniert interp1 nicht, da du ja eine Flaesche interpolieren moechtest. Hierfuer solltest du interp2 verwenden. Ausnahme waere natuerlich wenn du deine Flaesche Zeilen- (X-Z) oder Spaltenweise (Y-Z) vergleichen moechtest (alo 2D statt 3D), dann muesstest du interp1 verwenden. Siehe folgendes Beispiel fuer interp2:
Ich bekomme nur ein Problem mit interp2 - und zwar erhalte ich folgende Fehlermeldung bei folgendem Code:
Code:
% Lese Datei A ein und Interpoliere
a = load('test_3x3.asc');
disp(['Länge: ' num2str(length(a))]);
xa = a(:,1);
ya = a(:,2);
za = a(:,3);
%[Xa,Ya,Za] = meshgrid(xa,ya,za) [Xia,Yia] = meshgrid(-3:0.01:3,-3:0.01:3);
za2 = interp2(xa, ya, za, Xia, Yia,'cubic');
% Lese Datei A ein und Interpoliere
a = load('test_3x3.asc');
disp(['Länge: ' num2str(length(a))]);
xa = a(:,1);
ya = a(:,2);
za = a(:,3);
[Xa,Ya,Za] = meshgrid(xa,ya,za) [Xia,Yia] = meshgrid(-3:0.01:3,-3:0.01:3);
za2 = interp2(Xa, Ya, Za, Xia, Yia,'cubic');
es bleibt schwierig. Kannst du mir bitte einmal zeigen wie du das Bild "Wolke2m_vorher.jpg" erzeigt hasst. Das Problem ist naemlich folgendes:
Nehmen wir an du hasst wie in deinem Fall einen 3D Datensatz:
Werte fuer x: z.B: 1 bis 10
Werte fuer y: z.B: 1 bis 10
Nun erstellen wir unser Grid mit "meshgrid" und erhalten ein 10x10 Grid, welches unsere x-y Ebene aufspannt. Nun brauchen wir natuerlich auch noch die z-werte zu jedem x-,y-Wertepaar, also eine 10x10 Matrix. In deinem Fall sind die z-werte jedoch ein Vektor (1x 223304). Was muessen wir also mit diesen Punkten tun um unser z-Grid zu bekommen? Vielleicht etwas in der Art (fuer unser oben erstellten Beispiel):
Jedoch kann ich deine z-Werte nicht deuten, bzw. welchen Punkt im Koordinatensystem (x-y) ein z-Wert entspricht? Dementsprechend kann ich dir auch nicht helfen.
Der Aufbau der asc-file ist folgender:
Es wird zuerst inkrementweise (3 oder 10 oder y Pixel) in X-Richtung die Z-Werte bei Y=0 gemessen, d.h ich erhalte in der asc-File N-Zeile die in der ersten Spalte die Werte für X der Form 0:inkrement:N haben und in der zweiten Spalte für Y = 0 haben und in der Dritten den gemessenen Z-Wert.
Danach wird wieder inkrementweise in X-Richtung die Z-Werte gemessen, diesmal bei Y = 0 + inkrement. Ich erhalte unter den obigen Werten wieder N-Werte der Form X = 1:inrkement:N; Y = 0 + inkrement und Z-Werte eben das gemessene. Das geht so weiter bis Y = 0:inkrement:N erreicht wurde.
Das Format erhalte ich aus der Messeinrichtung und kann lediglich das Inkrement ändern. Eben 3 Pixel oder 10Pixel oder XY-Pixel. Es handelt sich um ein optisches Messsystem, daher die Abtastung über Pixel.
Nach dem mir die Z-Werte klar wurden, also zeilenweises Messen der z-Werte für laufende x-Werte bei einen y-Wert, dass ich diese einfach als sehr sehr langen Rauigkeitschrieb interpretieren kann. In dem ich mir einfach vorstelle, dass die Z-Werte nicht über x-y aufgetragen werden, sondern kontinuierlich hintereinander.
ok, wenn du einfach alle z-werte aller "y-Zeilen" (x = 1:end) einfach hintereinander betrachtest, dann koennen wir natuerlich wieder interp1 verwenden. Dies ist auch wesentlich besser bezueglich der Geschwindigkeit und vorallem der Datenmenge die verarbeitet werden kann. Hier ein Minimalbeispiel fuer deinen Anwenungsfall:
Gegeben ist ein Datensatz (Profilhoehen) mit 10 Werten (10x1). Wir moechten nun den selben Datensatz auf 100 Werte interpolieren (100x1)
Dies sollte genau das sein was du moechtest. Das Problem bei deinen Daten ist jedoch, dass es nicht ganz so einfach ist, wegen deinen Inkrementierungen. Betrachten wir Beispielsweise die erste Zacke "nach unten" in beiden Datensaetzen (aus dem Rar-File), so ist diese bei dem 10x10 Datensatz bei x=44 und bei dem 3x3 Datensatz bei x=145 --> Faktor 10/3 Unterschied (entspricht den Inkrementierungen). Dies musst du also sowohl fuer die X-,als auch Y-Achse beachten fuer den "interp1"-Befehl (bzw. bei "linspace")!
Edit: ein Beispiel fuer ca. eine X-Zeile:
Code:
a = load('test_10x10.asc');
xa = a(:,1);
ya = a(:,2);
za = a(:,3);
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.