Zemax光学仿真:DOE设计五步法与超透镜避坑指南
2026/9/18 18:06:54 网站建设 项目流程

搞光学仿真的人,一定绕不开Ansys Zemax这个名字。不管是做衍射光学元件(DOE)还是近年大火的超透镜(metalens),Zemax都是最常被拿来“落地验证”的工具之一。但很多新人一上来就被一堆窗口和参数搞懵:DOE到底怎么建模?相位分布怎么导进去?metalens在Zemax里仿真结果为什么和实验对不上?这篇内容我想从实际项目经验出发,把DOE设计的5个关键步骤捋清楚,再专门聊聊超透镜仿真里最容易踩的坑。适合正在做光学设计、微纳光学、AR显示、激光加工分束、结构光投射相关方向的朋友参考,新手也能照着走一遍。

先说个基本判断:Zemax不是万能的。DOE和metalens本质都是“用微纳结构调制光场”,但Zemax擅长的是宏观光学系统仿真,对亚波长结构的电磁场响应需要借助其他工具(FDTD、RCWA)取参。理解这个边界,你后面的坑会少一半。

1. DOE设计前必须想清楚的三件事

1.1 DOE本质是“相位雕刻”,不是“画图”

衍射光学元件的核心是相位分布。简单说,入射光经过DOE后,每个位置的相位被修改,再通过衍射传播形成目标光场。DOE设计的第一步永远不是打开Zemax,而是想清楚你这个元件要干什么:是分束?匀化?整形?还是聚焦?

这三种任务对应的相位求解策略完全不同。分束器需要的是周期性的相位光栅,通常用GS算法或者傅里叶迭代求解;匀化器(beam shaper)则是非周期性相位,需要光学映射法或者混合算法;聚焦器件(比如Fresnel lens)可以直接解析计算。Zemax里的“Binary Optic”表面虽然能做很多事,但它只给你一个相位函数的载体,不会告诉你这个相位怎么算。你先得在外面把相位分布算出来。

很多新手容易犯的错是,直接在Zemax里用Zernike多项式或者多项式系数去“凑”一个类似DOE的相位,结果仿真出来是像了,但没法加工,或者加工出来性能完全不对。原因就是相位分布的量化方式没对齐。DOE加工用的通常是灰度光刻或等离子刻蚀,加工文件里是台阶化的高度图,也就是多级量化相位。你在设计时就要定好台阶数(8台阶、16台阶还是连续灰度),这会直接影响衍射效率。8台阶理论效率约95%,16台阶接近98%,但加工难度和成本也上去了。

还有一点,DOE的周期和特征尺寸决定了衍射角。对于周期为d的表面结构,一级衍射角满足sinθ = λ/d。这个公式简单,但非常关键。设计分束器时,期望的分束角度直接决定你的最小特征尺寸。比如波长632.8nm,周期10μm,一级衍射角约3.63度。如果要做到30度的衍射角,周期就得降到约1.26μm,这种结构对光刻分辨率要求很高。

1.2 标量衍射理论够用吗?

Zemax的标量衍射引擎(如Physical Optics Propagation,POP)是基于薄元件近似和标量衍射理论。对大多数DOE,特征尺寸远大于波长(一般大于5倍波长),标量理论够用。比如常见的扩散片(diffuser)特征尺寸在几微米到几十微米,直接用Zemax的POP分析没有问题。

但做metalens时情况就变了。金属纳米柱的直径通常在几百纳米到一微米之间,和波长同一量级甚至更小。这时候标量理论失效,必须用矢量电磁仿真(FDTD、RCWA)去获取每个纳米柱单元的相位和透过率响应,然后把这些响应映射到Zemax里做系统级仿真。这也是很多人的认知盲区:Zemax本身不直接设计metalens的微结构阵列,它只负责“系统级验证”。

那Zemax里怎么用?常见套路是把metalens等效成“自定义相位面”(User Defined Surface)或者“Binary Optic 2”表面,把FDTD提取的相位-位置关系以多项式拟合或查找表形式导入。这样能在系统层面优化你的成像质量、视场、色差,而微结构的具体形貌仍然由FDTD负责。

