⛄一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【光学】基于matlab GS算法高斯光转换成高阶高斯光+一阶空心高斯光+贝塞尔高斯光【含Matlab源码 2166期】
点击上面蓝色字体,直接付费下载,即可。
获取代码方式2:
付费专栏Matlab物理应用(初级版)
备注:
点击上面蓝色字体付费专栏Matlab物理应用(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab物理应用(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码
⛄二、GS算法原理简介
GS算法是相位恢复技术中的一种经典算法,而相位恢复技术是指利用直接测量得到的强度信息通过一系列计算得到物体的相位信息,从而重建原物体的波函数.相位恢复算法的主要算法有两类:GS迭代算法和基于TIE方程的方法.Gerchberg等人在1972年提出了Gerchberg-Saxton算法(简称GS算法),主要思想是在图像空间和傅立叶空间之间利用已知的信息或者约束来重复迭代.后来国内外学者在GS算法的基础上也先后提出了很多的改进算法,提高了算法的精度和收敛速度.GS算法原理如下:设光束的光场函数为
其对应的聚焦平面上的光场函数可以表示为
其中,|f(x,y)|2,|g(x,y)|2为强度信息,φ1(x,y),φ2(x,y)为相位信息.其中,f和g满足正反傅立叶变换的关系.GS算法流程图如图1所示,具体思想是任意给定一输入面上的初始相位,这里的相位可以是随机的相位.然后与入射光的振幅组合在一起,构成入射波函数f(x,y),再对入射波函数f(x,y)作傅立叶变换,这时得到函数g(u,v),对函数g(u,v)的相位部分,再与输出面上希望得到的振幅分布函数|G(u,v)|构成函数g′(u,v).然后对函数g′(u,v)作逆傅立叶变换,这时将得到下一步迭代波函数f′(x,y),最后取其相位部分代入原初始相位中.重复上述过程一直到设定的迭代次数或者误差小于预先设置好的值为止.
图1 GS算法流程图
⛄三、部分源代码
clear all;close all;clc;
%--------------------------------------------------------------------------
d0=0.008; % 单位 mm
%--------------------------------------------------------------------------
x01=-7.672:d0:7.68;
y01=-4.312:d0:4.32;
[x011,y011]=meshgrid(x01,y01); % LCSLM面坐标
x0=x011’; y0=y011’;
[m0,n0]=size(x0);
%--------------------------------------------------------------------------
d=0.008; % 单位 mm
%--------------------------------------------------------------------------
x1=-7.672:d:7.68;
y1=-4.312:d:4.32;
[x11,y11]=meshgrid(x1,y1); % 输出面坐标
x=x11’; y=y11’;
[m,n]=size(x);
%--------------------------------------------------------------------------
lambda=633e-6; % 单位 mm
w=0.9sqrt(2); %单位 mm 为测得输入光斑(e-1)处半径的sqrt(2)倍
L=500; % 单位 mm
f0=exp(-((x0./w).2+(y0./w).2)); % 给定输入光束的复振幅分布 矩阵大小为 m0n0
f0=f0/sqrt(sum(sum(f0.^2)));
phi=rand(m0,n0); % m0n0
figure(1),mesh(f0),view(0,90);title(‘输入光场分布’)
%% 给定理想输出光束复振幅分布 矩阵大小为mn
% 超高斯型
% c=2sqrt(x.2+y.2)/w;
% J1=beselj(1,c);
% F0=J1.exp(-((x./w).2+(y./w).2));
F0=F0/sqrt(sum(sum(F0.^2)));
figure(2),mesh(F0),view(0,90);title(‘理想输出光场分布’)
%--------------------------------------------------------------------------
k=2pi/lambda;
P=2piphi; % m0n0
iter=1; MaxIter=2000;
err=ones(MaxIter); epsilon=1e-7;
% F=zeros(m,n); Fp=zeros(m,n);
delta_F1=1; delta_U1=1;
while (iter<=MaxIter && err(iter) > epsilon)
U=f0.exp(1iP);
U1=frt(U,lambda,d,L);
% Co(iter)=corr2(abs(U1),F0); %振幅相关系数
q=angle(U1);
IU1=F0.exp(1iq); %用所要求的振幅取代谱面波函数的振幅
IU2=ifrt(IU1,lambda,d,L);
P=angle(IU2);
xx=(sum(sum((abs(U1)-F0).2)))./(sum(sum(F0.2)));
yy=(sum(sum((abs(IU2)-f0).2)))./(sum(sum(f0.2)));
delta_F=xx;
delta_U=yy;
err(iter+1)=max(abs([delta_F-delta_F1, delta_U-delta_U1]));
delta_F1=delta_F;
delta_U1=delta_U;
iter=iter+1 ;
end
P=mod(P,2pi);
a1=P/max(max§); %归一化
P1=floor(255a1);
P2=uint8(255a1);
figure(3);imshow(P2’,[]);
save(‘1jie1’,‘P2’)
imwrite(P2’,‘1jie1.bmp’,‘bmp’)
title(‘设计出的相位板’);
E1=f0.exp(1i2pi*P1/255);
E2=frt(E1,lambda,d,L);
E3=abs(E2);
mesh(E3)
figure(4);imshow(E3,[]);
title(‘理想高斯光下的输出效果’);
figure(5),
B=1:iter;
plot(B,err(B),‘-’,‘LineWidth’,2);
xlabel(‘迭代次数’); ylabel(‘振幅相关系数’);title(‘相关系数’);
⛄四、运行结果
⛄五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]门云阁.MATLAB物理计算与可视化[M].清华大学出版社,2013.
[2]吴海燕.利用GS算法实现图像加密技术[J].玉溪师范学院学报. 2019,35(06)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除