3. Zernike多项式面型:定义、性质与工程实现

Zernike多项式,说白了就是一组在单位圆上正交的数学函数。为什么光学设计里非要用它?因为像差本身就是圆对称的——你想想看,镜头的光瞳是圆的,波前误差在光瞳上分布,用Zernike来描述再自然不过了。

我个人习惯把Zernike多项式比作“光学界的傅里叶级数”。傅里叶级数用正弦波拟合任意信号,Zernike多项式用一组基函数拟合任意波前。每个基函数对应一种像差类型——离焦、像散、彗差、球差……名字都是我们光学人天天打交道的。

3.1 Zernike多项式的数学定义

Zernike多项式通常用极坐标表示:

Z_n^m(ρ, θ) = R_n^m(ρ) · cos(mθ)   (m ≥ 0)
Z_n^{-m}(ρ, θ) = R_n^m(ρ) · sin(mθ)  (m < 0)

其中:

  • ρ:归一化径向坐标,0 ≤ ρ ≤ 1
  • θ:角度坐标,0 ≤ θ ≤ 2π
  • n:径向阶数,非负整数
  • m:角向频率,|m| ≤ n 且 n-|m| 为偶数
  • R_n^m(ρ):径向多项式,由Rodrigues公式生成

径向多项式长这样:

R_n^m(ρ) = Σ_{k=0}^{(n-|m|)/2} (-1)^k · (n-k)! / (k! · ((n+|m|)/2 - k)! · ((n-|m|)/2 - k)!) · ρ^{n-2k}

嗯,公式看着有点吓人。但实际用的时候,我们查表就行。前几项我背得滚瓜烂熟:

n m Zernike多项式 像差名称
0 0 1 平移(Piston)
1 1 ρ cosθ X轴倾斜(Tilt X)
1 -1 ρ sinθ Y轴倾斜(Tilt Y)
2 0 2ρ² - 1 离焦(Defocus)
2 2 ρ² cos2θ 0°像散(Astigmatism 0°)
2 -2 ρ² sin2θ 45°像散(Astigmatism 45°)
3 1 (3ρ³ - 2ρ) cosθ X轴彗差(Coma X)
3 -1 (3ρ³ - 2ρ) sinθ Y轴彗差(Coma Y)
4 0 6ρ⁴ - 6ρ² + 1 球差(Spherical)

核心性质:Zernike多项式在单位圆上正交——

∫∫ Z_n^m(ρ,θ) · Z_n'^m'(ρ,θ) · ρ dρ dθ = 0 (当 n≠n' 或 m≠m')

这意味着每个系数独立描述一种像差,互不干扰。这是它最大的工程价值。

3.2 标准Zernike vs Fringe Zernike

做工程的人最头疼的就是:同一个东西,不同软件叫法不一样。Zernike多项式就是典型。

标准Zernike(也叫OSA标准):严格按n、m双指标排序,n从0开始。学术论文、干涉仪测量多用这个。

Fringe Zernike:单指标排序,从Z1到Z37(常用前37项)。Zemax、Code V等商业软件用这个。

我当年刚入行时就被这个坑过——在Zemax里导出的Zernike系数,直接拿去MATLAB分析,结果对不上。后来才发现是排序方式不同。

对比项 标准Zernike Fringe Zernike
索引方式 双指标 (n, m) 单指标 j
排序规则 按n增序,同n按m增序 按像差阶数+对称性排列
常用项数 无固定限制 前37项(Z1~Z37)
归一化方式 RMS归一化 峰谷值归一化
典型应用 学术研究、干涉仪 商业光学软件
代表软件 MATLAB、Python Zemax、Code V

避坑指南:我曾经在Zemax里用Fringe Zernike拟合了一个自由曲面,导出系数后直接代入自研的干涉仪分析程序。结果波前图完全对不上。查了两天才发现——Fringe Zernike的归一化因子和标准Zernike不同,差了√(2n+2)倍。从那以后,我每次做数据交换都会加一句:请注明Zernike类型和归一化方式。

