简介:DOE光场整形是衍射光学元件应用中的核心方向,面向从事激光加工、成像系统或光学通信的工程师与研究人员,用于解决高斯光束难以满足特定形态需求的工程问题。压缩包共2个文件,总大小约832KB,其中MATLAB脚本负责设计DOE相位函数并进行衍射计算,音频文件对应实验测量或频谱分析数据,便于验证整形效果。已有696人浏览学习,具有一定参考价值。通过该MATLAB程序,可直观理解从高斯光束到平面波、环形光束等目标光场的相位反演过程,并结合傅里叶光学与优化算法掌握光场整形的设计思路;音频数据则为分析光束频谱特性提供了实际案例,适合需要快速上手DOE设计的入门者或希望拓展光学仿真能力的进阶用户。
1. DOE 光场整形:一片微结构替掉半套光路
做激光加工或光电集成的人,迟早会撞上同一个需求:把高斯光变成均匀多点阵列,或把椭圆光斑整形成平顶。DOE(衍射光学元件)的做法,是在基片上刻微米级浮雕相位,让光经过后自行重排能量,一片石英片替掉半套透镜组。光场整形在工程语境内,就是设计相位分布,把远场或焦平面强度改写成预设形态,常见输出有平顶光斑、多点阵列、涡旋光束。这套方案适合激光微加工、激光雷达、结构光投影领域的光学工程师,也适合自研光学模组的硬件团队。代价是设计有门槛、加工有公差、对波长敏感,下文按模型、算法、加工、实测这条技术路线逐个展开。
2. DOE 光场整形的物理模型:相位怎么变成强度
2.1 薄元件近似:为什么只看相位就够了
DOE 的设计前提是薄元件近似。浮雕结构与波前相互作用时,每个点的透射函数近似写成 t(x,y)=exp(iφ(x,y)),振幅不变,只有相位被调制。入射光通常是高斯或平顶激光,进入元件前振幅分布已知,进入后振幅基本不变,相位被表面浮雕改写。这个近似成立的条件是特征尺寸远大于波长、数值孔径不高,绝大多数多焦点和平顶整形场景都满足。
远场或透镜焦平面上,光场是输入面光场的二维傅里叶变换。相位在输入面是角度信息,到了焦平面就变成位置信息:输入面上一个线性相位倾斜,对应焦平面上一个整体平移。所以用相位和光场整形的本质,是把能量从中心零级搬到指定空间频率上去。设计任务因此变成求一组相位分布,使得它的傅里叶变换强度符合目标,这类问题统称相位恢复,Gerchberg-Saxton 算法就是为解决它出现的。
2.2 标量衍射与傅里叶关系的适用边界
用傅里叶变换描述焦平面光场,背后是标量衍射和菲涅尔近似的假设。判断标准有两条:元件最小特征尺寸大于 2 个波长左右,且照明数值孔径不高。低于 1λ 的特征就要用严格耦合波分析或时域有限差分,那是超表面和偏振选择性元件的领域;常规激光分束、平顶整形用标量模型,误差在百分之一量级,足够指导设计。
设计里反复用到一个换算关系:焦平面采样间隔 δ = λf/L,其中 λ 是设计波长,f 是聚焦焦距,L 是设计窗口边长。这个式子在布参时是第一个要算的数,光斑能摆在哪、间隔多大,都由它决定。用一段小代码验证一下:
lam, f, L = 1064e-9, 50e-3, 1024 * 5.2e-6 # 1064nm, f=50mm, 窗口=1024*5.2um delta = lam * f / L print(f"焦面采样间隔 delta = {delta*1e6:.2f} um")这段代码输出约 10.00 µm。逻辑是:设计窗口在频域里对应一个基频,焦面上的相邻采样点间距就是这个值。后面设计 3×3 多焦点时,焦点间隔直接写成 delta 的整数倍,物理位置就由 λ、f、L 三者锁死,不需要再换算回空间坐标。
2.3 设计算法:选迭代傅里叶还是别的
常见做法是迭代傅里叶变换这一类,代表是 Gerchberg-Saxton(GS)及其变体。它交替在输入面和焦平面做傅里叶变换与逆变换,一个平面保留振幅约束、另一个平面只保留相位自由度,反复迭代直到收敛。对多焦点阵列,业界用得更稳的是加权 GS 和它的各种自校正变体,它们在替换振幅约束时乘一个误差权重,均匀性收敛远好于原始 GS。
| 算法 | 均匀性收敛 | 计算成本 | 典型用途 |
|---|---|---|---|
| 原始 Gerchberg-Saxton | 一般,易卡局部最优 | 低 | 单焦点、简单整形 |
| 加权 GS | 好 | 低 | 多焦点阵列、平顶 |
| 直接二分搜索(DBS) | 好 | 高 | 小规模、量化相位 |
| 模拟退火 / 遗传算法 | 好 | 高 | 大周期、复杂目标图样 |
选择依据主要是目标复杂度和网格大小。几百个焦点的复杂图样,才需要 DBS 或更重的优化;常规 3×3、5×5 阵列和矩形平顶,加权 GS 配上好的初始化就够用。模拟退火能处理带约束的最优问题,但迭代量通常是 GS 的几十倍,适合不赶时间的设计。
2.3.1 信号区与自由区:效率从哪来
GS 家族算法的关键自由度在焦平面:只有信号区的振幅被约束,信号区外的能量去哪都可以。相位恢复迭代时,算法会把多余能量尽量压向信号区外的"自由区",而不是硬塞进信号点里。信号区外保留自由,是衍射效率能否到百分之八十以上的分水岭。把整个焦平面都设成约束的做法效率很低,新手常在这里翻车。实际设计时,我一般先画一个信号区掩模,掩模外振幅字段每轮迭代都用当前值,不做替换,收敛效率和均匀性会明显改善。
3. 用 Python 跑通 3×3 多焦点 DOE 设计
3.1 定参数:波长、焦距、窗口与像素的关系
设计前先按光路布局把四个数定下来:波长 λ、焦距 f、窗口边长 L、采样网格 N。窗口乘上像素间距就是 L,L 和 N 决定焦面采样间隔 δ=λf/L,δ 又决定焦点能放多密。下面这组参数按常见激光微加工光路取值,后面所有代码都基于它:
| 参数 | 取值 | 说明 |
|---|---|---|
| 设计波长 λ | 1064 nm | 与激光器输出波长一致 |
| 焦距 f | 50 mm | 由聚焦镜布局决定 |
| 设计窗口 L | 5.32 mm | 1024 × 5.2 µm,约 5 倍波长量级 |
| 焦面采样间隔 δ | ≈10 µm | λf/L,设计网格与物理位置换算的桥梁 |
| 焦点间隔 | 300 µm | 对应 FFT 里 30 个采样格 |
| 相位量化台阶 | 8 | 三块掩膜的二元光学工艺 |
窗口加大,焦面采样变细,光斑变小、能摆的阵列更密,但加工特征尺寸跟着变小,难度上升。窗口选多大,本质是光学性能与加工能力的折中,没有独立于工艺的"最佳值"。
3.2 加权 GS 核心代码:最小可复现版本
代码实现了一个带自校正权重的加权 GS,目标图样是 3×3 等强度焦点。信号区外的振幅每轮保留当前值,这是效率能否做上去的关键:
import numpy as np from itertools import product def design_fanout(spot_map, n_iter=300, gamma=0.8, levels=8, seed=7): """加权GS生成多焦点DOE相位分布 spot_map: 浮点数组, 非零位置为目标焦点, 值为相对强度 返回: 量化后的相位数组, 单位弧度 """ ny, nx = spot_map.shape rng = np.random.default_rng(seed) phi = rng.uniform(-np.pi, np.pi, (ny, nx)) # 随机相位初始化 amp_target = np.sqrt(np.clip(spot_map, 0, None)) mask = spot_map > 0 # 信号区掩模 weights = np.ones_like(amp_target) for it in range(n_iter): u_in = np.exp(1j * phi) # 输入面: 均匀振幅 + 待优化相位 U = np.fft.fftshift(np.fft.fft2(u_in)) # 到焦平面 amp = np.abs(U) ph = np.angle(U) if it > 0: # 上一轮输出与目标的比值, 修正信号区振幅约束 ratio = np.where(mask, amp_target / np.maximum(amp, 1e-12), 1.0) weights = np.where(mask, weights * np.clip(ratio, 0.5, 2.0) ** gamma, 1.0) weights = np.where(mask, weights / weights[mask].mean(), 1.0) # 信号区用加权目标振幅, 自由区保留当前振幅 new_amp = np.where(mask, amp_target * weights, amp) target = new_amp * np.exp(1j * ph) u_back = np.fft.ifft2(np.fft.ifftshift(target)) phi = np.angle(u_back) # 输入面只取相位 step = 2 * np.pi / levels return np.round(phi / step) * step # 量化到 8 台阶 N = 1024 spot_map = np.zeros((N, N)) step_cell = 30 # 焦点间隔 30 格 = 300 um for di, dj in product([-1, 0, 1], [-1, 0, 1]): r, c = N // 2 + step_cell * di, N // 2 + step_cell * dj yy, xx = np.mgrid[r-6:r+7, c-6:c+7] # 用 1.5 格宽度高斯代替理想delta, 降低目标过尖导致的环纹 spot_map[yy, xx] += np.exp(-((yy - r) ** 2 + (xx - c) ** 2) / 4.5) phase = design_fanout(spot_map, n_iter=300) np.save("doe_fanout_3x3.npy", phase)逻辑说明:每一轮迭代先正向傅里叶变换到焦平面,取出振幅和相位;信号区把振幅约束替换成目标振幅乘权重,自由区保留当前振幅,然后带着统一相位逆变换回输入面。输入面丢弃振幅,只保留相位,这是相位型元件的物理约束。权重修正里 clip 到 0.5~2.0 是防止振幅比值过大导致振荡,gamma 取 0.8 控制修正速度。量化用 round 而不是 floor,因为 round 引入的相位误差均值为零,效率损失最小。
提示:代码按均匀振幅照明近似。真实高斯光入射时,把
u_in改成A_gauss * np.exp(1j*phi),并让边缘焦点的目标强度反比于入射强度做补偿,否则阵列边缘光斑会比中心弱。
3.3 量化台阶与效率:为什么要 8 台阶
连续相位量化到 L 个台阶,衍射效率相对理想连续相位有一个固定损失系数:η_L = (sin(π/L) / (π/L))²。这个式子的意思是,台阶越粗,波形拟合越差,能量漏到旁瓣和杂散等级里。
| 量化台阶数 | 相对效率 | 对应掩膜数 |
|---|---|---|
| 2 | 40.5% | 1 |
| 4 | 81.1% | 2 |
| 8 | 95.0% | 3 |
| 16 | 98.7% | 4 |
二元光学工艺里每增加一块掩膜,台阶数翻一倍。8 台阶用三块掩膜,效率已经到 95%,再上 16 台阶只提升不到 4 个百分点,掩膜成本和套刻误差却显著上升,所以量产多焦点器件大多停在 8 到 16 台阶。设计阶段先按连续相位算,最后量化,量化后的效率下降可以预先按上表估算。
3.4 设计质量的三个数字:均匀性、效率、信噪比
设计完成的相位,要回代仿真正式验收三个指标。均匀性用 AE 表示,AE = 1 - (I_max - I_min)/(I_max + I_min),越接近 1 越好;效率是九个焦点总能量占整个焦平面能量的比例;信噪比看信号区外有没有明显杂散亮斑,尤其是中心零级。验证代码:
I = np.abs(np.fft.fftshift(np.fft.fft2(np.exp(1j * phase)))) ** 2 rows = [N // 2 + step_cell * i for i in (-1, 0, 1)] cols = [N // 2 + step_cell * j for j in (-1, 0, 1)] vals = np.array([I[r-1:r+2, c-1:c+2].sum() for r, c in product(rows, cols)]) AE = 1 - (vals.max() - vals.min()) / (vals.max() + vals.min()) eff = vals.sum() / I.sum() print(f"均匀性 AE={AE:.3f} 衍射效率={eff:.3f}")每个焦点取 3×3 邻域求和,是因为焦点是 sinc 型分布,单点峰值受网格对齐影响大,邻域积分才代表真实能量。8 台阶设计做到 AE 大于 0.95、效率大于 0.8 是合格线。达不到时优先查两处:目标高斯宽度是否小于 1 格,以及目标图样是否离中心太近导致零级串扰。
4. 加工公差:从相位分布到真实 DOE
4.1 三条加工路线怎么选
设计出来的相位分布要落成表面浮雕,主流有三条路线:多掩膜光刻加反应离子刻蚀(ICP-RIE)、灰度光刻、激光直写。多掩膜光刻是二元光学标准工艺,每块掩膜对应一位量化,三块掩膜出 8 台阶,台阶数按 2 的幂增长,适合批量生产、一致性要求高的场景。灰度光刻用灰度掩膜一次曝光出连续轮廓,省去套刻步骤,但灰度可控性和刻蚀均匀性对设备依赖很强。激光直写适合原型验证和小批量,速度慢,胜在改版快,不制掩膜就能出样。
| 加工路线 | 台阶能力 | 单件成本 | 适用批量 | 主要误差来源 |
|---|---|---|---|---|
| 多掩膜光刻 + ICP-RIE | 4、8、16 台阶 | 低 | 大批量 | 套刻对准、深度控制 |
| 灰度光刻 | 连续 / 多台阶 | 中 | 中小批量 | 灰度标定、刻蚀非线性 |
| 激光直写 | 连续 | 高 | 原型 | 光斑重叠、定位漂移 |
选路线之前先确认最小特征尺寸。像素 5.2 µm、8 台阶时,最细结构的线宽就在 5 µm 附近,三块掩膜的工艺都能稳定做。如果设计为了追求大窗口把像素压到 1 µm 以下,激光直写和灰度光刻都要重新评估分辨率和侧壁陡度。
4.2 台阶深度换算:刻多深由波长和折射率决定
相位台阶和物理深度的换算关系是核心的一步。一个 2π 相位对应的总深度 H = λ/(n-1),分成 L 个台阶后,每个台阶深度 h_step = λ/(L·(n-1))。熔石英在近红外的折射率约 1.45,代入即得:
lam = 1064e-9 n = 1.4497 # 熔石英在 1064 nm 的折射率 H = lam / (n - 1) # 2π 相位对应总深度 h_step = H / 8 # 8 台阶单阶深度 print(f"总深度 {H*1e9:.0f} nm, 单阶深度 {h_step*1e9:.0f} nm")结果约 2366 nm 和 296 nm。不同波长对应的值差异明显,常见激光波长下的参数如下,方便直接查:
| 设计波长 | 熔石英折射率 | 2π 总深度 | 8 台阶单阶深度 |
|---|---|---|---|
| 1030 nm | ≈1.450 | 2.29 µm | 286 nm |
| 1064 nm | ≈1.4497 | 2.37 µm | 296 nm |
| 1550 nm | ≈1.444 | 3.49 µm | 436 nm |
这里最容易犯的错是刻蚀工艺按某一波长标定深度,换一个波长直接复用,导致整体相位偏移。系统性深度偏差不会平均分布到各焦点,而是集中泄漏到中心零级,表现就是焦面中央一个不受控的亮斑。
4.3 三类加工误差怎么毁均匀性
第一类误差是台阶深度误差。每阶深度偏差 δh 对应相位误差 δφ = 2π·δh·(n-1)/λ。以 1064 nm、8 台阶为例,δh 控制在 ±30 nm 时,单阶相位误差约 ±4.6 度,对均匀性影响不大,效率损失约 2~3 个百分点;但如果深度系统性偏深或偏浅,零级能量会显著上升。实际下单时,台阶深度公差按 ±3% 提是比较稳妥的常规做法。
第二类误差是线宽或占空比误差,来源于光刻和刻蚀的选择比偏差。占空比不对称会让各级次能量分配失衡,在 3×3 阵列上就表现为某一列或某一行偏亮。以 5.2 µm 像素为例,CD 均匀性通常要求 ±0.2 µm 以内,超过这个量级光斑间亮度差肉眼可见。第三类是侧壁角度和表面粗糙度。侧壁不够垂直会把能量散射到信号区外,降低信噪比;粗糙度 Ra 超过 10 nm 时,焦面会出现弥散背景,暗背景和杂散等级都变难看。
4.4 波长与温度:DOE 不是宽带元件
相位的温度稳定性其实不错,熔石英热光系数在每开尔文 10⁻⁵ 量级,几十度温差引入的相位变化不到 0.1%,可以忽略。真正麻烦的是波长。多焦点阵列的焦点间距正比于波长,设计波长 1064 nm 的器件用在 1030 nm 光源上,300 µm 的间距会整体缩小约 1%,长焦距、大阵列时误差累积不可忽视。平顶整形对波长更敏感,波长偏移会让边缘轮廓变软、顶部出现波纹,因为平顶相位里包含大台阶深度的结构,相位误差按深度放大。所以下单前必须和光源方确认实际输出波长和线宽,半导体激光器 2 nm 量级的线宽在严格场景下就要考虑改用消色差设计或双层补偿结构。
5. 实测验证与两个收敛技巧
5.1 焦面测量要测什么、怎么测才准
拿到成品后,第一步是搭焦面测量光路:激光经过 DOE 后用 f=50 mm 透镜聚焦,相机放在透镜后焦面。测量优先看能量积分而不是峰值,因为相机像素与光斑尺寸的采样关系会掩盖真实峰值。本文参数里光斑约 10 µm 量级,相机像素在 5 µm 以内才能采到两到三个点,取每个焦点 3×3 邻域的灰度积分作为能量值。测量前先采集暗场帧减掉,再对多个帧取平均,避免散斑和光源抖动造成误判。衍射效率用功率计测:焦面处用光阑框住九个焦点测总功率,除以 DOE 前的入射功率,记得扣除基片反射损耗。
5.2 均匀性不达标时的两遍设计回路
实测 AE 低于 0.9 时,不要急着怀疑加工,先做一遍补偿设计:把实测每个焦点的相对强度记下来,新的目标强度设为 I_new = I_design × (mean(I_meas) / I_meas)^p,p 取 0.7 到 1.0,然后用这个修正后的目标重跑一遍设计。这个回路通常两到三轮就收敛,因为加工误差在信号区各点之间有相关性,反向修正能直接吃掉系统性偏差。如果补了两轮还压不下去,重点查焦点间距是否太近导致邻域串扰,以及零级是否被自由区泄漏污染。
5.3 一个零成本技巧:零填充细化光斑位置
FFT 设计有一个隐性约束:焦点只能落在采样网格的整数格点上。需要把焦点放在非整数位置(例如五个不等距焦点),常见做法是零填充。把设计网格从 N×N 零填充到 4N×4N 再做 FFT,焦面采样间隔从 δ 变成 δ/4,光斑位置分辨率直接提高四倍,算法和加工参数完全不用动。实现时把 spot_map 画在放大后的网格对应坐标上,设计完把相位裁回原窗口即可。需要注意放大网格上信号区外继续保持整块自由,否则均匀性反而不如原网格。这个技巧在调试焦点间距离不均、消除阵列周期性伪影时最常被用到,也是多焦点 DOE 设计里性价比最高的细化手段。
本文还有配套的精品资源,点击获取