4 properties (Access =
public)
6 displayProgress =
true;
7 send2SLMWhenFinished =
false;
8 saveImageWhenFinished =
false;
14 angleCalibrationFactor;
15 lensCalibrationFactor;
17 adaptSize = 'original';
29 inputBeam_source = 'calculated';
30 inputBeamDiameter=1;%[mm]
33 %Hier werden die Eingabeparameter aller zur Auswahl stehender
34 %Algorithmen gespeichert
35 %Der 'add
####'-Parameter gibt jeweils an, ob der Algorithmus bei
36 %der Berechnung ausgeführt wird.
38 addPrismAndLens =
false;
44 spotList = zeros(8,4);
56 addGerchbergSaxton =
false;
58 gs_startPhase =
'random';
59 gs_quadraticParameter = 1;
62 gs_resizeMode =
'stretch';
63 gs_color =
'grayValues';
64 gs_limitGrayLevel = 128;
65 gs_invertColors =
false;
70 %G>enetischer Algorithmus
71 addGeneticAlgorithm =
false;
72 ga_startPhase =
'random';
78 ga_bitCode =
'binary';
81 ga_resizeMode =
'original';
82 ga_color =
'grayValues';
83 ga_limitGrayLevel = 128;
84 ga_invertColors =
false;
85 ga_evaluation =
'calculated';
89 addRandomPhase =
false;
90 maximumRandomPhase = 0; %[%]
93 weighting = zeros(13);
106 %Standardspeicherort für Hologrammbilder
107 strcat(evalin(
'base',
'matlabPath'),
'\data\HologramImages');
110 obj.pixelX = evalin(
'base',
'SLM.pixelX');
111 obj.pixelY = evalin(
'base',
'SLM.pixelY');
112 obj.pixelPitch = evalin(
'base',
'SLM.pixelPitch');
113 obj.angleCalibrationFactor = evalin(
'base',
'SLM.angleCalibrationFactor');
114 obj.lensCalibrationFactor = evalin(
'base',
'SLM.lensCalibrationFactor');
116 disp(
'Hologram size not defined!');
120 obj.wavelength = evalin(
'base',
'Laser.wavelength;');
121 obj.inputBeamDiameter = evalin(
'base',
'Laser.rawBeamDiameter;');
123 disp(
'Wavelength not defined!');
127 function matrix = distanceFromCenter(obj)
129 matrix=zeros(obj.pixelX,obj.pixelY);
132 % Abstand zum Bildmittelpunkt
133 dx= obj.pixelPitch*(-obj.pixelX*0.5-0.5+ki);
134 dy= obj.pixelPitch*(-obj.pixelY*0.5-0.5+kj);
135 matrix(ki,kj) = sqrt((dx).^2+(dy).^2);
140 function matrix = distanceFromPoint(obj,x0,y0)
142 matrix=zeros(obj.pixelX,obj.pixelY);
145 dx= obj.pixelPitch*(-obj.pixelX*0.5-0.5+ki)-x0;
146 dy= obj.pixelPitch*(-obj.pixelY*0.5-0.5+kj)-y0;
147 matrix(ki,kj) = sqrt((dx).^2+(dy).^2);
152 function [array] = angle(obj,x0, y0)
155 array=zeros(obj.pixelX,obj.pixelY);
158 %Abstand zum Bildmittelpunkt
159 dx= obj.pixelPitch*(-obj.pixelX*0.5-0.5+ki)-x0;
160 dy= obj.pixelPitch*(-obj.pixelY*0.5-0.5+kj)-y0;
162 array(ki,kj) = atand(dy/dx)+180;
164 array(ki,kj) = atand(dy/dx);
170 function [image] = beamImage(obj, source, name)
172 %Source =
'calculated',
'fromFile',
'measured'
173 %Name = Strahlform bei Calculated source, Dateiname bei
175 if(source ==
"calculated") %Berechnung eines idealen Gaussstrahls
177 d0 = evalin(
'base',
'Laser.rawBeamDiameter;');
178 r=obj.distanceFromCenter();
180 image =
Aperture(image, 0,evalin(
'base',
'Laser.aperture;'));
182 disp(
"Error, unknown beam shape.");
184 elseif(source ==
"fromFile") %Nutzung eines zuvor aufgenommenen/berechneten Strahlprofils
185 disp(
"#METHODE NOCH NICHT IMPLEMENTIERT");
186 elseif(source ==
"measured") %Aufnahme eines Strahlprofils mit der Kamera
187 disp(
"#METHODE NOCH NICHT IMPLEMENTIERT");
192 function hologram = calculate (obj)
194 %später Fortschritt ausgeben
197 %Schritt 0: Speicherplatz reservieren
198 hologram = zeros(obj.pixelX,obj.pixelY); %Das Hologramm ist eine Matrix aus Komplexen Zahlen, bei denen der Betrag die Intensität und der Winkel die Phase angibt
201 %Schritt 1: Hologramm berechnen
202 if(obj.addPrismAndLens)
203 obj.progress(
'Calculating Prism & Lens');
207 obj.progress(
'Calculating Multispot');
208 hologram = hologram + angle(
Multispot(obj.spotList));
211 obj.progress(
'Calculating Axicon');
212 hologram = hologram + angle(
Axicon_Hologram(obj.alpha,obj.ax_x0,obj.ax_y0));
215 obj.progress(
'Calculating Vortex');
218 if(obj.addRandomPhase)
219 obj.progress(
'Calculating RandomPhase');
220 hologram = hologram + angle(
Random_Phase(obj.maximumRandomPhase));
223 obj.progress(
'Calculating Zernike Polynoms');
224 hologram = hologram + angle(
Zernike(obj.weighting));
226 if(obj.addGerchbergSaxton)
227 obj.progress(
'Calculating Gerchberg & Saxton Algorithm');
230 if(obj.addGeneticAlgorithm)
231 obj.progress(
'Calculating Genetic Algorithm');
235 obj.progress(
'Calculating Aperture');
239 obj.progress(
'Calculation finished');
243 %Schritt 2: Variablen speichern und für GUI vorbereiten
244 hologramPlane = abs(obj.beamImage(obj.inputBeam_source,
"gauss")).*exp(1i*(hologram));%##gauss ggf. später noch ändern
245 imagePlane =
Hologram_FFT(hologramPlane);%####Fehler? Berechnung der Fernfeldintensitätsverteilung mittels FFT
246 %Speichern der Ergebnisse als Graustufenmatrix
252 %Schritt 3: An
SLM senden
253 if(obj.send2SLMWhenFinished)
254 SLM = evalin(
'base',
'SLM;');
258 %Schritt 4: Bild ggf. Speichern
259 if(obj.saveImageWhenFinished)
267 function saveImages (obj)
269 obj.savePath = strcat(evalin(
'base',
'path'),
'\HologramImages');
270 obj.saveNo = obj.saveNo + 1;
271 pathInputPhase = strcat(obj.savePath,
'\',obj.saveName,
'inputPhase',obj.saveName,
'_',num2str(obj.saveNo),
'.png');
272 imwrite(obj.inputPhase,pathInputPhase);
273 pathInputAmplitude = strcat(obj.savePath,
'\',obj.saveName,
'inputAmplitude',obj.saveName,
'_',num2str(obj.saveNo),
'.png');
274 imwrite(obj.inputAmplitude,pathInputAmplitude);
275 pathFarfieldPhase = strcat(obj.savePath,
'\',obj.saveName,
'farFieldPhase',obj.saveName,
'_',num2str(obj.saveNo),
'.png');
276 imwrite(obj.farFieldPhase,pathFarfieldPhase);
277 pathFarfieldAmplitude = strcat(obj.savePath,
'\',obj.saveName,
'farFieldAmplitude',obj.saveName,
'_',num2str(obj.saveNo),
'.png');
278 imwrite(obj.farFieldAmplitude,pathFarfieldAmplitude);
281 %Gibt den Fortschritt der Berechnung im Command Window von Matlab aus
283 function progress(obj,message)
284 if(obj.displayProgress)
285 disp(strcat(num2str(toc/60),
' min: ',message))
295 storage = evalin(
'base',
'Hologram'); %Das aktuell in der Workspace gespeicherte Hologramm wird hiermit vorm Überschreiben geschützt
296 for n = 1:1:size(list,1)
297 %Die einzelnen Hologramme in der Liste werden nacheinander
299 assignin(
'base',
'Hologram',list(n))
300 evalin(
'base',
'Hologram.calculate();');
302 assignin(
'base',
'Hologram',storage); %Das zuvor gespeicherte Hologramm wird wieder in den Workspace gesetzt
function Amplitude_Image(in image)
Extrahiert aus einem Hologrammbild die Amplitude und skaliert sie auf den Raum 0 (schwarz) bis 1 (wei...
function Aperture(in input, in r_i, in r_a)
Schneidet aus dem Hologramm eine Ringlochblende heraus.
function Axicon_Hologram(in alpha, in x0, in y0)
Phasenbild für ein Axikon, welches an der Stelle (x0,y0) auf dem SLM seinen Mittelpunkt hat.
function Genetic_Algorithm()
Genetischer Algorithmus. Berechnet ein Phasenbild für eine bestimmte Intensitätsverteilung basierend auf dem...
function Gerchberg_Saxton()
Erstellt das Hologramm für den Gerchberg-Saxton-Algorithmus.
function Hologram_FFT(in image)
function Multispot(in list)
Erstellt eine Graustufenmatrix, welche direkt auf den SLM übertragen wird.
function Phase_Image(in image)
Gibt die Phase eines Hologramms als Graustufenmatrix aus.
function Prism_and_Lens(in phix, in phiy, in z)
Erstellt eine Graustufenmatrix, welche direkt auf den SLM übertragen wird. Erstellt das Hologramm für einen Pri...
function Random_Phase(in maxRandom)
Erstellt Matrix mit Zufallsphase im Bereich [0, maxRandom]. Dient zur Reduzierung der Symmetrie von d...
function Vortex_Hologramm(in charge, in x0, in y0)
Erstellt eine Graustufenmatrix, welche direkt auf den SLM übertragen werden kann. Phasenbild für einen Vortexst...
function Zernike(in weighting)
Ermöglicht die Wellenfrontkorrektur für ein SLM-Bild durch Angabe der Gewichtungsfaktoren der einzelnen Zerni...
Hologramme werden als Objekte vom Typ Hologram dargestellt.
virtual sendImage(in obj, in image)
Überträgt Bild als Graustufenmatrix an den SLM (Bild muss Intensitätswerte im Bereich 0 bis 1 haben)
function gaussmf(in x, in params)