自由曲面面型设计【角谱衍射理论,GS算法】

1. 背景

在我发布光波传输的角谱理论【理论,实例及matlab代码】这篇文章之后,有很多人对其中的自由曲面厚度矩阵有所需求,但是由于某些原因,该矩阵不能公开。但是,我在评论区也曾说可以通过反向设计的方式得到自由曲面的厚度矩阵,本篇文章就是基于此而撰写的。

2. 问题与解决方案

2.1 问题描述

假设采用一个振幅分布为高斯型的平面光源(大小10.24mm*10.24mm,波长532nm,束腰为5.32mm,如图1所示)垂直照射一个自由曲面(最大厚度D_{max}为3mm,折射率n为1.494),透过自由曲面的光波在自由空间传播200mm后得到一张图2所示的菲涅尔的图像,图像有效区域为一个椭圆区域,长轴为9.6mm,短轴为7.8mm,试求解自由曲面的面型分布函数m(x,y)

图1 高斯照明光波

图2 200mm处的输出振幅

 2.2 问题分析

对于这个问题,解决的方案其实有很多。首先明确已知条件,是两个振幅图像,而未知条件是自由曲面的面型分布,即光波透过自由曲面之后的相位变化未知。所以,这个问题就变成了一个优化的问题,及找到一个相位信息,使得其满足两个振幅约束条件,这就是一个经典GS算法所面对的问题。

2.3 解决方案

2.3.1 用GS算法求解自由曲面的相位分布

经典的GS算法怎么实现,可以参考GS算法简介这篇文章。GS算法基本流程如图3所示,其基本步骤描述如下:

图3 GS算法的基本流程
  • 1. 给出输入面的初始复振幅估计;在此问题中,输入面是自由曲面的后表面,故输入振幅为高斯光源s(x,y),初始相位就为自由曲面引入的相位变化\phi_0 (x,y),初始的复振幅分布g(x,y)=s(x,y)e^{(j*\phi_0(x,y))},当然,因为自由曲面的面型,即相位透过率函数是未知的,\phi_0 (x,y)可以随机取值,全0,全1,或者随机值都可以。
  • 2.通过角谱衍射的方式,将g(x,y)传输到200mm处,得到输出面的复振幅分布G_k(x,y)=\Im^{-1}[\Im(g_0(x,y))*H(f_x,f_y))]=G(x,y)e^{(j*\Phi(x,y))},

其中,H(f_x,f_y)是角谱衍射在自由空间中的传递函数,下标k表示当前迭代次数,可以表示为

H(f_x,f_y)=\textup{exp}(j2\pi z \sqrt{(\frac{1}{\lambda})^2-f_x^2-f_y^2)}

其中,z是传输距离,\lambda是照明光波在真空中的波长。

  • 3. 在输出面内作适当的约束;将输出面的振幅替换为想要得到的振幅,即菲涅尔的图像F(x,y),即G'_k(x,y)=F(x,y)e^{(j*\Phi(x,y))},得到更新后的输出面复振幅。
  • 4. 通过角谱衍射的方式,将G'_k(x,y)传输到输入面,得到更新后的输入面复振幅分布

g'_k(x,y)=f(x,y)e^{(j*\phi_k(x,y))}

  • 5.在输入面内作适当的约束;将输入面的振幅替换为想要得到的振幅,即高斯照明光s(x,y),得到更新后的输入面复振幅估计

g_k(x,y)=s(x,y)e^{(j*\phi_k(x,y))}

  • 6.重复上述的5个步骤,直到满足终止条件时,得到的\phi_k(x,y)就是自由曲面的相位分布,条件可以是迭代次数、频域误差、空域误差等。

2.3.2 将自由曲面的相位分布转换为面型分布

首先看正向模型,振幅分布为高斯型的平面光源垂直照射一个自由曲面(最大厚度D_{max}为3mm,折射率n为1.494)后,其相位变换为

\phi (x,y)=[D_{max}+(n-1)*m(x,y)]*2\pi/ \lambda

所以,其面型分布就可以表示为

m(x,y) = [\lambda * \phi (x,y) /2 \pi)- D_{max}] /(n-1)

3. matlab代码

%%% Copyrights Sep 21, 2023.
clc;
clearvars;
close all;
%% Generate the input Gaussian beam(modulus constraint on input plane)
mm=1e-3;
nm=1e-9;
lambda=532*nm;% wavelength
k=2*pi/lambda;% wavevector
n=1.494;% The rafractive index of freeform elements 
SL=10.24*mm ;% Side length
N=512*1;% samples for side length
dx=SL/N;%sample interval
d=200*mm;% The distance between the input and target planes
x = -0.5*SL:dx:0.5*SL-dx;
y = x;
[X,Y]=meshgrid(x,y);
E_input=exp(-2*((X /(0.5* SL)).^2+(Y/(0.5* SL)).^2)); %The input Gaussian beam
figure;
imagesc(x,y,E_input);
colormap gray;
colorbar;
title('Amplitude of input');
axis square;