1.3 建模参数怎么定才合理

在进入Zemax前,先把这些参数定下来:

  • 工作波长(单色光还是宽谱)
  • 入瞳孔径和光束尺寸
  • 目标衍射角或焦距
  • 目标效率(决定台阶数和材料选择)
  • 基底材料和加工约束(最小线宽、深宽比)

这些参数之间是耦合的。举个例子,如果要求焦距很短,metalens的相位梯度就大,纳米柱的相邻相位差可能超过π,这时候单元结构之间的耦合效应就会很明显,单个单元响应提取的准确性就下降。你只能在FDTD里做“超单元”(supercell)仿真来修正,或者放宽焦距指标。

我在实际项目里习惯先做一个“可行性估算表”,把上述参数列出来,算出特征尺寸和衍射效率期望值,再决定是采用衍射DOE还是超透镜方案。这一步很值得花时间,能避免后续无数弯路。

2. 5步搞定DOE设计

2.1 第一步:算出目标相位分布

假设我们要设计一个1×5分束器,波长1064nm,分束角度1度,均匀性误差小于3%。第一步,用标量衍射理论或GS算法求解相位分布。

GS算法是经典做法,英文全称Gerchberg-Saxton,思想很简单:在入射面给一个初始相位,正向传播到目标面,保留目标面的振幅分布(替换为目标强度),反向传播回入射面,保留入射面振幅分布(替换为光源振幅),迭代收敛。这个算法在纯相位分束和匀化设计中非常常用,MATLAB里几十行代码就能实现。

下面是一个简单的GS算法核心伪代码,大家可以在MATLAB或Python里实现:

import numpy as np def gs_beam_split(target_amp, source_amp, n_iter=200): phase = np.random.rand(*target_amp.shape) * 2 * np.pi for _ in range(n_iter): # 正向传播:傅里叶变换 field_far = np.fft.fftshift(np.fft.fft2(source_amp * np.exp(1j * phase))) # 替换振幅为目标振幅,保留相位 field_far = target_amp * np.exp(1j * np.angle(field_far)) # 逆向传播:逆傅里叶变换 field_src = np.fft.ifft2(np.fft.ifftshift(field_far)) # 重新加载振幅,保留相位 phase = np.angle(field_src) return phase

注意,这里我用傅里叶变换近似衍射传播,适用于远场或透镜焦平面。如果你的系统是近场传播(Fresnel),需要用Fresnel衍射积分代替FFT。

计算出来的相位是连续分布,但加工需要量化。比如8台阶量化,就是把2π分成8个等级。量化会引入量化噪声,使匀化均匀性变差,所以有时需要用“带约束的GS算法”,每次迭代后再做量化,让算法去补偿量化误差。

2.2 第二步:把相位分布变成Zemax能用的形式

Zemax里支持多种相位加载方式:

  • Binary Optic 1/2表面:用旋转对称的相位多项式,如P(r) = A1 r^2 + A2 r^4 + ...
  • Binary Optic 3/4表面:用x-y多项式表示非旋转对称相位
  • 自定义表面(User Defined Surface):通过DLL或者ZOS-API导入外部相位数据
  • 网格相位面(Grid Phase):直接从外部文件导入二维相位矩阵

对于任意DOE,推荐用Grid Phase或Binary Optic 3表面。Grid Phase的好处是保真度高,它是一个二维离散相位图,Zemax会插值计算;缺点是数据量较大。Binary Optic 3表面用多项式拟合,如果相位面变化剧烈(台阶边缘陡峭),多项式很难精确拟合,会造成振铃效应,这时必须小心检验拟合残差。

我在工作流中习惯先把相位矩阵保存为ASCII文件,然后在Zemax非序列模式里使用“Grid Phase”表面导入。导入前先检查相位范围是否在-π到π之间,Grid Phase默认按2π模映射,如果你的相位变化超过2π,需要做相位解包裹。这里有个常见坑:解包裹相对于加工其实是多余的,因为加工时相位本身以2π为周期等价,但Zemax网格导入时,它会从第一个点开始累加,所以一定要把相位数据写成连续格式(unwrap)或者按加工格式写成多台阶0-2π值,否则仿真结果会出现奇怪的条纹。

