LAT Hologramm-Software 2.0
Loading...
Searching...
No Matches
Hologram.m
Go to the documentation of this file.
1
2classdef Hologram < handle
3
4 properties (Access = public)
5
6 displayProgress = true;
7 send2SLMWhenFinished = false;
8 saveImageWhenFinished = false;
9
10 pixelX;
11 pixelY;
12 pixelPitch;
13 grayLevels;
14 angleCalibrationFactor;
15 lensCalibrationFactor;
16 wavelength;
17 adaptSize = 'original';
18
19 inputPhase;
20 inputAmplitude;
21 farFieldPhase;
22 farFieldAmplitude;
23 displayDuration;
24
25 savePath;
26 saveName = "";
27 saveNo=0;
28
29 inputBeam_source = 'calculated';
30 inputBeamDiameter=1;%[mm]
32 %Algorithmen:
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;
39 phiX = 0;
40 phiY = 0;
41 z = 0;
42
43 addMultispot = false;
44 spotList = zeros(8,4);
45
46 addAxicon = false;
47 alpha = 0;
48 ax_x0 = 0;
49 ax_y0 = 0;
50
51 addVortex = false;
52 charge = 1;
53 vo_x0 = 0;
54 vo_y0 = 0;
55
56 addGerchbergSaxton = false;
57 gs_iteration = 1;
58 gs_startPhase = 'random';
59 gs_quadraticParameter = 1;
61 gs_image;
62 gs_resizeMode = 'stretch';
63 gs_color = 'grayValues';
64 gs_limitGrayLevel = 128;
65 gs_invertColors = false;
66 gs_convergence;
67 gs_plot = false;
68
69
70 %G>enetischer Algorithmus
71 addGeneticAlgorithm = false;
72 ga_startPhase = 'random';
73 ga_population=1;
74 ga_mutationProb=1;
75 ga_elite=0;
76 ga_iteration=1;
77 ga_imageDepth = 8;
78 ga_bitCode = 'binary';
79
80 ga_image;%#s.o.
81 ga_resizeMode = 'original';
82 ga_color = 'grayValues';
83 ga_limitGrayLevel = 128;
84 ga_invertColors = false;
85 ga_evaluation = 'calculated';
86 ga_convergence = 0;
87 ga_plot = false;
88
89 addRandomPhase = false;
90 maximumRandomPhase = 0; %[%]
91
92 addZernike = false;
93 weighting = zeros(13);
95 addAperture = false;
96 r_i=0; %[mm]
97 r_a=0; %[mm]
98
99 end
101
102
103 methods
104 function obj = Hologram()
105
106 %Standardspeicherort für Hologrammbilder
107 strcat(evalin('base','matlabPath'),'\data\HologramImages');
108
109 try
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');
115 catch
116 disp('Hologram size not defined!');
117 end
118
119 try
120 obj.wavelength = evalin('base', 'Laser.wavelength;');
121 obj.inputBeamDiameter = evalin('base', 'Laser.rawBeamDiameter;');
122 catch
123 disp('Wavelength not defined!');
124 end
125 end
126
127 function matrix = distanceFromCenter(obj)
128
129 matrix=zeros(obj.pixelX,obj.pixelY);
130 for ki=1:obj.pixelX
131 for kj=1: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);
136 end
137 end
138 end
139
140 function matrix = distanceFromPoint(obj,x0,y0)
141
142 matrix=zeros(obj.pixelX,obj.pixelY);
143 for ki=1:obj.pixelX
144 for kj=1: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);
148 end
149 end
150 end
151
152 function [array] = angle(obj,x0, y0)
153 %#auf Bug prüfen!
154 %ALLES IN mm!
155 array=zeros(obj.pixelX,obj.pixelY);
156 for ki=1:obj.pixelX
157 for kj=1: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;
161 if(dx>0)
162 array(ki,kj) = atand(dy/dx)+180;
163 else
164 array(ki,kj) = atand(dy/dx);
165 end
166 end
167 end
168 end
169
170 function [image] = beamImage(obj, source, name)
172 %Source = 'calculated', 'fromFile', 'measured'
173 %Name = Strahlform bei Calculated source, Dateiname bei
174 %fromFile
175 if(source == "calculated") %Berechnung eines idealen Gaussstrahls
176 if(name == "gauss")
177 d0 = evalin('base', 'Laser.rawBeamDiameter;');
178 r=obj.distanceFromCenter();
179 image = gaussmf(r,[d0/4 0]);
180 image = Aperture(image, 0,evalin('base', 'Laser.aperture;'));
181 else
182 disp("Error, unknown beam shape.");
183 end
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");
188 end
189
190 end
192 function hologram = calculate (obj)
193
194 %später Fortschritt ausgeben
195 tic;
196
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
199
200
201 %Schritt 1: Hologramm berechnen
202 if(obj.addPrismAndLens)
203 obj.progress('Calculating Prism & Lens');
204 hologram = hologram + angle(Prism_and_Lens(obj.phiX,obj.phiY,obj.z));
205 end
206 if(obj.addMultispot)
207 obj.progress('Calculating Multispot');
208 hologram = hologram + angle(Multispot(obj.spotList));
209 end
210 if(obj.addAxicon)
211 obj.progress('Calculating Axicon');
212 hologram = hologram + angle(Axicon_Hologram(obj.alpha,obj.ax_x0,obj.ax_y0));
213 end
214 if(obj.addVortex)
215 obj.progress('Calculating Vortex');
216 hologram = hologram + angle(Vortex_Hologramm(obj.charge, obj.vo_x0, obj.vo_y0));
217 end
218 if(obj.addRandomPhase)
219 obj.progress('Calculating RandomPhase');
220 hologram = hologram + angle(Random_Phase(obj.maximumRandomPhase));
221 end
222 if(obj.addZernike)
223 obj.progress('Calculating Zernike Polynoms');
224 hologram = hologram + angle(Zernike(obj.weighting));
225 end
226 if(obj.addGerchbergSaxton)
227 obj.progress('Calculating Gerchberg & Saxton Algorithm');
228 hologram = hologram + angle(Gerchberg_Saxton());
229 end
230 if(obj.addGeneticAlgorithm)
231 obj.progress('Calculating Genetic Algorithm');
232 hologram = hologram + angle(Genetic_Algorithm());
233 end
234 if(obj.addAperture)
235 obj.progress('Calculating Aperture');
236 hologram = Aperture(hologram,obj.r_i,obj.r_a);
237 end
238 %Zeit
239 obj.progress('Calculation finished');
241
242
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
247 obj.inputPhase = Phase_Image(hologramPlane);
248 obj.inputAmplitude = Amplitude_Image(hologramPlane);
249 obj.farFieldPhase = Phase_Image(imagePlane);
250 obj.farFieldAmplitude = Amplitude_Image(imagePlane);
251
252 %Schritt 3: An SLM senden
253 if(obj.send2SLMWhenFinished)
254 SLM = evalin('base', 'SLM;');
255 SLM.sendImage(obj.inputPhase);
256 end
257
258 %Schritt 4: Bild ggf. Speichern
259 if(obj.saveImageWhenFinished)
260 obj.saveImages();
261 end
262
263 %figure();
264 %imshow(Phase_Image(hologramPlane));
265 end
266
267 function saveImages (obj)
268
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);
279 end
280
281 %Gibt den Fortschritt der Berechnung im Command Window von Matlab aus
282
283 function progress(obj,message)
284 if(obj.displayProgress)
285 disp(strcat(num2str(toc/60),' min: ',message))
286 end
287 end
288 end
289
290 methods (Static)
291
292 function calc(list)
293
294
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
298 %berechnet
299 assignin('base','Hologram',list(n))
300 evalin('base','Hologram.calculate();');
301 end
302 assignin('base','Hologram',storage); %Das zuvor gespeicherte Hologramm wird wieder in den Workspace gesetzt
303 end
304
305 function sayHi()
306 disp('Hi')
307 end
308 end
309end
310
311
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.
Definition: Hologram.m:11
Definition: SLM.m:7
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)
#define true
Definition: nuts_bolts.h:26
#define false
Definition: nuts_bolts.h:25