尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MATLAB数字全息仿真:从干涉图生成到三维再现的完整实践
简介这份数字全息仿真实验资料面向光学信息处理、计算全息方向的学习者与研究人员以MATLAB为工具帮助读者从零理解并复现数字全息图的记录与再现流程。压缩包共2个文件包含1个bmp位图与1个m脚本整体约3.42MB其中位图作为原始全息图数据输入脚本则承担读取图像、傅里叶变换、空域滤波与逆变换再现的核心计算。内容围绕全息实验原理、MATLAB编程、零级像消除、波前记录与再现等关键环节展开读者可借此掌握将光强分布转化为复数场、用高斯滤波去除零级干扰、再经模拟衍射重现物体三维信息的方法。已有2430人学习下载适合希望把光学理论与数值仿真结合、为计算全息与光学成像进阶打基础的读者参考实践。1. 数字全息仿真实验从一张干涉图到三维再现MATLAB 到底能跑多远很多人第一次接触数字全息仿真实验是被一张“看起来像水波纹”的干涉图吸引进来的。它不像普通照片那样直观却能在 MATLAB 里经过几步变换把物体的深度信息重新“算”出来。这就是数字全息仿真的核心用计算机模拟光的干涉与衍射生成全息图再做全息再现最终得到带景深的三维像。它适合光学、图像处理、计算成像方向的学生和工程师也适合想用 MATLAB 验证衍射算法、做全息存储或粒子场测量的从业者。难点不在写代码而在把采样、衍射距离、参考光角度这几个参数调对否则再现出来只有噪声。下面按“生成—再现—避坑—进阶”的顺序把这条链路拆开讲。2. 全息图怎么在 MATLAB 里生成从物光与参考光到干涉条纹数字全息仿真的第一步是模拟物光和参考光在记录面上的干涉。物光携带物体信息参考光通常是平面波或球面波两者叠加后形成干涉条纹也就是全息图。MATLAB 的优势在于矩阵运算天然适合描述二维光场但前提是你得把物理量映射成复数矩阵。2.1 物光场的构造为什么用复数矩阵而不是灰度图物光场在数学上是一个复振幅分布包含振幅和相位。振幅决定亮度相位决定波前形状。如果只用灰度图表示物体就丢掉了相位再现时无法恢复深度。常见做法是给物体一个随机相位或螺旋相位模拟漫反射表面。% 参数设置 N 1024; % 采样点数 lambda 532e-9; % 波长绿光 k 2*pi/lambda; % 波数 pixel_size 5e-6; % 像素尺寸 L N * pixel_size; % 物理尺寸 % 构造物体振幅一个圆形孔径 [x, y] meshgrid(linspace(-L/2, L/2, N)); r sqrt(x.^2 y.^2); amplitude double(r 1e-3); % 半径1mm的圆 % 加随机相位模拟粗糙表面 phase 2*pi*rand(N, N); object_field amplitude .* exp(1i * phase);这段代码里amplitude是物体的透射率分布phase是随机相位。object_field就是物光在物体平面的复振幅。参数lambda和pixel_size决定了后续衍射计算的采样范围不能随意改否则会出现混叠。2.2 参考光的选择平面波还是球面波角度怎么定参考光的作用是与物光干涉把相位信息编码到强度条纹中。平面波参考光实现简单球面波参考光可以引入载频便于后续滤波。参考光的角度决定了干涉条纹的空间频率角度太大条纹太密采样跟不上角度太小物光和参考光分不开再现时会出现孪生像。% 平面波参考光倾斜角 theta theta 1.5 * pi/180; % 1.5度 reference exp(1i * k * x * sin(theta)); % 干涉图强度 hologram abs(object_field reference).^2; hologram hologram / max(hologram(:)); % 归一化 imshow(hologram, []);theta一般取 1° 到 3°对应条纹间距要大于 2 个像素。如果条纹间距接近像素尺寸就会出现混叠再现像会糊掉。这一步是很多新手翻车的地方他们直接照搬文献里的角度却忽略了自己的像素尺寸和波长。2.3 衍射传播从物体平面到记录面的菲涅耳近似物光从物体平面传播到记录面需要用衍射公式计算。菲涅耳衍射是常用近似适合中等距离。MATLAB 里可以用一次 FFT 实现但要注意补零和坐标缩放。% 菲涅耳衍射传播距离 d d 0.2; % 20 cm % 频域坐标 fx linspace(-1/(2*pixel_size), 1/(2*pixel_size), N); [FX, FY] meshgrid(fx, fx); % 菲涅耳传递函数 H exp(1i * k * d) * exp(-1i * pi * lambda * d * (FX.^2 FY.^2)); % 物光传播到记录面 object_at_rec ifft2(fft2(object_field) .* H);这里H是菲涅耳传递函数d是传播距离。fft2和ifft2完成频域滤波。注意d不能太大否则菲涅耳近似失效需要用角谱法。角谱法更精确但计算量稍大后面进阶部分会提。3. 全息再现用 MATLAB 把干涉图还原成三维像生成全息图只是前半程真正让数字全息仿真实验有价值的是再现。再现的本质是用参考光照射全息图再经过反向衍射传播得到物体的像。MATLAB 里可以复用前面的衍射函数但要注意再现距离和滤波。3.1 再现距离的确定为什么不能直接用记录距离理论上再现距离等于记录距离但实际中由于参考光角度和采样限制再现距离需要微调。常见做法是扫描一系列距离用清晰度评价函数找最佳值。评价函数可以用梯度幅值或方差。% 再现用参考光共轭照射全息图 recon_field hologram .* conj(reference); % 反向传播距离 d_recon d_recon -d; % 先取负值 H_recon exp(1i * k * d_recon) * exp(-1i * pi * lambda * d_recon * (FX.^2 FY.^2)); recon_image ifft2(fft2(recon_field) .* H_recon); % 取强度 recon_intensity abs(recon_image).^2; imshow(recon_intensity, []);d_recon取负值表示反向传播。如果再现像模糊可以在这个值附近扫描比如d_recon -d deltadelta从 -5mm 到 5mm步长 0.5mm看哪张最清晰。3.2 孪生像与零级像怎么在频域里滤掉全息再现时除了真实的像还会出现孪生像和零级像。孪生像是共轭像零级像是参考光的直流分量。它们会重叠在再现像上影响观察。解决方法是在频域滤波把物光频谱和参考光频谱分开。% 频域滤波设计一个带通滤波器 spectrum fftshift(fft2(hologram)); % 假设载频在 fx0 处 fx0 sin(theta)/lambda; % 找到载频对应的索引 [~, idx] min(abs(fx - fx0)); % 构造矩形窗 mask zeros(N, N); mask(idx-50:idx50, :) 1; % 只保留一个边带 filtered_spectrum spectrum .* mask; filtered_hologram ifft2(ifftshift(filtered_spectrum));mask的宽度需要根据条纹频率和物体带宽调整。太窄会丢失细节太宽会引入噪声。一般取 50 到 100 像素具体看采样率。3.3 相位解包裹从 wrapped 相位到真实深度再现得到的相位是包裹在 [-π, π] 之间的需要解包裹才能得到连续的相位分布进而换算成深度。MATLAB 有unwrap函数但对二维数据效果一般常用质量引导法或最小二乘法。% 提取相位 phase_wrapped angle(recon_image); % 二维解包裹 phase_unwrapped unwrap(unwrap(phase_wrapped, [], 1), [], 2); % 换算成深度 depth phase_unwrapped * lambda / (4*pi); surf(depth);unwrap先按列再按行适合简单情况。如果噪声大建议先用中值滤波平滑相位再解包裹。深度换算公式里的4π是因为反射式光路往返一次。4. 避坑与排查数字全息仿真实验里最容易翻车的 5 个点这一章是我自己踩过的坑按现象、原因、解决写。每个坑都对应一个参数或操作改对了就能跑通。4.1 再现像全是噪声看不到物体轮廓现象运行完再现代码recon_intensity看起来像随机散斑没有圆形或物体形状。原因参考光角度太大条纹频率超过采样极限导致混叠或者衍射传播的传递函数符号写反。解决把theta降到 1° 以下检查H的指数符号菲涅耳传递函数里exp(-1i*pi*lambda*d*(...))的负号不能丢。4.2 再现像出现两个重叠的像一个清晰一个模糊现象再现图里能看到物体但旁边还有一个对称的模糊像。原因没有滤波孪生像和真实像同时再现。解决在频域加带通滤波器只保留一个边带。滤波器的中心频率由参考光角度决定宽度由物体带宽决定。4.3 相位解包裹后出现大面积跳变现象phase_unwrapped在物体边缘出现 2π 跳变深度图有断层。原因噪声导致解包裹算法误判或者物体相位梯度过大超过解包裹算法的处理能力。解决先对相位做中值滤波再解包裹或者改用质量引导法MATLAB 里可以用qualityguided思路自己实现。4.4 改变波长后全息图完全变样现象把lambda从 532nm 改成 633nm全息图条纹间距变化再现距离也需要重新调。原因衍射角与波长成正比波长变了载频和传播距离都变。解决每次改波长后重新计算fx0和最佳再现距离不要沿用旧参数。4.5 内存不足N2048 就跑不动现象N2048时MATLAB 报内存错误。原因复数矩阵占内存大FFT 需要额外空间。解决用single精度代替double或者分块处理。如果只是验证算法N1024足够。提示每次改参数后先看全息图的条纹是否清晰再看再现像是否聚焦。条纹是源头源头不对后面全白费。5. 进阶技巧用角谱法提升精度用 GPU 加速大矩阵菲涅耳衍射在近距离或大角度时误差明显角谱法Angular Spectrum Method更精确。它直接在频域计算传播传递函数是exp(1i*k*z*sqrt(1-(lambda*fx).^2-(lambda*fy).^2))。MATLAB 实现如下% 角谱法传播 z 0.2; H_as exp(1i * k * z * sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2)); % 消除倏逝波 H_as(lambda*FX.^2 lambda*FY.^2 1) 0; object_at_rec_as ifft2(fft2(object_field) .* H_as);H_as里的平方根项在lambda*FX超过 1 时变成虚数对应倏逝波需要置零。角谱法适合传播距离小于孔径尺寸的情况比如显微全息。如果N到 4096CPU 跑一次 FFT 要几秒可以用gpuArray加速object_field_gpu gpuArray(object_field); H_gpu gpuArray(H_as); result_gpu ifft2(fft2(object_field_gpu) .* H_gpu); result gather(result_gpu);前提是机器有支持的 GPU。没有的话用single精度也能省一半内存。另一个技巧是自动对焦。不用手动扫距离用梯度平方和作为评价函数找最大值对应的距离d_range -0.25:0.001:-0.15; sharpness zeros(size(d_range)); for i 1:length(d_range) H_temp exp(1i * k * d_range(i)) * exp(-1i * pi * lambda * d_range(i) * (FX.^2 FY.^2)); recon_temp ifft2(fft2(recon_field) .* H_temp); [gx, gy] gradient(abs(recon_temp).^2); sharpness(i) sum(gx(:).^2 gy(:).^2); end [~, idx] max(sharpness); best_d d_range(idx);这段代码扫描d_range计算每个距离的梯度平方和最大值就是最佳再现距离。d_range的范围根据记录距离上下浮动 20% 左右。我自己的习惯是每次做新的仿真先固定N1024、lambda532nm、pixel_size5e-6把参考光角度从 0.5° 试到 2°找到条纹最清晰的那个值再往下做。这样能省很多调试时间。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