2.3 第三步:在Zemax中搭建仿真光路

打开Zemax非序列模式(Non-Sequential Mode),新建一个系统,光路大致是:光源 -> DOE元件 -> 观察面。

光源用Source Diode或Gaussian Beam,要根据实际激光设置束腰和发散角。DOE元件用“Grid Phase”表面加一个薄板材料,比如熔融石英。观察面用Detector Rectangle,设置在目标距离处。

一个关键点是采样密度。Grid Phase的像素间隔过大会丢失衍射细节,过小则会导致仿真缓慢、内存爆炸。我的经验是,每个DOE最小特征周期至少要有4个采样点,才能比较准确模拟衍射行为。比如相位矩阵周期是10μm,最小特征尺寸1μm,那网格间隔应设为0.25μm。此外,观察面探测器像素数尽量落在256×256到1024×1024之间,像素太少无法分辨分束光斑的细节,太多则占用大量内存。

光源参数也要小心。点光源和扩展光源的结果完全不同。DOE分束器通常假设入射光是平面波,所以光源发散角要设置得很小。如果用高斯光束,光腰尺寸要大于DOE口径,否则边缘相位采样不足,实际光斑均匀性会下降。

2.4 第四步:评估仿真结果并迭代优化

跑完光线追迹后,看Detector Viewer的结果。需要关注四个指标:

  • 各衍射级次的能量(分束效率)
  • 光斑均匀性(最大值与最小值的偏差)
  • 杂散光水平(非目标级次的能量占比)
  • 实际衍射角是否和目标一致

如果效率偏低,先检查台阶数是否过低;如果均匀性差,多半是相位量化误差或者GS算法迭代不足;如果杂散光强,可能是Grid Phase的插值方式导致的额外相位误差。

Zemax可以结合ZOS-API做优化。比如用Python调用Zemax,自动修改Grid Phase的相位值,多次跑探测器数据,以均匀性作为评价函数,来微调相位分布。这比手动改参数高效很多。但优化空间有限,因为DOE的相位分布自由度极高,Zemax内置优化器更适合参数少的系统。重活建议放回MATLAB做。

我常用的评价函数需要自己写。读取Detector Rectangle里的像素数据,提取各光斑中心能量,计算均匀性误差(peak-to-valley),然后做全局优化。注意,优化过程中需要确保探测器尺寸足够大,避免衍射光超出探测器边界,影响能量统计。

2.5 第五步:公差分析和加工前检查

仿真结果再好,加工出来也可能翻车。DOE的加工误差包括:

  • 台阶深度误差:影响相位延迟精度,导致衍射效率下降
  • 侧壁倾斜:导致非预期散射
  • 对准误差:多台阶套刻对准偏差,影响相位分布正确性
  • 特征尺寸CD偏差:在高NA情况下会造成明显相位误差

在Zemax里可以用“Tolerancing”功能分析深度误差的影响。方法是对相位矩阵整体乘一个比例因子,模拟台阶深度偏差。比如设计深度对应2π相位,实际刻蚀深度偏差1%,就相当于相位比例因子0.99,再看衍射效率变化。

另外要看一下角度公差。DOE对入射角度很敏感,尤其分束器。入射光稍微偏转,分束角度整体偏移,均匀性也可能变化。在Zemax中可以直接倾斜DOE表面,扫描几个角度,观察效率曲线。如果允许的角度容差太小,实际装配会非常困难,这时要考虑优化设计,比如降低相位梯度或者减小衍射角度。

加工前最后一步是检查数据格式。多数DOE厂商接受GDSII或者BMP灰度图,你的相位矩阵需要转成对应格式,注意坐标方向和原点定义。我就曾因为坐标轴翻转,导致加工出来的元件光斑偏移了好几度,最后不得不重新流片,损失不小。

