首页/文章/ 详情

角谱衍射计算:从理论到MATLAB实现的全解析【附代码】

9小时前浏览13


1 引言:光学仿真的挑战与突破  

在数字全息、光学干涉测量和衍射光学元件设计等前沿研究领域,光学衍射过程的准确仿真一直是一个关键的技术挑战。传统的基于标量衍射理论的数值计算方法,如菲涅尔衍射积分和夫琅禾费衍射,往往面临一个根本性限制:抽样间隔必须随传播距离变化。  

这一限制严重影响了衍射光学元件设计的效率和精度。本文将深入解析角谱衍射理论的核心原理,详细讲解近场与远场算法的数学基础,文章最后模拟计算圆孔衍射屏在不同衍射距离处的衍射图像。并提供完整的MATLAB实现代码,为光学研究者提供一套完整的技术参考方案。    

 

图 1圆孔衍射示意图    

角谱理论:从物理概念到数学表达  

2.1 理论基础:平面波角谱分解  

角谱理论的核心物理思想是将任意光场分解为不同传播方向的平面波。这一过程可以理解为光学领域的“傅里叶分析”:    

  • 空间域到频域:将输入平面的光场复振幅分布分解为不同空间频率的平面波分量    

  • 传播过程:每个平面波分量在自由空间中独立传播,经历不同的相位延迟    

  • 频域回空间域:在输出平面重新合成所有平面波分量,得到衍射图样    

2.2 数学表达:连续形式的角谱理论  

角谱理论的完整数学描述包含三个核心方程:    

角谱分解(空间域→频域)  

 

角谱传播(频域传播)

   

   

角谱合成(频域→空间域)  

   

2.3 传递函数与点扩散函数的关系    

角谱理论有两种等价的数学表达形式:    

频域传递函数:  

   

空域点扩散函数:    

   

离散化实现:从理论到算法的关键步骤  

3.1 离散傅里叶变换的约束  

在实际的计算机仿真中,连续的傅里叶变换必须离散化为DFT(离散傅里叶变换):    

空域-频域抽样关系:

   

   

3.2 特征距离:算法选择的关键判据  

特征距离d是角谱算法中最重要的参数:    

   

这个参数决定了近场算法和远场算法的适用边界:    

  • 当传播距离 z ≤ d 时,适用近场算法
  • 当传播距离 z ≥ d 时,适用远场算法
  • 当 z = d 时,两种算法等价    

算法实现:近场与远场的分工协作  

4.1 近场算法(基于传递函数)  

近场算法直接在频域中操作,通过传递函数实现角谱传播。    

算法流程:  

  • 对输入光场进行FFT,得到角谱分布    
  • 构造角谱传递函数    
  • 在频域进行角谱传播    
  • 通过IFFT重建输出光场    

4.2 远场算法(基于点扩散函数)  

远场算法在空域中通过卷积定理实现衍射计算。    

算法流程:  

  • 构造点扩散函数(空域)    
  • 对输入光场和点扩散函数分别进行FFT    
  • 在频域进行乘法运算(等价于空域卷积)    
  • 通过IFFT得到输出光场    

卷积定理的应用:  

   

完整MATLAB实现代码

















































































































