LAT Hologramm-Software 2.0
Loading...
Searching...
No Matches
Gerchberg_Saxton.m
Go to the documentation of this file.
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% Funktion
3%
4% Erstellt das Hologramm für den Gerchberg-Saxton-Algorithmus.
5%
6%
7%Autor: Jan Marx
8%Letzte Änderung: 28.09.2022
9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10
11function [image] = Gerchberg_Saxton()
13Hologram = evalin('base', 'Hologram');%Einlesen der Parameter
14
15%Variablen anlegen
16hologramPlane = zeros(Hologram.pixelX, Hologram.pixelY);
17imagePlane = zeros(Hologram.pixelX, Hologram.pixelY);
18hologramPlaneModified = zeros(Hologram.pixelX, Hologram.pixelY);
19imagePlaneModified = zeros(Hologram.pixelX, Hologram.pixelY);
20
21inputAmplitude = Hologram.beamImage(Hologram.inputBeam_source, "gauss");
22%Anpassung des Target-Image an die Berechnung
23targetAmplitude = double(prepImage(Hologram.gs_image,Hologram.pixelX,Hologram.pixelY, Hologram.gs_resizeMode, Hologram.gs_color, Hologram.gs_limitGrayLevel, Hologram.gs_invertColors));
24
25hologramPhaseStart = zeros(Hologram.pixelX, Hologram.pixelY);
26if(Hologram.gs_startPhase == "random")
27 %Start mit Zufallsphase
28 hologramPhaseStart = rand(Hologram.pixelX, Hologram.pixelY)*2*pi;
29elseif(Hologram.gs_startPhase == "quadratic")
30 %Start mit quadratischer Phase
31 hologramPhaseStart = Hologram.gs_quadraticParameter * Hologram.distanceFromCenter().^2*2*pi;
32else
33 disp("ERROR -Unknown GS-Start Phase");
34end
35
36%Startbild
37hologramPlaneModified = inputAmplitude.*exp(1i*hologramPhaseStart);
38
39konvergenz = single(zeros(Hologram.gs_iteration,1)); %Speicherplatz reservieren für Fehler
40
41%Iteration
42for n= 1:1:Hologram.gs_iteration
43
44 imagePlane = fftshift(fft2(fftshift(hologramPlaneModified))); %Transformieren in die Bildebene
45 imagePlaneModified = abs(targetAmplitude).*exp(1i*angle(imagePlane));%Phase behalten, Amplitude durch Bild ersetzen
46
47 hologramPlane = fftshift(ifft2(fftshift(imagePlaneModified))); %Transformieren in die SLM-Ebene
48 hologramPlaneModified = abs(inputAmplitude).*exp(1i*angle(hologramPlane)); %Phase behalten, Amplitude durch Gauss ersetzen
49
50 %Fehlerberechnung
51 result = abs(imagePlane(:,:));
52 result_max = max(max(result));
53 result = result./(ones(size(result)).*result_max);
54 konvergenz(n)=single(sum(sum(abs((result-targetAmplitude(:,:)).^2))));
55
56 %Zwischenausgabe Berechnungsfortschritt
57 if(evalin('base','Hologram.displayProgress'))
58 if(mod(n/Hologram.gs_iteration*100,10)==0)
59 disp(strcat(string(n/Hologram.gs_iteration*100),"%"));
60 end
61 end
62
63end
64
65
66setWS('Hologram','gs_convergence',konvergenz/Hologram.pixelX/Hologram.pixelY);
67
68if(Hologram.gs_plot)
69 %Fehler über Iterationen plotten
70 figure();
71 plot(konvergenz/Hologram.pixelX/Hologram.pixelY);
72end
73
74%Ausgabe als Komplexe Matrix
75image = exp(1i*angle(hologramPlane));
76
77
78end
79
function Gerchberg_Saxton()
Erstellt das Hologramm für den Gerchberg-Saxton-Algorithmus.
Hologramme werden als Objekte vom Typ Hologram dargestellt.
Definition: Hologram.m:11
Definition: SLM.m:7
#define max(a, b)
Definition: nuts_bolts.h:56
function prepImage(in path, in x, in y, in resizeMode, in color, in limitGrayLevel, in invert)
function setWS(in field, in param, in value)