3. 超透镜(metalens)设计避坑指南

3.1 坑一:单元库的相位响应没做偏振分类

Metalens的经典设计方法是:先用FDTD扫描一堆圆柱或纳米柱单元,得到每个单元在目标波长下的相位延迟和透过率,然后根据所需的聚焦相位分布,从库中挑出最合适的单元摆放。

这个流程听起来简单,但坑很多。第一个坑是偏振。圆截面纳米柱对x偏振和y偏振的响应一般是相同的,但如果是矩形柱、椭圆柱或者带沟槽的结构,两个偏振方向的相位响应可能差别很大。如果你用某个偏振下提取的相位去设计,实际工作时另一个偏振的光就会产生错误的聚焦,出现严重的像散。

所以建单元库时必须分偏振。至少扫描x偏振和y偏振两个方向,并计算偏振转换效率(交叉偏振成分)。对大多数几何对称的圆柱结构,偏振无关性较好;但深宽比大或者间距很小时,耦合效应会破坏对称性,这时必须用圆偏振基来分析。

FDTD仿真单元库的参数要固定:周期(unit cell pitch)、高度、最小间距。周期大小和NA相关,因为相位梯度需求决定了单元间隔不能太大。我做的一个meta-axicon(轴锥镜),周期350nm,直径在150-300nm之间变化,高度600nm,波长633nm。扫描步长5nm,一共扫描了几千组结构,耗费了不少算力。

3.2 坑二:相位拟合出现2π跳变时被“平滑”掉

Metalens的相位分布通常包含多个2π wrapping。在把离散单元位置映射到相位值时,如果相邻位置需要的相位值从0突然跳到2π,单元库中对应的纳米柱直径也可能从最大突变到最小。

这本身没问题,关键是Zemax中如果要等效建模,很多人会把相位分布拟合成多项式。多项式拟合为了平滑,会把这种2π跳变“磨平”,导致等效透镜焦距完全错误。正确做法是把相位解包裹成连续曲面再拟合,或者用Grid Phase直接导入逐点相位数据,不要做多项式压缩。

我在做Zemax成像模拟时,最稳妥的方式是生成一个“相位查找表”文件,每个采样点给一个相位值,然后用Grid Phase导入。这个相位值就是FDTD单元库中对应位置纳米柱的实际相位延迟。这样系统仿真能匹配真实结构的相位分布。

3.3 坑三:只复制FDTD的相位,忽略了透过率变化

纳米柱扫描结果除了相位,还有透过率(或反射率)。很多设计流程里只挑相位合适的单元,但单元典型透过率可能是0.8也可能是0.95。如果不同位置的透过率差异很大,会造成孔径的振幅调制,影响点扩散函数(PSF)旁瓣水平。

在Zemax等效建模时,你可以在Grid Phase之外额外加一个振幅透过率面,或者导入复振幅数据。如果Zemax版本支持,可以直接用“User Defined Surface”返回复振幅。更简单的方法是在设计单元库时,尽量筛选“高透射 + 相位覆盖充足”的单元,优先选透过率>0.85的结构。

有一个技巧:在FDTD扫描时,除了画“相位 vs 直径”曲线,同时画“透过率 vs 直径”曲线。两者叠加后,你会看到某些直径区间相位连续但透过率凹陷严重。这些区域要尽量避免使用。如果无法避免,至少要在系统仿真时把透过率不均的影响评估出来,别等到实验看到暗环才去查。

3.4 坑四:Zemax里用“薄透镜”近似超透镜,忽略偏振和色散

有些人为了快,直接把metalens当普通透镜,在Zemax里设一个偶次非球面,只设置焦距。这个做法在早期概念验证时可以,但做成像质量分析时会遇到大麻烦:metalens的强色散和偏振响应完全没体现。

Metalens的相位延迟本质上是几何相位(Pancharatnam-Berry phase)或共振相位(propagation phase)。几何相位型metalens对波长不敏感但对圆偏振敏感,线偏振入射时会产生两个相反符号的透镜效果,导致重影。共振相位型metalens色散较强,宽谱工作时必须设计消色差结构。

