资讯动态

离轴全息干涉模拟与1-FFT重构:从物面搭建到频谱滤波全流程解析

发布时间:2026/9/9 2:29:58 来源:尧图企业网站定制
简介一份专注于离轴全息干涉模拟与单次快速傅里叶变换重构的MATLAB实例资源面向光学工程、数字全息及信息处理领域的初学者和研究者也适合作为高校相关课程的配套实验。资源包内含两个可运行的m脚本、一个光场数据mat文件及一张全息图tif样例共4个文件总大小仅909KB结构紧凑便于直接运行和二次开发。已有1144人浏览学习具备广泛参考价值。通过该实例可系统掌握光源建模、离轴干涉计算、全息图生成、快速傅里叶变换、相位恢复及反变换重构等完整流程帮助深入理解离轴全息的记录与重建机制。无论是用于课程设计、教学演示还是作为复杂全息算法的起点这套代码都能提供直观、可复现的实验支撑并为进一步研究三维成像、生物医学光学等应用打下基础。 “重构”这个词在互联网语境里已经被用得很宽泛了代码重构、项目重构、架构重构似乎什么东西都可以叫重构。但在我常做的数字全息方向“重构”是一个有明确物理含义的步骤——它是把全息图里记录下来的物光波前“还原”出来的过程。这篇文章要聊的就是一个最小可跑的实例离轴全息干涉模拟及1-FFT重构。我会带你从物面搭建、参考光干涉、条纹记录一直走到频谱滤波和逆变换出图每一步都给出了可以复现的代码和需要注意的坑。适合刚接触数字全息的研究生或者想在项目里快速验证离轴记录参数的工程师。1. 先搞清楚“1-FFT重构”到底在重构什么1.1 全息记录的三个像是怎么来的数字全息的物理过程并不复杂一束物光和一束参考光在记录面上叠加探测器记录的是两者干涉后的强度分布I(x, y) |O(x, y) R(x, y)|² |O|² |R|² O·R* O*·R这四项里前两项分别是物光自相关和参考光强度频率成分都落在低频区域后两项才是关键——它们包含了物光复振幅O的完整信息振幅和相位都编码在干涉条纹里。所以从信息角度看全息图不缺东西缺的是怎么把O从这四堆混叠的信号里分离出来。如果参考光与物光完全同轴这四项在频域全部挤在一起无论你怎么滤波都只能同时拿到实像和孪生像这就是经典的同轴全息“孪生像”问题。而离轴全息的思路很朴素让参考光带上一个倾斜载频把正负一级像在频谱上推到远离零级的位置再用一个矩形窗截出来。1.2 载频给三项频谱分了频道设参考光是平面波 R exp(j·2π·f_R·x)f_R sinθ/λ 就是离轴角对应的空间频率。对全息图做傅里叶变换后三个项的频谱中心分别位于零级|O|² |R|²频谱中心在0带宽约为物谱带宽的2倍1级O*·R中心在 f_R带宽约等于物谱带宽-1级O·R*中心在 -f_R带宽约等于物谱带宽要想三项互不重叠需要满足 f_R ≥ 3BB是物光最高空间频率。这个条件对应到实验里就是离轴角不能太小否则一级像会被零级亮斑淹没。对应到模拟里也是一样——你在电脑里造全息图如果角度设得不够照样会看到三个频谱糊成一团。1.3 为什么叫“1-FFT”这个叫法很容易让人误以为只做一次FFT就能出图。严格说离轴全息的傅里叶重构法是对全息图做一次FFT得到分离频谱截取1级窗口再执行一次IFFT得到物光场的复振幅分布。两次变换合起来是整个流程的操作主线和基于衍射积分的逐点重建方法相比主要计算量集中在这两次变换上因此业界习惯简称为1-FFT重构。优点是速度快、实现简单、物理过程直观缺点是它本质是“频域窗选”如果物谱带宽很宽、或离轴角不满足分离条件重建质量会明显下降。2. 模拟搭建前必调的参数角度、距离、像素的换算关系2.1 关键参数速查模拟不能上来就写代码先确定参数。最常见的一组教学参数如下照着这组参数做频谱分离和采样约束都能满足。参数取值说明采样点数 N512×512太小频谱分辨率不够像元尺寸 Δ5 μm典型CCD/CMOS像素尺寸波长 λ632.8 nmHe-Ne激光教程经典波长记录距离 d0.2 m物面到记录面的距离离轴角 θ2°满足频谱分离条件这组参数不是随便拍的两个约束必须同时满足一是频谱分离条件。我特定一个简单物面最高空间频率大致对应20~30像素宽度的图案物谱半宽也就20像素左右。根据 f_R ≥ 3B 的规则2°离轴角对应的频谱偏移像素数约为offset N·Δ·sinθ / λ 512 × 5e-6 × sin(2°) / 632.8e-9 ≈ 141 像素这远超物谱半宽的3倍一级像安全落在零级和频谱边缘之间。如果角度只有0.5°offset约35像素很可能就压进零级亮斑里。二是采样条件。干涉条纹的空间频率不能超过探测器奈奎斯特频率即条纹周期不能小于2个像素。极限角度满足 sinθ_max λ / (2Δ)对上述参数就是约3.63°。所以2°是一个靠中间、有余量的值。超过3.5°再加大角度干涉条纹就开始欠采样频谱会被折叠到边缘反而坏事。2.2 物面设计加不加随机相位差很多物面直接用一个简单图形就行关键是别造一个理想得不像话的物体。真实物体表面是粗糙的光照上去会产生漫散射。模拟时我习惯在振幅图案上叠一层小幅随机相位随机相位幅度太小比如0.01π散斑效应不明显重构结果过于完美随机相位幅度太大比如π物频谱会展得很宽离轴条件就难满足了。推荐用0.1π~0.2π既能模拟真实的漫射物体又不至于让频谱宽度失控。振幅图案就用两个矩形拼成一个“Π”形重构后能不能看出这个形状就是判断算法是否成功的最直观依据。2.3 传播用角谱法三行代码比菲涅尔近似省心有的教程偷懒直接在记录面构造物光场干涉倒是能做但物理过程不完整后续想讨论离焦、传播距离对重构的影响就没有抓手。我建议用**角谱法ASM**把物面传播到记录面在频域乘一个传播因子H(fx, fy) exp( j·k·d·sqrt(1 - (λ·fx)² - (λ·fy)²) )角谱法的好处是只要采样条件满足传播距离内都是严格的不额外引入菲涅尔近似的误差。代码就三行何乐不为。2.4 完整的离轴全息模拟代码下面是模拟记录端的完整代码跑完会得到一张数字全息图 I 以及频谱图import numpy as np import matplotlib.pyplot as plt # 基本参数 N 512 # 采样点数 pixel 5e-6 # 像元尺寸单位m wl 632.8e-9 # 波长单位m d 0.20 # 物面到记录面距离单位m theta 2.0 # 离轴角单位度 theta_r np.deg2rad(theta) f_r np.sin(theta_r) / wl # 参考光空间频率 k 2 * np.pi / wl # 空间坐标 x (np.arange(N) - N // 2) * pixel XX, YY np.meshgrid(x, x) # 物面构建 # “Π”形振幅物体加0.15π随机相位模拟粗糙表面 obj_amp np.zeros((N, N)) obj_amp[170:350, 170:210] 1.0 obj_amp[170:350, 260:300] 1.0 obj_amp[170:220, 170:300] 1.0 obj_phase 0.15 * np.pi * np.random.rand(N, N) u0 obj_amp * np.exp(1j * obj_phase) # 角谱传播到记录面 fx np.fft.fftfreq(N, pixel) FX, FY np.meshgrid(fx, fx) fz2 np.sqrt(np.maximum(0, 1 - (wl * FX)**2 - (wl * FY)**2)) H np.exp(1j * k * d * fz2) U np.fft.ifft2(np.fft.fft2(u0) * H) # 离轴参考光 R np.exp(1j * 2 * np.pi * f_r * XX) # 干涉记录 I np.abs(U R)**2 # 可视化 S np.fft.fftshift(np.fft.fft2(I)) plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.imshow(I, cmapgray, vmin0, vmaxI.max()*0.8) plt.title(hologram) plt.subplot(1, 2, 2) plt.imshow(np.log10(np.abs(S) 1e-6), cmapgray) plt.title(spectrum) plt.show()跑完这段全息图是一团密集条纹肉眼看不出物体频谱图则是中心一个亮斑、两侧各一个亮斑。看到这种三个亮斑的频谱图说明离轴条件已经成立可以进入重构环节了。3. 1-FFT重构实现截窗、搬频、逆变换三步走3.1 频谱图上到底在看什么频谱图上中央亮斑是零级像包含物光自相关和参考光强度属于无用信息左右两个对称亮斑就是正负一级。我前面参数推导过2°离轴角对应141像素的偏移用代码验证一下offset int(round(f_r * N * pixel)) print(offset) # 141所以1级亮斑中心就在 (N/2 offset, N/2)也就是(397, 256)附近。实际因为物体图案有宽度一级像的频谱不是单点而是一片以该坐标为中心的弥散斑。这就是物频谱截它的矩形窗口大小就代表了你能保留多少物体细节。3.2 窗函数选择与代码实现核心重构代码如下矩形窗提取1级平移到频谱中心再IFFT# 1-FFT重构 S np.fft.fftshift(np.fft.fft2(I)) offset int(round(f_r * N * pixel)) center_x N // 2 offset center_y N // 2 half_w 45 # 窗半宽按物谱实际大小调整 filtered np.zeros_like(S) filtered[N//2 - half_w:N//2 half_w, N//2 - half_w:N//2 half_w] \ S[center_y - half_w:center_y half_w, center_x - half_w:center_x half_w] recon np.fft.ifft2(np.fft.ifftshift(filtered)) amp_recon np.abs(recon)这里最关键的一步是把截出来的频谱“搬回中心”。为什么要搬?因为全息图的一级项本身带有参考光载频不搬回去直接IFFT空间域出来的结果会残留高频条纹。搬回中心在数学上等价于在空间域乘上参考光的共轭相位因子也就是把载频“解调”掉从而得到干净的空间域物像。这个细节新手最容易漏漏了之后图像会叠加一层斜条纹还以为是噪声。3.3 振幅像和相位像的区别重构出来的recon是复数数组。取模amp_recon得到的就是物光场的振幅分布可以看到“Π”形图案。这是强度像也是数字全息里最常用的展示方式。但要注意一点如果你截取的是x方向的亮斑重构出来的是物光的共轭像O*取-x方向的亮斑才是物光本身。对振幅像来说二者等价因为|O*||O|但如果你后续要做定量相位测量相位符号会相反必须留意自己截的是哪个方向。这是很多初学者做了很久相位重构才发现数据反了的原因。另外由于物面本身叠了0.15π的随机相位振幅像上会看到一些散斑颗粒感这是正常现象。不是算法出错而是物面模型的粗糙度在重建结果中的自然体现。想要更平滑的重建像可以把随机相位幅度降低或设置随机种子来复现。4. 实测里逃不掉的三个坑混叠、振铃、量化4.1 离轴角太小频谱叠成一片怎么判断我建议你把theta改成0.5°再跑一遍看看会发生什么。频谱图上一级像和零级的边缘会不同程度地交叠。重构出来的图像就是中心被一块亮斑压住边缘能看到图案轮廓但对比度差到没法用。判断标准很简单看频谱图中一级亮斑和中央零级之间是否存在一条明显的“暗带”。只要有暗带就说明分离条件成立如果一级亮斑像是从零级亮斑边缘长出来的角度就不够。但也不能无限加大角度。前面算过极限角度约3.63°超过这个值后条纹欠采样一级像频谱会与另一侧的一级像或频谱边缘折叠。实际使用把这个范围放在1°到3°之间最合适。到了真实系统里如果相机噪声大推荐离轴角比理论最小值再留40%左右的余量因为噪声会让一级像边缘的弱频率成分更难分辨。4.2 矩形窗带来的振铃什么时候需要换平滑窗矩形窗最直接但代价是窗边缘的频谱被突然截断空间域会产生Gibbs振铃表现是重构图像边缘出现明暗交替的振荡条纹。物体细节越丰富、高频成分越强振铃越明显。图案尺寸小或者只关心低频形貌时矩形窗完全够用。如果想抑制振铃把矩形窗换成二维汉宁窗就行了from numpy import hanning, outer w hanning(2 * half_w) w2d outer(w, w) filtered[...] S[center_y-half_w:center_yhalf_w, center_x-half_w:center_xhalf_w] * w2d平滑窗以牺牲一定的频谱分辨率为代价换取旁瓣抑制。half_w不变时汉宁窗的主瓣比矩形窗宽表现为重建像边缘更柔和、细节略微软。我的经验是如果只是看形貌和存在性矩形窗即可如果要抠边缘细节或者后续做定量分析优先平滑窗同时把half_w略微加大来补偿主瓣展宽。4.3 模拟中加8bit量化提前暴露相机的动态范围问题实验相机输出的是量化后的整数灰度常见8bit或12bit。模拟时如果一直用float64做到底你会得到一个“过于干净”的结果。可以把干涉强度量化到8bit再重构感受一下动态范围的影响I_quant (I / I.max() * 255).astype(np.uint8) S_q np.fft.fftshift(np.fft.fft2(I_quant.astype(float)))量化之后零级亮斑的强度没怎么变但暗区的条纹对比度被压到了一个灰度级别以内重建像的散斑颗粒会更明显物体边缘轮廓会变淡。原因在于离轴载频把物光信息搬到了高频区域低比特量化对高频小幅起伏的记录精度远低于低频大幅度成分。模拟中加这一步能让你提前知道实验系统的动态范围是否够用而不是等拍完片子才发现重构结果发闷。5. 从模拟走向实验时的几个衔接心得仿真跑通之后真正搭光路拍全息图最大的感受是“模拟里没建模的噪声在实验里全都冒出来了”。首当其冲是参考光的不均匀性模拟里R是一个理想的单位振幅平面波实验里激光束是高斯型的参考光本身就有强度起伏这会让频谱上的零级亮斑扩宽分离条件变得更苛刻。处理办法是把参考光扩束后只取中心区域相对平坦的部分或者在重构时先在记录面做背景减除。另一个容易被忽略的是振动。离轴干涉对光程差极其敏感空气流动、桌面振动都会让条纹模糊。模拟里无论怎么调参数都不会出现这个问题但到了实验里一台光学隔振平台和足够长的稳定时间往往比算法优化更有效。如果你想把这套模拟更贴近真实实验我会建议按这个顺序做扩展先给记录强度加泊松噪声模拟光子噪声再考虑参考光高斯包络最后把探测器量子效率的不均匀性用一个空间缓变因子乘上去。每一步加进去之后用第3章的重构代码重新跑一遍看看一级像频谱还能不能干净分离。我在实际项目里的体会是模拟和实验的差距最常出现在“认为参考光是理想的”这个假设上。把模拟做得越接近真实的非理想参考光你从仿真里得到的参数结论就越能直接迁移到实验台上。这个方向可以持续深入也是数字全息从演示迈向工程应用时必须走通的一步。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价