智能体观测链路设计:从工具调用到模型输入的保真闭环

智能体观测链路设计:从工具调用到模型输入的保真闭环

1. 项目概述:这不是在搭积木,而是在重建感知神经“从工具调用到模型输入:把 Agent 的观测链路接起来”——这个标题乍看像一句技术黑话,但拆开来看,它直指当前智能体(Agent)开发中最常被忽略、却…

📅 2026/10/20 12:31:36
.NET GC新方向DATAS:五步准备与排查实践指南

.NET GC新方向DATAS:五步准备与排查实践指南

1. DATAS 是什么,以及它要解决的一堆破事最近 .NET 社区里 DATAS 这个词出现频率明显多了起来,很多人一上来就问“DATAS 是不是又一个新 GC 模式?要不要改配置?会不会有兼容性问题?”我先把结论放这里:DATA…

📅 2026/10/20 12:31:36
横评14款论文工具后,千笔如何成为自考论文写作的实用助手

横评14款论文工具后,千笔如何成为自考论文写作的实用助手

“横评后发现!自考论文神器 —— 千笔专业论文写作工具”,看到这个标题的老哥老姐们,估计第一反应跟我一样:又是个恰饭软文吧?我当时也是这么想的。但架不住自己带的一个自考学员连续三次论文被打回,选题换了两轮&…