%% Generate the output Fresnel with a ellipsed support zone(constraint on output plane)
semi_major = 4.8*mm;
semi_minor = 3.9*mm;
ellipse = ((X.^2/semi_minor.^2+Y.^2/semi_major.^2)<=1);
Fresnel  = imread('Fresnel.jpg');
Fresnel = double(imresize(Fresnel,[512 512]));
Fresnel = Fresnel./max(Fresnel(:));
output_constraint = Fresnel.*ellipse;
figure;
imagesc(x,y,output_constraint);
axis square;
xlabel('x(m)');
ylabel('y(m)');
colormap gray;
colorbar;
title('Amplitude of output');


%% load phase modulataion by the freeform surface as the initial phase guess
P_input  = exp(1i*ones(N,N)); % all zero phase for inital guess
figure;mesh(X,Y,angle(P_input));
title('Initial phase guess');
xlabel('x(m)');
ylabel('y(m)');
zlabel('\phi');
u1 = E_input.*P_input;

%% obtain the output field wiht Fresnel diffraction
fx = -1/(2*dx):1/SL:1/(2*dx)-1/SL;  %freq coords
[FX,FY] = meshgrid(fx,fx);
H = exp(1i*k*d*sqrt(1-(lambda*FX).^2-(lambda*FY).^2));  %trans func
U1 =fftshift(fft2(u1));  %shift.fft source filed
U2 = H.*U1;    %multiply
u2 = ifft2(ifftshift(U2));
figure;
imagesc(x,y,abs(u2));
axis square;
xlabel('x(m)');
ylabel('y(m)');
colormap gray;
colorbar;
title('Initial amplitude of output');

%% refine the phase distribution using GS algorithm
phase_old = P_input;
H_forward=exp(1i*k*d*sqrt(1-(lambda*FX).^2-(lambda*FY).^2));  %trans func
H_inverse=exp(-1i*k*d*sqrt(1-(lambda*FX).^2-(lambda*FY).^2));  %trans func
for count = 1:50
     input = E_input.*phase_old;
     Input = fftshift(fft2(input));  %shift.fft source filed
     Output = H_forward.*Input;    %multiply
     output = ifft2(ifftshift(Output));
     output_update = output_constraint.*output./abs(output);
     Output_update = fftshift(fft2(output_update));
     Input_update = Output_update.*H_inverse;
     input_update = ifft2(ifftshift(Input_update));
     phase_old = input_update./abs(input_update);
end
figure;mesh(X,Y,angle(input_update));
title('Refined phase distribution');
xlabel('x(m)');
ylabel('y(m)');
zlabel('\phi');

figure;
imagesc(x,y,abs(output));
axis square;
xlabel('x(m)');
ylabel('y(m)');
colormap gray;
colorbar;
title('Amplitude of output with GS algorithm');

%% transform phase to surface topology
phase = angle(input_update);
phase = unwrap(unwrap(phase,[],2),[],1);
m = (lambda*phase/(2*pi) - 3*mm)/(n-1);
dm = lambda/(n-1); % thickness alter when phase increase 2pi
deltaM = ceil(abs(min(m(:)))/dm); % added minimun thickness for current m
m = m + deltaM*dm;
figure;mesh(X,Y,m);
title('Surface topology of freeform element');
xlabel('x(m)');

 4. 运行结果

图4 自由曲面表面面型
图5 仿真的输出面振幅

       创作不易,如果你觉得这篇文章对你有所帮助,请点赞转发打赏,让更多人看到这篇文章,你的支持是博主最大的动力,谢谢!!!

 

  • 16
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Matlab是一种强大的数值计算和数据可视化软件,自由曲面设计是其中一个重要的应用领域。在Matlab中,我们可以使用不同的函数和工具箱来实现自由曲面设计。 首先,Matlab提供了多种用于高度和曲面拟合的函数和算法。通过这些方法,我们可以根据给定的数据点集合,找到最佳拟合曲面或曲线来描述数据的关系。例如,可以使用polyfit函数进行多项式拟合,使用interp2函数进行二维插值,以及使用fittype和fit函数进行曲线拟合等等。 其次,Matlab中有丰富的图形绘制函数和工具箱,可以用来可视化自由曲面设计结果。使用plot3函数可以绘制三维曲线和曲面,而使用surf和mesh函数可以生成三维曲面和网格。此外,还可以使用contour函数生成轮廓图,使用quiver函数生成向量场图等等。 此外,在Matlab中还有专门用于科学计算和工程设计的工具箱,如Curve Fitting Toolbox和Partial Differential Equation Toolbox等。这些工具箱提供了更高级的功能和算法,可以更加方便地进行曲线和曲面设计,以及求解复杂的偏微分方程等。 总之,Matlab作为一种功能强大的数值计算和数据可视化工具,提供了丰富的函数和工具箱,可以实现自由曲面设计。无论是对于科学研究,还是对于工程设计分析Matlab都是一种非常有用的工具,可以帮助用户快速、准确地进行曲面设计分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fightandstrive

创作不易,你的打赏,最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值