GS算法简介

GS算法

  • 起源
  • 基本流程
  • MATLAB代码

起源

在光学领域,因为光波的频率过快,一般的探测器不能直接探测到其相位信息,只能获得强度信息,那么如何从强度信息中得到相位信息成为了长时间困扰光学研究者的一个问题。1972年(Gerchberg-Saxton)GS算法被提出,用于从两个已知的强度信息中恢复相位信息。

基本流程

  1. 给出物体的初始估计 g 0 ( x , y ) = f ( x , y ) e ( j ∗ ϕ ( x , y ) ) ; g_0(x,y)=f(x,y)e^{(j*\phi(x,y))}; g0(x,y)=f(x,y)e(jϕ(x,y));,其中 f ( x , y ) f(x,y) f(x,y)是物体的振幅分布估计, p h a s e phase phase是相位估计,可以是[0, 2 π 2\pi 2π]之间的随机值。
  2. 对其作傅里叶变换得到 G k ( f x , f y ) = ℑ ( g 0 ( x , y ) ) = F ( f x , f y ) e ( j ∗ Φ ( f x , f y ) ) G_k(f_x,f_y)=\Im(g_0(x,y))=F(f_x,f_y)e^{(j*\Phi(f_x,f_y))} Gk(fx,fy)=(g0(x,y))=F(fx,fy)e(jΦ(fx,fy));
  3. 在频域内作适当的约束,可以为幅值约束或者支持域约束。对于已知衍射光斑的强度分布 ∣ G ′ ( f x , f y ) ∣ |G'(f_x,f_y)| G(fx,fy)情况下,可以将频域的模值 F ( f x , f y ) F(f_x,f_y) F(fx,fy)替换为 G ′ ( f x , f y ) G'(f_x,f_y) G(fx,fy),保持相位不变;如果对于一个透镜系统而言,因为透镜衍射作用高频信息分量将丢失,相当于一个低通滤波器,可以定义一个光瞳函数
    P ( f x , f y ) = { 1 , 截 止 频 率 内 0 , 截 至 频 率 外 P(f_x,f_y)=\left\{ \begin{aligned} &1,\qquad 截止频率内\\ &0,\qquad 截至频率外 \end{aligned} \right. P(fx,fy)={10
    光瞳函数之后乘上零频处于中心的频谱(MATLAB中可以用fftshift(fft2( g 0 ( x , y ) g_0(x,y) g0(x,y)实现)即可作支持域约束。作完约束之后得到新的频谱分布 G k ′ ( f x , f y ) = ∣ G ′ ( f x , f y ) ∣ e ( j ∗ Φ ( f x , f y ) ) G'_k(f_x,f_y)=|G'(f_x,f_y)|e^{(j*\Phi(f_x,f_y))} Gk(fx,fy)=G(fx,fy)e(jΦ(fx,fy))
    4.对新的频谱进行逆傅里叶变换得到新的空域分布
    g k ′ ( f x , f y ) = ℑ − 1 ( G ′ ( f x , f y ) ) g'_k(f_x,f_y)=\Im^{- 1}{(G'(f_x,f_y))} gk(fx,fy)=1(G(fx,fy))
    在空域内再次作恰当的约束,作为下一次迭代的初始分布。
    5.重复上述的4步,知道满足条件输出,条件可以是迭代次数、频域误差、空域误差等。
    GS算法简介_第1张图片

MATLAB代码

%%%%% Copyright 2021.04.05 Beijing %%%%
clc;
clear;
gray = double(imread('test2.bmp'));               %读入初始图,作为初始迭代分布振幅 
Amplitude = imresize(gray,[512,512]);             %适应调制器分辨率,可注释掉
Amplitude = Amplitude./(max(max(Amplitude)));     %归一化
phase = 2*pi*rand(512,512);                  %产生随机相位
g0_Fie = Amplitude.*exp(1i*phase);           %Fienup算法初始复振幅分布
g0_GS = Amplitude.*exp(1i*phase);            %GS算法初始复振幅分布
RMS_GS = zeros(500,1);                       %计算GS算法均方根误差
RMS_Fie = zeros(500,1);                   %计算Fienup算法均方根误差       



%fienup算法,对GS算法加入反馈调节量ger*k;
step_size = 0.1;   %设置反馈参量,范围为[0,1],step_size=0时为GS算法
for n = 1:500     %设置最大迭代次数 
%    Fienup算法
   G0_Fie = ifft2(ifftshift(g0_Fie));            %逆傅立叶变换到频域
   G0_FieNew = 1*G0_Fie./abs(G0_Fie);           %取相位值,频域作全1幅值约束,相位全息图
   g0_FieNew = fft2(fftshift(G0_FieNew));      %作傅里叶变换返回空域
   g_er=abs(Amplitude) - fftshift(abs(g0_FieNew)./max(max(abs(g0_FieNew))));     %计算误差,确定收敛方向
   RMS_Fie(n)=sqrt(mean2((g_er.^2)));        %计算均方根误差
   g0_Fie=(abs(Amplitude)+g_er*step_size).*(g0_FieNew./abs(g0_FieNew)); %引入反馈调节
  
%  GS算法
   G0_GS = ifft2(ifftshift(g0_GS));          %逆傅立叶变换到频域
   G0_GSNew = 1*G0_GS./abs(G0_GS);          %取相位值,频域作全1幅值约束,相位全息图
   g0_GSNew = fft2(fftshift(G0_GSNew));      %作傅里叶变换返回空域
   g_er=abs(Amplitude)-  fftshift(abs(g0_GSNew)./max(max(abs(g0_GSNew))));              %计算误差
   RMS_GS(n)=sqrt(mean2((g_er.^2)));        %计算均方根误差
   g0_GS=abs(Amplitude).*(g0_GSNew./abs(g0_GSNew)); %引入反馈调节
end

figure(1)
subplot(321);imshow(mat2gray(gray));title('原图');
subplot(323);imshow(mat2gray(abs(G0_FieNew)));title('相位原件分布(Fie)');
subplot(325);imshow(mat2gray(abs(fftshift(g0_FieNew))));title('模拟衍射输出(Fie)');
subplot(322);imshow(mat2gray(abs(gray)));title('原图');
subplot(324);imshow(mat2gray(abs(G0_GSNew)));title('相位原件分布(GS)');
subplot(326);imshow(mat2gray(abs(fftshift(g0_GSNew))));title('模拟衍射输出(GS)');

figure(2)
subplot(121);plot(1:500,RMS_Fie);xlabel('循环次数');ylabel('RMS误差(Fie)');
subplot(122);plot(1:500,RMS_GS);xlabel('循环次数');ylabel('RMS误差(GS)');



你可能感兴趣的:(matlab)