在Zemax里模拟宽谱metalens,推荐用多重结构(Multi-Configuration)方式,把不同波长对应的相位分布放入不同结构里,每个结构使用独立的Grid Phase。这样可以评估色差。偏振可以用两个正交方向的相位分布独立建模,分别仿真,再叠加相干或非相干强度,看对成像的影响。

这套方法虽然麻烦,但和实验相当吻合。我做过一个工作在780nm和940nm双波段的metalens,用Zemax多重结构分别导入两个波段的相位图,模拟结果和实验PSF基本一致。如果只用一个波段设计,另一个波段完全没法用。

4. 典型问题与排查技巧实录

4.1 问题速查表

现象可能原因排查方法
DOE分束光斑均匀性差GS迭代不足、量化误差大、Grid Phase采样不够增加迭代次数,检查量化台阶,提高网格密度
探测器上衍射级次位置偏移相位图坐标翻转或比例缩放错误检查Grid Phase导入参数,对比衍射角理论计算值
衍射效率远低于理论值台阶深度误差、光源扩展角太大、材料吸收检查光源参数,用Tolerancing扫描深度误差
Metalens焦点强度很弱纳米柱高度不够、单元透过率低、相位覆盖不足查看FDTD单元库的透过率曲线
焦点形状非圆对称偏振响应不一致、结构几何不对称分别计算x/y偏振相位,查看PSF
宽谱成像有色差相位分布色散未校正用多重结构导入不同波长相位图
仿真速度极慢Grid Phase像素太多、探测器像素太多降低采样密度,优先用粗网格

这张表是很多项目反复“踩坑”后的总结,可以打印出来放在工位旁边。排查问题的时候,先对照现象找到大类,再去定位具体参数,效率会高很多。

4.2 实操心得:DOE比预想中要“娇气”

我最初做DOE时,以为仿真结果衍射效率8、90%,实际效率应该差不多。结果加工回来一测,效率只有65%。后来逐项排查,发现两个问题:一是入射激光束腰太小,实际照射到DOE边缘的光不是平面波;二是我选择的台阶数只有4台阶,理论效率只有81%,加上加工误差,实际65%已经是正常水平。

从那以后,我所有DOE设计都会在Zemax里加一个真实高斯光源模型,且明确测量入射光束的M²因子。很多实验室激光器光束质量一般,M²在1.3以上,必须体现在仿真里。另外提醒一句:不要只看衍射效率,也要看零级能量。零级过强说明相位延迟误差大,加工深度可能不对。测零级是一个快速诊断手段。

4.3 经验扩展:从DOE到metalens的设计链路

很多团队已经在做“DOE + metalens”的混合光学系统。比如用DOE做匀化,再用metalens聚焦,或者用metalens做分束。这类混合系统在设计时,最好先分别对两者做Zemax建模,确认各自误差预算,再联调。

联调时有个关键点:两个衍射表面之间的多重反射。在非序列模式下,要考虑平板表面的反射会形成杂散光,尤其metalens的深孔结构可能反射回DOE,产生鬼像。我的习惯是在DOE和metalens之间加一个隔离层(空气间隔大一些),或者用Zemax的“Importance Sampling”重点分析杂散光路径。

这套设计链路的难点不在单个元件,而在误差传递。DOE的角度误差会让入射到metalens的光束角度偏,金属ens本身对入射角度敏感,最终焦点就畸变了。做公差分析时,要把两级表面的偏心和倾斜统一考虑,不要只看单个元件。Zemax的“Tolerance Wizard”支持多表面公差叠加,但这个功能用的人不多,值得深入研究。

最后再分享一个小技巧:不管是DOE还是metalens,Zemax仿真前一定要确认单位设置。相位文件的坐标单位是微米还是毫米,角度是弧度还是度,弄错一项就会满盘皆输。我见过一个同事整个项目推倒重来,只是因为Grid Phase导入时把单位从μm写成了mm,导致衍射角差了1000倍。这种低级错误,check一遍出图就知道,但项目时间就这样浪费了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询