📅 2026/10/20 12:31:36
MORE NEWS

更多资讯

📰

智能提示系统秒级扩容实战:从架构改造到启动即热

去年 Q4,我们团队接过一个让我印象很深的故障单。晚上八点整,某业务入口的流量在三十秒内翻了六倍,智能提示服务是最先扛不住的,候选词接口的平均耗时从 20ms 一路拉到 3.8 秒,紧接着数据库连接被打满,整条…

📰

微信支付API v3 PHP后端对接实战:签名验签、AES解密与完整支付流程实现

做小程序支付的后端对接,PHP 开发者大概率都会在微信支付 API v3 这一关卡上一段时间。官方给的 SDK 主要面向 Java、Go 这些服务端语言,PHP 生态里没有一套“官方盖章”的完整实现,网上流传的代码又版本各异,改起来常常一头雾水。…

📰

VideoLLM复现指南:token压缩、音频接入与时间感知

VideoLLM方向的新论文,读到现在是第三篇笔记了。前两篇我主要梳理了多模态主干的接法、指令数据的构造和基础评估这些地基问题,这一篇想换一条主线:不按模型结构排,也不照排行榜念,而是挑几个自己复现时真正觉得有得聊…

📰

ARMCC 5.06安装与AC5切换实战:解决老嵌入式工程编译难题

简介:ARM Compiler 5.06(960)是ARM推出的官方C编译器,专为基于ARM架构的嵌入式开发设计,与Keil MDK工具链无缝集成,面向嵌入式硬件工程师和物联网开发者,能够将C语言工程高效编译为可烧录的机器…

📰

基于DQN的无人机三维航迹规划:PyTorch实现与工程实践

最近一直在折腾无人机航迹规划,试过A*、RRT这些传统方法,也试过PID跟踪,但一到三维城市环境里就各种碰壁:地图一复杂,搜索效率掉得厉害;环境一变,路径就得从头算。后来把强化学习搬进来&#xf…

📰

Android Compose AI组件库实战:流式对话、多模态与生产落地指南

上个月我在重构一个智能问答类应用时,突然意识到Android Compose版本AI组件库的出现确实改变了传统接入大模型的方式。以前我们要接一个对话模型,得自己搭网络层、处理流式响应、管理UI状态,代码量很容易成倍膨胀。现在有了Compose版的AI组件…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