GS算法流程
GS(Gerchberg-Saxton)相位恢復算法是一種基于傅里葉變換的最速下降算法,可以通過輸出平面和輸入平面上光束的光強分布計算出光束的相位分布。圖1是基于GS算法的渦旋光束畸變波前校正系統框圖,在該框圖中,已知輸入平面渦旋光束振幅和相位以及輸出平面的渦旋光束振幅,經過算法多次迭代運算并滿足誤差需求后可以得到需要的校正相位信息,進而實現校正效果。
圖1:GS算法流程[1]
GS算法恢復渦旋光束畸變波前的具體流程如下[2]:
- 將LG渦旋光束作為輸入平面初始參考光,計算出參考光的振幅和相位。
- 將初始參考光束進行快速傅里葉變換,得到其幅度譜A0(kx,ky)和相位譜Φ0(kx,ky)。
- 使用畸變光束的幅度譜替換A0(kx,ky),將替換后的幅度譜與相位譜Φ0(kx,ky)組合成新的函數,再通過傅里葉逆變換即可得到光束的空域幅度a0(x,y)和相位H0(x,y)。
- 用參考光的振幅代替a0(x,y),并與H0(x,y)組合成新函數,將新的函數做快速傅里葉變換后得到新的幅度譜A1(kx,ky)和相位譜Φ1(kx,ky)。將A1(kx,ky)與畸變渦旋光束的幅度譜做差,若滿足誤差則輸出H(x,y),否則就使用新的幅度譜和相位譜進行下一輪的計算。
- 得出預估相位與理想相位差距,對畸變相位進行校正。
仿真結果展示
文章中所用的光束為拉蓋爾高斯渦旋光束,光束經大氣湍流MATLAB仿真詳見之前的文章:MATLAB仿真:渦旋光束經大氣湍流后的光強及相位分布基于蒙特卡洛相位屏法
仿真參數:波長lambda=632.8e-9m;波失k = 2 * pi / lambda;束腰w=5e-3;拓撲荷l=3;外尺度L0=1.0m;內尺度l0=1.0e-3;傳播距離z=1000m;湍流屏張數n=10
如圖2展示了不同大氣湍流下迭代次數為500輪的GS算法校正結果。由圖可以看出GS算法可以有效校正大氣湍流帶來的光束畸變。圖3展示了在不同迭代次數較強湍流中渦旋光束的校正結果。可以看到隨著迭代次數增加,校正效果越好,能量越集中。
圖2不同大氣湍流下迭代次數為500輪的GS算法校正結果。
圖3:不同迭代次數較強湍流中渦旋光束的GS校正結果。
參考文獻:
- 《大氣湍流下渦旋光束波前校正及模式檢測研究》
- 《液晶相控陣波前相位校正算法研究》
MATLAB部分仿真代碼:
喜歡的話給小編點個關注點個贊呀
有任何問題可以在評論區留言
更多完整代碼進T店博士生牛馬賺點小錢
clc;clear;close;
%% 坐標
N=512;
delta1=0.6/N;
[x,y]=meshgrid((-N/2:1:N/2-1).*delta1);
[phi,r1]=cart2pol(x,y);
deltaf1=1/(N*delta1);
%% 光束參數
lambda=632.8e-9;%m
k = 2 * pi / lambda;
w=5e-3;
l=3;
%% 模擬測量面經過湍流的LG光束光強
Cn2=1.0e-13;
L0=1.0;
l0=1.0e-3;
z=1000;
n=10;
dz=z/n;
r0=(0.423 * k^2 * Cn2 *dz) .^(-3/5);
E1= (sqrt(r1.^2)./w).^abs(l).*exp(-(r1.^2)./(w.^2)).*exp(1i.*l.*phi);
%% 初始光場假定未經過湍流的自由空間傳播光強
E0= (sqrt(r1.^2)./w).^abs(l).*exp(-(r1.^2)./(w.^2)).*exp(1i.*l.*phi);
[xn, yn, G0]=ang_spec_prop(E0,lambda,delta1,delta1,z);
%gs循環
max_iter = 1000;%迭代次數
iter = 0;
epsilon = 1e-3;
ER = inf;figure(1)
subplot(2,3,1)
imagesc(I_vac);axis square;title('未畸變光強','FontSize',15);axis off
subplot(2,3,2 )
imagesc(I_tur);axis square;title('畸變光強','FontSize',15);axis off
subplot(2,3,3 )
imagesc(I_correct);axis square;title('校正后光強','FontSize',15);axis off
subplot(2,3,4 )
imagesc(p0);axis square ; title('未畸變相位','FontSize',15);axis off
subplot(2,3,5 )
imagesc(p12);axis square;title('畸變相位','FontSize',15);axis off
subplot(2,3,6 )
imagesc(pcor);axis square;title('校正后的相位','FontSize',15);axis off