.rtcContent { padding: 30px; } .lineNode {font-size10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }clear all;close all;clc;%% 参数设置lambda = 632.8e-9;    % 波长N = 1064;              % 采样点数dx = 10e-6;           % 采样间隔D = 5e-3;           % 圆孔直径% 计算特征距离dd = N * dx^2 / lambda;fprintf('特征距离 d = %.2f mm\n', d*1000);% 传播距离设置 (0.5d, d, 5d)z_values = [0.5*dd5*d];%% 创建圆孔衍射屏[xy] = meshgrid((-N/2:N/2-1)*dx);r = sqrt(x.^2 + y.^2);Uin = double(r <= D/2);  % 圆孔% 显示输入场figure;imagesc(x(1,:)*1000, y(:,1)*1000, Uin);axis image; colormap gray;xlabel('x (mm)'); ylabel('y (mm)');title('输入场 - 圆孔衍射屏');colorbar;%% 近场算法计算figure('Name''近场算法结果');for i = 1:3    z = z_values(i);    Uout_near = ASM_Near(Uin, lambda, z, dx);
    % 计算强度    I_near = abs(Uout_near).^2;
    % 计算输出平面的坐标    x_out = x;    y_out = y;
    % 显示结果    subplot(13, i);    imagesc(x_out(1,:)*1000, y_out(:,1)*1000, I_near);    axis image; colormap jet;    xlabel('x (mm)'); ylabel('y (mm)');    title(sprintf('z = %.1f mm\n(%.1fd)', z*1000, z/d));    colorbar;endsgtitle('近场算法模拟结果');%% 远场算法计算figure('Name''远场算法结果');for i = 1:3    z = z_values(i);    Uout_far = ASM_Far(Uin, lambda, z, dx);
    % 计算强度    I_far = abs(Uout_far).^2;
    % 计算输出平面的坐标    x_out = x;    y_out = y;
    % 显示结果    subplot(13, i);    imagesc(x_out(1,:)*1000, y_out(:,1)*1000, I_far);    axis image; colormap jet;    xlabel('x (mm)'); ylabel('y (mm)');    title(sprintf('z = %.1f mm\n(%.1fd)', z*1000, z/d));    colorbar;endsgtitle('远场算法模拟结果');%% 近场算法function Uout = ASM_Near(Uin, lambda, z, dx)% Uin: 输入复振幅场% lambda: 波长% z: 传播距离% dx: 输入平面的采样间隔[NyNx] = size(Uin);k = 2*pi/lambda;% 生成空间频率坐标fx = (-Nx/2 : Nx/2-1) / (Nx * dx);fy = (-Ny/2 : Ny/2-1) / (Ny * dx);[FxFy] = meshgrid(fx, fy);% 角谱传递函数HH = exp(1i*k*z*sqrt(1 - (lambda*Fx).^2 - (lambda*Fy).^2));H(real(sqrt(1 - (lambda*Fx).^2 - (lambda*Fy).^2)) < 0) = 0;H = fftshift(H);du = 1/(Nx * dx); % 频率域采样间隔dv = 1/(Ny * dx);% 角谱衍射U_spectrum = fft2(fftshift(Uin)) * (dx * dx);Uout = fftshift(ifft2(U_spectrum .* H)) * (du * dv * Nx * Ny);Uout = Uout .* exp(1i*k*z);end%% 远场算法function Uout = ASM_Far(Uin, lambda, z, dx)% Uin: 输入复振幅场% lambda: 波长% z: 传播距离% dx: 输入平面的采样间隔[NyNx] = size(Uin);k = 2*pi/lambda;% 生成空域坐标x = (-Nx/2 : Nx/2-1) * dx;y = (-Ny/2 : Ny/2-1) * dx;[XY] = meshgrid(x, y);% 点扩散函数h = exp(1i*k*z) / (1i*lambda*z) .* exp(1i*k/(2*z) * (X.^2 + Y.^2));% 卷积U1 = fft2(fftshift(Uin));U2 = fft2(fftshift(h));Uout = fftshift(ifft2(U1 .* U2));Uout = Uout * dx^2;end


 

算法性能分析与验证  

6.1 计算精度验证  

波长为 632.8 nm,衍射屏由1064pixel×1064pixel构成,抽样间隔为Δx0=Δy0=10 μm,圆孔直径等于3.5mm,d=81mm。通过对比不同传播距离下的仿真结果,我们可以系统验证算法的准确性:    

图2 圆孔衍射屏    

  • z = 0.5d(近场区域)    

  • 近场算法:衍射图样边缘清晰,分辨率高    

  • 远场算法:开始出现轻微的分辨率下降    

  • z = d(特征距离)    

  • 两种算法结果高度一致    

  • 验证了特征距离理论的正确性    

  • 衍射图样开始展现典型的菲涅尔衍射特征    

  • z = 5d(远场区域)    

  • 远场算法:保持较高的图像质量    

  • 近场算法:分辨率明显下降,出现混叠现象    

 

图3近场算法计算结果    

 

图4远场算法计算结果    

6.2 计算效率分析  

角谱算法的计算复杂度主要由FFT决定:    

  • 单次FFT计算复杂度:O(N²logN)    

  • 近场算法:2次FFT(正变换+逆变换)    

  • 远场算法:3次FFT(输入场变换+点扩散函数变换+逆变换)  


来源:旋算仿真工作室
静力学瞬态动力学振动疲劳碰撞电力电子MATLAB芯片UMSimulink焊接理论电机材料数字孪生
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-11-12
最近编辑:9小时前
旋算仿真工作室
专业一对一仿真技术服务
获赞 7粉丝 12文章 31课程 0
点赞
收藏
作者推荐

衍射光学光束整形元件设计

