计算全息相位片生成指南:从GS算法到SLM光路调试

发布时间:2026/10/17 3:10:20
计算全息相位片生成指南:从GS算法到SLM光路调试 做光学实验的人几乎都遇到过这种场景辛辛苦苦搭好了光路结果在成像面看到的不是设计好的图案而是一团斑驳、发暗、还带刺眼光点的噪声。十次里有八次问题就出在计算全息生成的相位片上。计算全息配合相位片说白了就是用计算机算出一张只带相位信息的光学掩模把它加载到空间光调制器SLM上用一束激光照过去就能在特定距离处重建出你想要的任意光场。相比传统物理全息拿着干板去记录干涉条纹它的优势非常明显灵活、可编程、能实时切换。所以从全息投影、激光光束整形到光镊阵列、AR显示到处都有它的身影。不过这套东西看着原理简单实际做起来坑相当多。衍射模型选错、迭代算法不收敛、SLM的灰度-相位曲线没校准……每一步都会直接在光路上暴露出来。今天我把从目标图到一块可用相位片的完整路径捋一遍包括算法怎么选、参数怎么调、实验台上哪些坑必须绕开适合刚接触计算全息的研究生、做光学工程的工程师以及想自己动手玩SLM的爱好者。1. 先从本质上搞懂为什么生成的是“相位片”1.1 物理全息为什么被计算全息按在地上磨传统全息用激光干涉记录物体的波前需要在防震台上曝光还要用银盐干板或者光聚合物做化学处理拍一张全息照片动不动就是半天。而且物体一旦换了整块干板就废了根本没有“修改”的余地。计算全息把这些麻烦全扔给了计算机。光场传播是有确定数学模型的那就不需要真的让两束光去干涉直接在算法里把传播过程算出来得到一块等效的“全息图”。这块全息图可以做成静态的衍射光学元件也可以动态加载到SLM上按帧刷新。做实验时我可以上午投影一个三维齿轮模型下午改成光镊阵列中间只需要重新算一张相位片不用碰任何机械结构。计算全息的核心价值在于它把“记录光场”变成了“计算光场”。物理全息是硬件问题计算全息是软件问题。软件问题意味着可以迭代优化、可以用各种算法逼近理想结果这是它碾压传统方案的根本原因。1.2 相位片和振幅片差的不是一点半点早期做计算全息很多人用印刷底片或者掩模直接记录透过率分布那就是振幅片。光经过这种片子输出面上各点的光强被直接调制原理很直观。但振幅片有两个致命短板一是光被大量吸收衍射效率低得可怜二是零级透射光非常强打在成像面上是一个刺眼的亮斑把重建图像都盖住了。相位片就不同了。它不吸收能量只在每个像素上给光附加一个0到2π的相位延迟。光场内部的相位重新分布能量守恒干涉后能量汇集到目标位置。理论上纯相位光栅的一级衍射效率能到100%就算实际做成8台阶量化理论效率也还有95%左右。而振幅型光栅最高理论衍射效率才10%左右这差距不在一个量级。顺便说一句相位片的“相位”不是直接等于目标图像的相位。目标图像通常只给了一个振幅分布我们要做的是找出一个合适的相位分布使得光传播到目标面后干涉叠加出来的振幅正好变成想要的图案。这是个典型的逆问题也是整个计算全息最核心的一道坎。1.3 从复振幅到纯相位问题的数学本质一个光场用复振幅描述包含振幅和相位两部分。真正的全息图需要同时记录两者但市面上绝大多数SLM只能调制相位或者只能调制振幅。这样一来从“想要的复振幅”到“能加载的纯相位”存在一个相位恢复问题给定输出面的目标振幅求输入面的相位分布使得经过衍射传播后输出面的振幅无限逼近目标。数学上这个问题通常没有唯一解甚至不一定有严格解因为自由度数不匹配。输入面有N个相位自由度输出面要求M个振幅约束当M大于N时只能近似。这也是为什么没有“一步到位”的解析公式必须靠迭代算法反复逼近。理解了这个本质你就明白接下来所有算法的必要性不是我们不想一步算出来而是这个问题本身就是个病态逆问题。所有迭代、优化、深度学习都是在庞大的解空间里找一个“够用”的解。2. 相位片怎么算出来核心算法与数学工具2.1 衍射传播模型怎么选直接决定计算结果靠不靠谱计算全息的全部基础就是把输入面的光场传播到输出面算清楚。常用的标量衍射模型就三种夫琅禾费衍射、菲涅尔衍射、角谱传播。夫琅禾费衍射本质是一次傅里叶变换适用条件是传播距离足够远或者输入面位于透镜前焦面、输出面在透镜后焦面。它的好处是计算快、实现简单很多全息显示系统都把SLM放在透镜前焦面直接做傅里叶变换所以GS算法最经典的版本就是基于FFT的。菲涅尔衍射适用中等距离的傍轴传播计算形式是在傅里叶变换前后各乘一个二次相位因子。它的特点是引入了一个“有效焦距”的概念常用来生成离SLM几十厘米处重建的图案。需要注意采样间隔关系输入面采样间隔为Δ目标面采样间隔一般变成 λz/(NΔ)也就是说传播距离越远目标面的像素尺寸越大。角谱传播则是从平面波分解的角度严格计算的它在任意距离都满足亥姆霍兹方程不引入傍轴近似。做法是输入场做FFT乘上角谱传递函数 Hexp(i·k·z·sqrt(1−(λfx)²−(λfy)²))再逆FFT回来。角谱法的输出面采样间隔和输入面一致这在某些要做高分辨率叠放、多平面计算时非常方便但它的代价是传播距离较远时高频成分容易混叠实际使用时常需要加大计算窗口。下面这张表是我自己选模型时的速查表传播模型适用场景计算形式优点需要注意夫琅禾费FFT远场 / 透镜焦面一次FFT速度快实现简单目标面采样间隔与距离有关菲涅尔中等距离傍轴传播二次相位因子 FFT适合“离SLM几十厘米重建”可能有采样条件约束角谱法任意距离、输入输出采样一致FFT × 传递函数 × IFFT精确、适合多平面远距离高频混叠风险如果你只在仿真里做做图案验证夫琅禾费就够了。一旦要上光路建议先想清楚你的重建平面到底在什么位置。很多新手拿着FFT的GS去算一个需要在50cm处重建的相位片结果上光路怎么都聚焦不到目标位置就是这个模型选错了。2.2 GS算法最经典、最皮实、也最容易上手的迭代框架Gerchberg-Saxton算法是相位恢复绕不开的起点。它的思路非常直观输入面和输出面之间来回传播每一步都强行施加该平面的约束。标准流程是这样的生成一个随机相位φ₀输入面振幅设为均匀的1得到初始输入场 exp(iφ₀)。正向传播到输出面得到输出场 E_out相位记为 ψ。用目标振幅 T 替换输出场的振幅保留相位 ψ得到修正后的输出场 T·exp(iψ)。反向传播回输入面得到输入场 E_in。用振幅1替换输入场的振幅保留相位得到新的 exp(iφ₁)。回到第2步反复迭代直到重建结果不再明显改善。核心思想就一句话在输入面保证“纯相位”在输出面保证“目标振幅”两边交替投影。由于每一步都分别满足一个约束算法会逐渐收敛到一个两边都尽可能满足的解。我自己的体会是GS算法对新手非常友好代码量很小问题是怎么判断“收敛了”。通常做法是每迭代几十次算一次重建振幅和目标振幅之间的均方根误差RMSE看到曲线平滑、变化很小时就停。但RMSE低不等于实验效果好因为低频误差对RMSE影响大高频噪声却更伤视觉观感。所以我实际用时通常把迭代次数先固定在100~200次肉眼判断重建质量再用定量指标辅助。GS最大的问题是容易陷入局部最优尤其目标图案复杂、包含大面积均匀区域时重建面上容易出现中心亮斑和边缘噪声。解决办法就是下面要说的实用改进。2.3 让相位片质量再上一个台阶实用改进算法GS的改进方向非常多我只说在项目里真正管用的三个思路。第一个是加权GS。标准GS对输出面每个像素的约束强度一视同仁而加权GS会根据局部误差动态调整约束强度。做法是把目标振幅替换为 T·(1α·(1−|E_out|/T)) 一类带反馈的形式让误差大的区域被“用力纠正”误差小的区域少扰动。这个α一般取0.2~1.0需要试。我碰到连续灰度图案用它比较多收敛速度肉眼可见地加快。第二个是多随机初值取最优。相位恢复的解空间是非凸的初值不同结局不同。写个循环随机生成十几组初始相位分别跑几十次迭代挑重建误差最小的那组继续迭代到收敛。看起来浪费计算量实际才多了几秒质量提升明显非常适合“离线算一次、实验用很久”的场景。第三个是梯度类优化。GS本质上是走一步算一步的投影法而把重建误差定义为损失函数用梯度下降或Adam去优化输入相位在很多复杂目标上做得更好。工业界不少全息显示方案在用这类方法配合数值优化框架跑高精度相位片。缺点是调参麻烦计算量大用来做最终微调比覆写全套流程更划算。顺带提一句很多人一上来就问“有没有更高级的算法”我的建议是先用标准GS把整条链路跑通再逐步加改进。因为实验台上一堆变量如果算法本身太复杂出了问题都不知道是哪个环节引起的。3. 手把手实操用Python从一张目标图生成可用的相位片3.1 工具链和硬件准备我目前的标配是Python加NumPy加SciPy计算量够了不依赖任何商业软件。GPU可要可不要单张512×512相位片用CPU跑100次迭代也就几十毫秒到一两秒的事。真正需要GPU的是做实时显示或者用深度学习生成相位片的场景。硬件方面动态加载相位片基本靠SLM市场上主流是LCOS-SLM常见像素间距在3到10微米范围灰度位深8bit或10bit。位深影响相位量化台阶10bit的相位台阶更细腻重建图像的灰阶过渡会好一些。实验光路需要一个偏振片大多数LCOS-SLM只调制特定偏振方向、一个分束器或斜入射方案外加一束干净的扩束准直光。如果是做静态相位片后面会提光刻或直写但前期算法验证阶段完全不需要仿真加SLM就够了。3.2 核心代码一张目标图到相位片的完整流程下面这段代码是我做傅里叶域GS的骨架去掉了很多工程细节保留核心逻辑import numpy as np def gs_fft(target_amp, iters100, random_seed0): ny, nx target_amp.shape rng np.random.default_rng(random_seed) phase rng.uniform(-np.pi, np.pi, (ny, nx)) for _ in range(iters): # 输入面纯相位振幅为1 field_in np.exp(1j * phase) # 正向传播夫琅禾费衍射用一次FFT field_out np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(field_in))) # 输出面约束替换振幅保留相位 field_out target_amp * np.exp(1j * np.angle(field_out)) # 反向传播逆FFT field_in np.fft.ifft2(np.fft.ifftshift(field_out)) phase np.angle(field_in) return phase这里面有几个细节值得说一下。采样数要和目标图一致。如果SLM像素是1920×1080你就用1920×1080的数组计算周围可以补零扩大窗口。补零能提升有效分辨率、减轻高频混叠我习惯把计算窗口扩到目标尺寸的1.5到2倍迭代完成后再裁出对应SLM的部分。初始随机相位最好用均匀分布不要每次都用固定种子。固定种子方便复现但会固定住那个可能的局部最优解。项目前期我建议设随机种子跑几组对比选定型方案时再固定。FFT坐标要处理好。NumPy的FFT默认零频在数组左上角实验上我们通常希望零频在中心所以前后加上fftshift和ifftshift。顺序错一点重建图案就会颠三倒四我第一次就是被这个坑了半天。如果做的是菲涅尔域全息把“传播”换成两次相位因子乘法和FFT即可角谱法则是乘传递函数结构完全一样。核心迭代逻辑不变变的只是传播算子。目标振幅T的取值不是越高越好。目标图如果是8bit图像像素值0到255我建议归一化到0到1。大面积白底的目标会让GS很痛苦因为要同时满足亮区和暗区自由度不够就会出噪声。实际处理时可以把背景压暗或者干脆只约束亮目标区域、背景区域不约束效果反而干净。3.3 相位片算出来之后怎么判断质量判断相位片好坏不能只看“图认不认得出来”。我一般看三个指标。第一是衍射效率定义为重建目标区域内的光能量占总入射光能量的比例。SLM加载纯相位片后理论上很高但实际因为像素死区、灰度量化、LUT偏差能做到85%以上就算不错。第二是RMSE重建振幅和目标振幅的均方根误差。注意要在归一化之后比较而且最好排除背景区域来算。RMSE是个总体指标它低不代表没有孤立亮点。第三是均匀性误差对平顶光束整形、多焦点阵列这些应用特别重要一般用目标区域内强度的标准差除以平均值目标做到5%以内属于优秀。仿真里看起来达标的相位片上光路后通常还会打折扣。因为仿真的理想平面波和SLM前真实的高斯光束不一样入射光强分布不均匀会造成重建亮度失真。处理办法是把高斯光强分布写进仿真模型里或者在上实验台前把光束扩束到SLM有效面积的1.5倍以上让有效照明区域尽量均匀。4. 实验台上避坑指南从相位片到重建光场4.1 上光路之前先老老实实校准SLM这是我认为整个实验环节最容易被轻视的一步。SLM的灰度到相位不是线性映射厂家给的出厂曲线只能参考实际会因为环境温度、驱动电压、入射角不同而漂移。如果不校准你辛辛苦苦算的相位片加载上去相位关系全是歪的重建效果自然惨不忍睹。校准LUT的常用做法是相移干涉法搭建一台迈克尔逊干涉光路一臂是SLM另一臂是参考镜SLM上加载均匀灰度图改变灰度值观察干涉条纹移动量得到灰度到相位的对应曲线。效率高一点的做法是加载一个周期光栅并测一级衍射效率随灰度的变化反推相位调制深度。这两种我都试过前者精度高后者更快。校准之后要做的事是确认最大相位调制深度覆盖2π以上。如果不够就需要调整SLM的驱动电压或查找合适的偏置电平。相位深度不足2π重建图像的高频细节和对比度会明显变差这是我踩过的最典型的硬件坑。4.2 零级光和孪生像影响相位片重建效果的经典双煞SLM的像素结构里包含不可调的电极间隙、死区这部分光不参与相位调制直接镜面反射形成零级光斑打出来就是成像中心一个刺眼亮点。理论上计算再好都躲不开它只能在相位片设计层面绕开。最常用的方案就是在相位片上叠加一个闪耀光栅相位。具体做法给相位片整体加上 2π·(x·sinθ_x y·sinθ_y)/λ 的线性相位等效于把重建图案整体衍射到1级方向偏离零级光斑。加载到SLM上时由于SLM灰度有限闪耀光栅被量化成台阶状衍射效率会有损失但换来的干净背景非常值。孪生像是另一个老熟人。纯相位片本质上同时携带共轭信息重建时会出现一个共轭像叠在目标像上。解决办法同样是离轴给相位片加随机初始相位或者离轴分量把共轭像推到旁边区域再用光阑滤掉。我在实际项目里几乎不给“正对着零级”的相位片方案留机会一律离轴设计省心得多。4.3 常见问题排查速查表下面这个表算是我这几年实验现场总结出的高频问题按现象检索直接改就行。现象可能原因处理办法中心出现刺眼亮斑SLM像素死区产生的零级光未分离给相位片叠加闪耀光栅离轴重建在频谱面挡零级重建图像整体发暗相位调制深度不足2π / LUT不准确重新标定灰度-相位曲线检查驱动电压图像出现对称重影纯相位共轭像干扰相位片加随机初相位或增大离轴量加光阑滤除重建面出现颗粒感或散斑入射光不干净 / SLM像素间串扰 / 高频采样不足清洁光路扩大计算窗口补零适当降低高频权重量化台阶明显灰阶不连续SLM灰度位深不足选用10bit SLM或对相位片做误差扩散处理亮度随时间漂移LCOS温度升高导致相位漂移开机预热20分钟注意散热通风只有一部分区域重建清晰入射光不均匀 / SLM填充率低扩束到SLM面积1.5倍以上用平顶光束整形这里再补一个独家小技巧排查问题时先固定所有光路参数只改一张已知效果很好的“标准相位片”比如一个纯光栅或者均匀方块。如果连标准片都重建不好问题基本在硬件和光路标准片没问题再回来查你的算法和目标图设置。别一上来就在算法里翻来覆去找bug那样效率极低。5. 从单幅相位片到更复杂的应用场景5.1 三维全息和多平面重建单幅相位片只能在一个深度重建一个图案但很多应用要的是立体感。常见做法是多平面GS把目标分成几个深度层迭代时每一层分别用对应的角谱传播算子做约束轮流更新相位片。多平面计算的难点是不同深度之间会串扰越靠后的平面越容易被前面平面的能量干扰。我一般每个平面迭代前都根据期望亮度设置不同的权重靠近光源的平面权重略低一点让能量尽量分给远处平面最终均衡感会好很多。这类算法计算量翻倍但用来做几个平面的简单三维显示非常够用。5.2 深度学习加速和实时生成传统迭代算法生成一张相位片要几十到几百毫秒在实时全息显示、VR/AR近眼系统里是不够的。这几年深度学习往这个领域渗透得很厉害基本思路是用大量物理仿真数据训练一个卷积神经网络输入目标图直接输出相位片推理速度能做到毫秒级。但我不建议无脑追这个方向。神经网络学习到的映射高度依赖训练数据的分布换个目标风格效果可能崩。稳妥做法是网络出初值再用GS或者梯度优化微调几十次迭代兼顾速度和精度。这个组合方案在需要实时切换图案的动态全息里越来越常见值得关注。5.3 静态相位片把计算结果变成真正的光学元件不是所有场景都需要动态SLM。大批量生产光学元件时更合适的是把计算好的相位图做成静态衍射光学元件DOE。常见工艺有灰度光刻、激光直写、双光子聚合和纳米压印。静态相位片设计时要额外考虑灰度量化。相位值被离散成2台阶、4台阶、8台阶时理论衍射效率分别约为40%、81%、95%。台阶数越高制作难度越大。实际项目里4台阶和8台阶最常用平衡成本和效率。另一个关键参数是微结构的深宽比太高了工艺上不好做设计时要留意。我见过不少团队直接在SLM上验证完相位图就把同一张图拿去加工成DOE中间省掉了大量试错成本。这也是计算全息最大的好处在软件里把坑都趟平了再做硬件一次成功率远高于纯试错的老路子。最后再聊一点个人体会。我刚接触计算全息那阵子总憋着找“最好的算法”后来发现项目里出活靠的不是单个算法多炫而是整条链路是不是稳。算法、仿真、SLM校准、光路调节任何一个环节掉链子重建质量都拉胯。所以如果你也被相位片折腾到头秃别急着换高级算法先把基础链路一条条走顺。等你能稳定地重复出干净的重建图案再回头调算法优化那才对得起自己花的时间。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询