3. Zernike多项式的分类与索引:Noll序列、Fringe序列、标准Zernike与扩展Zernike的区别

做光学设计这些年,我见过不少同行在Zernike多项式索引上栽跟头。明明算出来的系数是对的,导入加工软件一看,面型完全对不上。问题出在哪?多半是序列搞混了。

今天咱们就把这事彻底理清楚。Zernike多项式不是只有一套,而是有好几套“方言”。不同软件、不同标准,用的索引方式不一样。你想想看,如果设计用Noll序列,加工用Fringe序列,那结果能对吗?

3.1 为什么会有多种索引方式?

Zernike多项式在单位圆上正交,这个性质很好。但问题在于,多项式的排列顺序并没有一个“国际统一标准”。不同领域的人,根据自己的习惯,搞出了不同的排序方法。

  • Noll序列:最早由R. J. Noll在1976年提出。天文领域用得最多,尤其是自适应光学和大气湍流分析。
  • Fringe序列:由ZYGO公司推广,干涉测量和光学加工领域的主流选择。我早期做干涉仪数据处理时,用的就是这套。
  • 标准Zernike:严格遵循Born & Wolf定义的数学形式,强调正交性和归一化。
  • 扩展Zernike:在标准Zernike基础上增加额外项,用于描述非圆形孔径或特殊面型。

核心要点:Noll和Fringe是索引顺序不同,标准与扩展是多项式集合不同。这两组概念不要混为一谈。

3.2 Noll序列:天文学家的“母语”

Noll序列的特点是按照径向阶数n和角向频率m的某种组合来排序。它优先排低阶项,然后按m的绝对值从小到大排列。

我记得第一次用Noll序列时,查了半天表才找到像散对应的索引号。它的索引j从1开始,对应关系如下:

Noll索引 j 径向阶数 n 角向频率 m 多项式名称
1 0 0 Piston(平移)
2 1 1 Tilt X(倾斜X)
3 1 -1 Tilt Y(倾斜Y)
4 2 0 Defocus(离焦)
5 2 2 Astigmatism X(像散X)
6 2 -2 Astigmatism Y(像散Y)
7 3 1 Coma X(彗差X)
8 3 -1 Coma Y(彗差Y)
9 3 3 Trefoil X(三叶草X)
10 3 -3 Trefoil Y(三叶草Y)
11 4 0 Spherical(球差)

个人经验:如果你用MATLAB的Zernike计算函数,很多默认就是Noll序列。我建议在代码开头就明确声明序列类型,避免后续混淆。

3.3 Fringe序列:干涉仪的“行话”

Fringe序列是ZYGO干涉仪的标准输出格式。它的排序逻辑和Noll不同——它把低阶像差放在更前面,而且对某些项的排列做了调整。

举个例子,在Noll序列中,离焦(Defocus)是第4项,像散(Astigmatism)是第5、6项。但在Fringe序列中,离焦是第4项,像散却变成了第5、6项?不对,Fringe里像散的索引是5和6,但顺序和Noll不一样。

我直接给你看对比:

像差名称 Noll索引 Fringe索引
Piston 1 1
Tilt X 2 2
Tilt Y 3 3
Defocus 4 4
Astigmatism X 5 5
Astigmatism Y 6 6
Coma X 7 7
Coma Y 8 8
Spherical 11 9

看到了吗?球差(Spherical)在Noll里是第11项,在Fringe里是第9项。这就是个大坑。我曾经有个项目,设计文件里球差系数写的是第11项,加工方按Fringe读成了三叶草,结果磨出来的镜片完全不能用。

避坑指南:与加工厂或检测方对接时,一定要书面确认双方用的是哪种序列。我建议在技术文档里同时标注“Noll j=11”和“Fringe j=9”这样的双重索引。

3.4 标准Zernike vs 扩展Zernike

说完索引顺序,咱们再聊聊多项式集合本身。

标准Zernike多项式定义在单位圆上,满足正交性。它的形式是:

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

其中R_n^m(ρ)是径向多项式,n和m满足:n ≥ 0,|m| ≤ n,且n-|m|为偶数。

扩展Zernike则是在标准集合的基础上,增加了额外的项。比如:

  • 增加更高阶的径向项(n > 10或更高)
  • 增加非对称项(用于描述非圆对称面型)
  • 增加与孔径形状相关的修正项

我个人习惯,在常规光学设计中只用标准Zernike的前37项(n ≤ 8)。只有在做自由曲面或特殊孔径时,才会用到扩展Zernike。

3.5 知识结构总览

下面这张图帮你理清这四者的关系:

Zernike多项式分类与索引关系图 Zernike多项式分类与索引体系 Zernike 多项式 索引方式(排序规则) 多项式集合(定义范围) Noll 序列 Fringe 序列 标准 Zernike 扩展 Zernike 天文 / 自适应光学 干涉测量 / 加工 数学定义 / 学术 自由曲面 / 特殊孔径 关键提醒 • Noll 与 Fringe:索引顺序不同,同一像差对应不同编号 • 标准与扩展:多项式集合不同,扩展包含更多高阶/非对称项 • 实际使用中,必须同时确认“用哪套序列”和“用哪套集合”

3.6 实际项目中的选择建议

说了这么多理论,到底该怎么选?我根据多年项目经验,给你几条实在的建议:

  1. 看检测设备:如果用的是ZYGO干涉仪,默认就是Fringe序列。别自己改成Noll,除非你确认下游能接。
  2. 看设计软件:Code V和Zemax的Zernike系数导出格式不同。Code V常用标准Zernike,Zemax里可以选Fringe或标准。
  3. 看加工能力:普通数控加工,用前37项标准Zernike就够了。自由曲面加工,可能需要扩展到64项甚至更多。
  4. 看学术论文:天文领域的论文几乎都用Noll序列。如果你写论文,记得在方法部分明确说明。

我的习惯:在项目启动阶段,我会做一个“Zernike序列对照表”,把Noll和Fringe的前37项一一对应列出来。发给所有合作方签字确认。这步虽然麻烦,但能省掉后面无数扯皮。

3.7 代码示例:序列转换

下面是一个简单的Python函数,用于在Noll和Fringe索引之间转换。实际项目中,我建议你维护一个完整的映射表。

def noll_to_fringe(j_noll):
    """
    将Noll索引转换为Fringe索引(前11项)
    输入:j_noll (int) - Noll索引,从1开始
    返回:j_fringe (int) - Fringe索引
    """
    # 映射表:Noll索引 -> Fringe索引
    mapping = {
        1: 1,   # Piston
        2: 2,   # Tilt X
        3: 3,   # Tilt Y
        4: 4,   # Defocus
        5: 5,   # Astig X
        6: 6,   # Astig Y
        7: 7,   # Coma X
        8: 8,   # Coma Y
        9: 10,  # Trefoil X
        10: 11, # Trefoil Y
        11: 9,  # Spherical
    }
    return mapping.get(j_noll, None)

# 示例:球差在Noll中是11,在Fringe中是9
print(f"Noll j=11 → Fringe j={noll_to_fringe(11)}")

这段代码虽然简单,但核心逻辑就是“查表”。你想想看,与其每次手动换算,不如写个函数一劳永逸。

3.8 本章小结

好了,咱们把Zernike多项式的分类和索引彻底捋了一遍。记住三件事:

  • Noll和Fringe是索引顺序不同,不是多项式本身不同
  • 标准和扩展是多项式集合不同,扩展包含更多项
  • 实际使用中,两者必须同时确认,缺一不可