目标:在透镜后焦面上实现某1图像的光强分布 要求: 1. 波长、衍射光学元件口径、形状、入射波前、二维目标分布及尺寸等都可自行设定。 2. 算法任选。可使用改进算法,也可自行改进算法。 3. 对相位进行8台阶量化,重新计算。 4. 更换输出面的采样间隔,重新计算。 一、理论基础: 理论一:傅里叶光学 图1 物体紧靠透镜放置时的傅里叶变换光路 理论二:GS相位恢复算法 图2 GS算法流程图 Note:理论部分较为枯燥,请查询相关书籍或论文。 二、设计过程 1.设计思路 本次设计是在MATLAB平台上编程实现,程序框图如图3所示: 本次的设计的过程如下,主要包含两个方面,先用传统的GS算法迭代出一个大致的相位分布,因为前人的研究已经发现G-S算法是收敛的,所以我们用于控制算法循环的变量设置为循环次数,当达到一定的循环次数,退出循环。经改变参数发现迭代次数超过30之后,优化过程基本已经结束了,为了下一步优化迭代出一个较好的结构,我们选优化次数为100。至此已经迭代出一个比较稳定的相位分布了,因为GS算法是找的局部最优解,很容易错过全局最优解,需要对于循环中替换的约束光振幅进行重新控制,以一定的几率跳出局部最优解,达到一个比较稳定的解。 图3 MATLAB程序框图 第二部分循环在第一部分循环的基础上令: 迭代的振幅取: 这样可以使得循环有机会跳出局部最优解达到全局最优解。 两部分的循环过后就是对于迭代出的相位进行八台阶的量化,因为G-S算法迭代出来的相位分布是连续的相位分布,实际加工的时候是不满足要求的,需要我们在进一步量化,对于量化的过程,我们选择八阶量化,即将相位分布在量化在[-pi,pi]或者[0,2pi]区间的八个等间隔值上。实际在设计的过程中我们采用的循环是逐个比较法进行量化,在此之前需要对其通过减最小值的方法使得此相位的最小值为0。还有一个方法可以用于量化,那就是先对相位加pi将其区间变为[0,2pi],再对新的区间除以pi/4,通过四舍五入取整的方法得到全都为整数的区间[0,8],最后乘以常数pi/4以得到量化为[0,2pi]的台阶。理论上两种方法都可以将相位进行量化,但是在实际的编程中发现,第一种的量化效果好,第二种的量化效果要差一点,可能是第一种通过减法得到的相位分布其初始值最小值精确等于0的原因。 对于第四个设计要求可以在第二部优化GS算法迭代出的基础上,在像面令采样密度增加一倍,逆傅里叶变换得物面上的光强分布和相位分布,再一次傅里叶变换得到像面上的光强分布查看其结果。 图4所示: 图4 目标光强分布 对于初始的G-S算法,迭代100次之后得到的衍射面上的相位分布和像面上的振幅分布如图5所示: 图5 原始GS算法得到的结果 从图5中可以看到未改进的G-S算法得到的光强分布图,直接量化制作相位板实际的光能利用率会很低,需要我们改进,但是基本的形貌已经很清晰了,说明G-S算法迭代出了一个比较理想的二次优化的初始结构,我们可以在此基础上继续优化。图6所示的是在添加了权重去控制第二步替换之后的G-S算法迭代20次之后的衍射面上的相位分布和像面上的振幅分布。图7所示的是GS算法改进前后得到的结果比较,图8所示的是改进之后算法得到的振幅分布的三维图。 图6 对GS算法第二步改进得到的结果 为了方便比较改进与未改进的二者的差异,我们将改进与未改进得到的像面上的振幅分布图放置在一起观察,如图7所示的图中,我们可以很清楚的察觉到改进后的GS算法得到的像面上的振幅分布更加均匀,说明改进的方向是对的,可以在此的基础上进行下一步相位的八台阶量化。 图7 对GS算法改进前后得到的结果比较 图8 对GS算法改进后得到三维振幅分布 量化过程我们采用的是逐差法对相位进行量化操作,量化后的相位板的分布和像面上的光强分布如图9所示,从图9中可以看出量化后的光强分布又变得昏暗起来,这是因为由原先的连续的相位分布量化为台阶式的相位分布的时候原先的相干条件会被打破,所以像面上的光强没有改进后的光强分布那样明亮,虽然连续的相位分布可以得到更加完善的成像,但是这在实际的加工中几乎是不可行的,但是八阶量化之后得到的相位板是在实际的生产中切实可行的,可以比较容易制造出的,所以我们需要将原先连续的相位做成台阶式的。仔细观察图8可以发现在其量化后的目标面振幅图上的中心点处出现一很明显的亮斑,这里光强比较集中,在角谱理论中这里是低频部分,出现这一光强集中的区域的而原因还是量化的过程破坏了原先的连续相位的相干条件。为了直观得观察这一现象,我们在MATLAB中绘制量化之后的像面上的振幅分布的三维图如图10所示,从图10中我们可以直观地观察到这一现象。 图9 量化后得到的相位图和振幅分布图 图10 像面的能量三维分布图 在物面上的加密采样之后得到的光强图分布图如图11所示,在衍射光学元件设计中,考虑到传统的改进GS算法的仿真结果看似可得到均匀的光斑,但是在加倍采样后会出现严重的散斑现象,接下来对于算法的改进可以从抑制散斑入手。 图11 像面加密采样后得到的光强分布 来源:旋算仿真工作室

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