1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4% Berechnet Hologramm für die Zernikekorrektur
5% Angabe der Gewichtungsfakroten der ersten 13 Zernikepolynome als
8% Noch nicht fertig implementiert
12%Letzte Änderung: 30.11.2022
13%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17%Paremeter#######################
21bias = (2^(n_exponent-1)-1);
22depth = 1+n_fraction+n_exponent;
23%################################
25Hologram = evalin(
'base',
'Hologram');%#Hochgradig ineffiziente Lösung!!!
26SLM = evalin(
'base',
'SLM');%#Hochgradig ineffiziente Lösung!!!
27Camera = evalin(
'base',
'Camera');%#Hochgradig ineffiziente Lösung!!!
36 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
42% disp('Abbruch! \n Population * Elite muss durch 2 teilbar sein! \n 1:population*elite muss ganze Zahl sein');
44% %
#Später abändern, dass das kein Problem mehr ist
47%#Auswahl Kamera oder Calculated
51%Start, Startpopulation
66konvergenz = single(zeros(
Hologram.ga_iteration,1));
73 if(rand()<
Hologram.ga_mutationProb/100)
74 n0(n,o,p) = ~n0(n,o,p);
81 while(size(n0,3)<=
Hologram.ga_population)
83 randVector = int16(randperm(size(n0,3)));
84 n1 =
false(zernike,depth,size(n0,3));
85 for individuum = 1:size(n0,3)
86 n1(:,:,individuum)= n0(:,:,randVector(individuum));
90 n0 =
false(size(n1,1),size(n1,2),floor(size(n1,3)/2));
92 for p = 2:2:size(n1,3)
93 child(:,:) = int8(n1(:,:,p)+n1(:,:,p-1));
96 %Zufällige Gen-Weitergabe
98 n0(m,n,p/2)=round(rand());
107 n0= logical(cat(3, n1,n0));
111 evaluation = zeros(size(n0,3),1);
112 %Binärcode in Bild umwandeln
113 w = zeros(size(n0,1),size(n0,3));
115 %Hier Auswahl Binärecode / Graycode
118 s = zeros(size(n0,1),size(n0,3));
119 exponent = zeros(size(n0,1),size(n0,3));
120 fraction = zeros(size(n0,1),size(n0,3));
122 s(:,:) = (-1.*ones(size(n0,1),size(n0,3))).^reshape(n0(:,1,:),[size(n0,1),size(n0,3)]);
124 exponent(:,:) =
double(exponent(:,:) + 2^(n-2)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
126 for n=2+n_exponent:depth
127 fraction(:,:) =
double(fraction(:,:) + 2^-(n-10)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
130 w=s.*(1+fraction).*2.^(exponent-bias);
133 elseif (
Hologram.ga_bitCode == "gray")
134 disp("ERROR! GrayCode not implemented");
136 disp("ERROR! Unknown BitCode");
141 if(
Hologram.ga_evaluation == "calculated")
143 %Berechnetes Bild zur Evaluation
144 result = abs(fftshift(fft2(fftshift(abs(inputBeam).*
Zernike(w(:,q))))));
145 result = result/
max(
max(result));
146 evaluation(q)=single(sum(sum(abs((result(:,:)-target(:,:)).^2))));
148 %
#Hier beachten, dass Pixel unterschiedlich groß sind!
151 %Gemessenes Bild zur Evaluation
152 beamProfile=
Camera.getImage();
153 %
#Hier Bildgröße anpassen
155 result = result/
max(
max(result));
156 evaluation(q)=single(sum(sum(abs((result(:,:)-target(:,:)).^2))));
158 disp(
"ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
161 evaluation=single(evaluation(:,1));
165 [error,ind]=sort(evaluation);
168 n1(:,:,k) = n0(:,:,ind(k));
175 if(evalin('base','
Hologram.displayProgress'))
176 if(mod(i/
Hologram.ga_iteration*100,10)==0)
177 disp(strcat(
string(i/
Hologram.ga_iteration*100),"%"));
180 konvergenz(i)=single(error(1));
185w = zeros(size(n0,1),size(n0,3));
187s = zeros(size(n0,1),size(n0,3));
188 exponent = zeros(size(n0,1),size(n0,3));
189 fraction = zeros(size(n0,1),size(n0,3));
191 s(:,:) = (-1.*ones(size(n0,1),size(n0,3))).^reshape(n0(:,1,:),[size(n0,1),size(n0,3)]);
193 exponent(:,:) =
double(exponent(:,:) + 2^(n-2)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
195 for n=2+n_exponent:depth
196 fraction(:,:) =
double(fraction(:,:) + 2^-(n-10)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
199 w=s.*(1+fraction).*2.^(exponent-bias);
205%bei Bedarf auskommentieren
function Genetic_Algorithm_Zernike()
Genetischer Algorithmus berechnet Hologramm für die.
function Phase_Image(in image)
Gibt die Phase eines Hologramms als Graustufenmatrix aus.
function Scale_and_ResizeImage(in input, in x, in y, in mode, in pixelPitchInput, in pixelPitchOutput)
Passt ein Bild an eine andere Auflösung an. Zusätzlich zur Funktion "ResizeImage" wird hier die Pixelgröße de...
function Zernike(in weighting)
Ermöglicht die Wellenfrontkorrektur für ein SLM-Bild durch Angabe der Gewichtungsfaktoren der einzelnen Zerni...
Property pixelPitch
Pixelgröße in mm.
Hologramme werden als Objekte vom Typ Hologram dargestellt.
Property ga_image
Dateipfad zu dem Bild, welches dargestellt werden soll.
Property inputBeam_source
Property pixelPitch
Abstand der Pixel.
Property ga_population
Population = Anzahl der Bilder, die in jedem Schritt getestet werden.
Property pixelX
Auflösung der Berechnung.
Property ga_color
'grayValues' oder 'binary' Konvertierung des darzustelenden Bildes in Graustufen oder Schwarz-Weiß
Property ga_invertColors
Invertierung der Farben.
Property ga_resizeMode
'stretch', 'original', 'repeat' Anpassung des Bildes an die Hologrammauflösung
Property ga_limitGrayLevel
Schwellwert für die Schwarz-Weiß-Konvertierung.
function beamImage(in obj, in source, in name)
Gibt Bild des Eingangsstrahls aus.
Property ga_evaluation
'calculated' oder 'camera' Auswahl der Methode zur Evaluation der Bilder. Bei 'calculated' wird die I...
function prepImage(in path, in x, in y, in resizeMode, in color, in limitGrayLevel, in invert)
function setWS(in field, in param, in value)