GS算法(Gerchberg-Saxton algorithm)是一種迭代方法,當輸入和輸出端的各自光強分布已知時,可以通過光學傳(chuan) 播函數,例如
傅裏葉變化,來恢複光束的相位分布。
一束激光可以分為(wei) 兩(liang) 部分,一部分是相位,另一部分是光斑光強分布,他們(men) 是相互關(guan) 聯的,可以通過改變光束的相位部分,對光斑進行
整形。上述GS算法就是其中的一種方法。
主要分為(wei) 四步
1.假設入射光斑是均勻光強,相位因為(wei) 是未知的,可以用一個(ge) 隨機相位替代,或者通過Target Intensity的IFFT變化求得
2.然後經過FFT變化後,得到的是焦距是的光斑分布,光強與(yu) Target Intensity比較近似,但是不夠理想
3.替換上述步驟的光強分布,保留相位分布,得到新的一束激光
4.經過IFFT變化後保留光斑的相位,作為(wei) 下一次迭代的初始相位
通過上述步驟的反複迭代,會(hui) 不斷改善Approximation to target intensity的光斑。
Matlab代碼參考:
%% 數據初始化
pic = 'test.jpg'; % 輸入圖片
file = 'phase.bmp'; % 圖片保存位置
num = 1000; % GS迭代次數
%% 讀取圖片
im = imread(pic);
im = rgb2gray(im);
im = im2double(im);
%% GS算法
im = mat2gray(im);
light = gpuArray(im); % 加入CUDA,提高計算速度
light = ifft2(light); % 計算初始相位
for n = 1:num
phase = angle(light);
light = 1.*exp(1i*phase); % 1. 均勻光強入射光
light = fft2(light); % 2. 聚焦麵上的光強
phase = angle(light);
light = im.*exp(1i*phase); % 3. 理想光斑替換
light = ifft2(light); % 4. 傅裏葉逆運算
end
% 均勻光入射後再做一次傅裏葉變化
phase = angle(light);
light = 1.*exp(1i*phase);
light = fft2(light);
intensity = mat2gray(abs(light));
imshow(intensity);
%% 保存相位圖
phase = gather(phase); % 將phase返回到內(nei) 存中
imwrite(mat2gray(phase), file)
備注:
1. CUDA可以提高運算的速度,例如上述過程,當上述1000此循環,沒有CUDA的時候,循環過程保持在8秒以上,當啟用CUDA後,一般在1.1秒左右。
2. 隨著迭代次數的增加,恢複後的光強越來越清晰
3.通過對比原始圖和經過迭代後的圖片,可以判斷觀察後圖片的恢複程度
您可以通過我們(men) 的官方網站了解更多的国产欧美在线信息,或直接來電谘詢4006-888-532。
展示全部
展示全部