3.3 在光学设计软件中的实现

Zemax和Code V都支持Zernike面型。我以Zemax为例,讲一下具体怎么用。

3.3.1 Zemax中的Zernike Standard面型

在Zemax里,面型类型选“Zernike Standard Sag”。公式是:

z(ρ, θ) = c·ρ² / (1 + √(1 - (1+k)·c²·ρ²)) + Σ A_j · Z_j(ρ, θ)

前半部分是标准球面/非球面基底,后半部分是Zernike多项式叠加。系数A_j就是我们要优化的变量。

操作步骤:

  1. 打开Lens Data Editor,选中要编辑的面
  2. Surface Type选“Zernike Standard Sag”
  3. 设置曲率半径c、圆锥系数k(基底参数)
  4. 在“Extra Data”里输入Zernike系数A_1到A_37
  5. 将系数设为变量,加入优化函数

我的经验:刚开始用Zernike面型时,别一上来就放37项。我建议先放前9项(到球差),看优化效果。如果残差不够,再逐步增加。项数越多,优化越容易陷入局部最优,而且加工难度也直线上升。

3.3.2 Code V中的实现

Code V里用“Zernike Polynomial”面型。语法是:

srd s1
type zernike
rdy -100
k 0
znf 1 0.001
znf 2 0.0005
znf 3 -0.002
...

其中znf j coeff表示第j项Fringe Zernike系数。Code V默认使用Fringe Zernike排序。

3.3.3 系数提取与后处理

优化完成后,怎么把Zernike系数导出来?

Zemax:

  • Analysis → Wavefront → Zernike Coefficients
  • 可以导出为文本文件,或直接复制到剪贴板

Code V:

  • 使用out zernike命令
  • 或通过宏zernike.seq批量导出

工程建议:导出的Zernike系数,我习惯用Python做一次可视化验证。把系数代回Zernike多项式,重建波前,和软件里的波前图对比。如果一致,说明系数提取正确;如果不一致,十有八九是排序或归一化搞错了。

3.4 Zernike面型的知识体系

下面这张图是我自己总结的Zernike面型知识框架,帮你理清思路:

Zernike多项式面型知识体系 Zernike多项式面型 数学定义与性质 标准 vs Fringe 软件实现 极坐标表示 Z_n^m(ρ,θ) 径向多项式 R_n^m(ρ) 单位圆正交性 标准Zernike:双指标(n,m) Fringe Zernike:单指标j 归一化方式差异 Zemax:Zernike Standard Sag Code V:type zernike 系数提取与验证 工程应用:自由曲面建模 · 波前拟合 · 像差分析 核心要点 ① 理解正交性:每个系数独立描述一种像差 ② 区分标准/Fringe:数据交换时务必注明类型 ③ 从少到多:先9项后逐步增加,避免过拟合

3.5 实用技巧与避坑

最后分享几个我这些年积累的经验:

  • 系数数量控制:自由曲面一般用前37项就够了。超过37项,加工厂会骂人的——检测设备通常只支持到37项。
  • 对称性利用:如果系统是旋转对称的,只保留m=0的项(离焦、球差等),能大幅减少变量。
  • 系数单位:Zemax里系数单位是毫米,Code V里也是毫米。但有些干涉仪软件用波长做单位。转换时别忘了乘以波长。
  • 验证方法:我每次做完Zernike面型优化,都会用Python重建面型,和软件里的3D图对比。肉眼确认没问题了,再往下走。

再强调一次:Zernike多项式的正交性只在单位圆上成立。如果你的光瞳不是圆形(比如有遮挡),正交性就破坏了。这时候用Zernike拟合,系数之间会耦合,解释像差时要小心。

好了,Zernike多项式面型就讲到这里。内容不少,但核心就三件事:理解正交性、区分标准与Fringe、掌握软件操作。把这三点吃透了,后面讲自由曲面建模就轻松多了。