
简介本资源是《现代信息光学与MATLAB》中英双语合订版教材PDF系统讲授傅里叶光学、光学图像处理、数字全息及计算机生成全息等核心内容特别强化非相干光学系统建模与前沿数字全息技术实现面向工程与应用物理专业高年级本科生、研究生及光学信息处理领域研究人员助力理论理解与MATLAB仿真能力同步提升。资源为1个24.87MB的PDF文件完整涵盖全书章节、公式推导、MATLAB代码示例、课后习题及双语作者简介结构清晰、步骤详尽无须额外安装或解压其他依赖。目前已有96人学习下载读者可直接获取权威教材原文、配套算法实现逻辑、光学现象可视化方法及中英文术语对照体系尤其适合开展数字全息实验设计、光学图像处理课程设计或科研建模参考。1. 为什么光学实验不再依赖暗室和激光台用 MATLAB 把傅里叶变换、衍射仿真、全息图生成全搬到笔记本上跑通你有没有试过在实验室调一上午光路就为了验证一个简单的夫琅禾费衍射公式激光器温漂、透镜轴向偏移、CCD噪声干扰——这些物理世界的“玄学变量”常让理论推导和实测结果差出两个数量级。而《现代信息光学与MATLAB》这个标题背后不是教你怎么写 MATLAB 语法而是提供一套可复现、可调试、可量化验证的光学建模工作流把光波传播抽象为复数矩阵运算把空间滤波变成二维卷积核设计把全息图编码转化为相位迭代优化。它适合三类人高校光学/光电专业学生替代部分昂贵实验课、工业界成像算法工程师快速验证光学预处理方案、跨领域研究者如用数字全息做微流控粒子追踪。核心价值在于——所有结果都带明确物理量纲单位是 mm、μm、nm、rad所有参数可调、所有中间态可可视化没有黑匣子。这不是“MATLAB 光学插件包”而是用基础函数fft2、ifft2、fspecial、imfilter搭出来的、经得起同行复现的光学计算栈。2. 从标量衍射理论出发为什么必须用复振幅建模而不是直接处理灰度图光学信息处理的本质是光场在空间中的线性传播与非线性调制。若只把图像当灰度矩阵处理会彻底丢失相位信息——而这恰恰是干涉、全息、相衬成像的物理基础。MATLAB 的强项正在于对复数矩阵的原生支持double类型天然承载real 1i*imagfft2默认输出复频谱imshow(abs(U))和imshow(angle(U))可分通道查看振幅与相位。下面以最典型的菲涅尔衍射为例说明如何构建符合物理意义的传播模型。2.1 菲涅尔衍射的离散化实现绕不开的波长、采样间隔与传播距离三重约束菲涅尔近似下的衍射积分可离散化为$$ U(x,y,z) \frac{e^{ikz}}{i\lambda z} e^{i\frac{k}{2z}(x^2y^2)} \iint U_0(\xi,\eta) e^{i\frac{k}{2z}[(x-\xi)^2(y-\eta)^2]} d\xi d\eta $$在 MATLAB 中我们不直接数值积分而是利用卷积定理将其转为频域乘法。关键步骤如下function Uz fresnel_propagate(U0, lambda, dx, dy, z, N) % U0: 输入复振幅矩阵 (N x N) % lambda: 波长 (单位同dx,dy如 um) % dx, dy: 物平面采样间隔 (um) % z: 传播距离 (um) % N: 矩阵尺寸 k 2*pi/lambda; % 计算频域传递函数 H(u,v) du 1/(N*dx); dv 1/(N*dy); % 频域采样间隔 [u, v] meshgrid((-N/2:N/2-1)*du, (-N/2:N/2-1)*dv); H exp(1i*k*z) .* exp(-1i*pi*lambda*z*(u.^2 v.^2)); % 注意此处已含相位因子 % 物平面补零至2N保证无混叠 U0_padded padarray(U0, [N N], post); U0_fft fftshift(fft2(fftshift(U0_padded))); % 频域相乘 逆变换 Uz_padded ifftshift(ifft2(ifftshift(U0_fft .* H))); Uz Uz_padded(N1:2*N, N1:2*N); % 截取中心N×N区域 end逻辑说明该函数严格遵循标量衍射理论中菲涅尔近似的数学形式。H是频域传递函数其指数项中的-pi*lambda*z*(u²v²)来源于对原始积分式中二次相位因子的傅里叶变换结果。注意fftshift的两次使用——这是 MATLABfft2默认将零频置于左上角而物理频谱需零频居中必须手动搬移。参数说明dx,dy决定空间带宽若物平面最小特征尺寸为 5 μm则dx必须 ≤ 2.5 μm满足奈奎斯特采样z不能过小当z (N*dx)²/(2*lambda)时菲涅尔近似失效应改用更精确的角谱法N建议为 2 的整数次幂如 512、1024避免 FFT 效率损失。2.2 夫琅禾费衍射菲涅尔的极限特例也是最常用的频谱分析工具当传播距离足够大z (Δx)²/λ其中Δx为孔径尺寸菲涅尔相位因子中的一次项主导二次项可忽略此时衍射图即为输入光场的傅里叶变换模平方。这正是光学信息处理中“4f 系统”的理论基础。function Ufar farfield_diffraction(U0, lambda, dx, dy, f) % U0: 输入复振幅 (N x N) % f: 等效傅里叶变换透镜焦距 (um)用于缩放频谱尺寸 % 输出 Ufar 为夫琅禾费衍射复振幅未取模 N size(U0,1); k 2*pi/lambda; % 空间频率坐标 fx (-N/2:N/2-1)/(N*dx); fy (-N/2:N/2-1)/(N*dy); [FX, FY] meshgrid(fx, fy); % 相位因子exp(i*k*f) * exp(-i*pi*lambda*f*(FX.^2FY.^2)) 在远场可忽略二次项 % 实际只需做 FFT 并加全局相位 Ufar fftshift(fft2(fftshift(U0))); % 缩放使频谱中心对应零频单位为 mm⁻¹ → 乘 f 得到像面坐标 (mm) scale_factor f * lambda; % 单位mm因 fx 单位为 mm⁻¹ Ufar Ufar * scale_factor; % 保持能量守恒的归一化可选 end关键点此函数输出的是复振幅频谱而非强度。abs(Ufar).^2才是探测器记录的夫琅禾费衍射图样。很多初学者误将fft2结果直接imshow看到一片黑——因为默认imshow对复数取abs但未归一化动态范围极大。正确做法是imshow(mat2gray(abs(Ufar).^2))或手动设定clim。3. 光学系统建模实战4f 滤波、阿贝成像原理与空间频率响应可视化光学信息处理的核心思想是把图像看作不同空间频率成分的叠加再通过“滤波器”如光阑、掩模选择性地通过或阻挡某些频率。MATLAB 提供了完整的信号处理链路从空域输入 → 频域分解 → 滤波操作 → 空域重建。本节以经典 4f 系统为例完整走通这一闭环。3.1 构建 4f 系统用两个傅里叶变换和一个频域掩模串联一个标准 4f 系统由四部分组成输入面 → 第一透镜前焦面频谱面→ 频谱面放置滤波器 → 第二透镜后焦面输出面。在 MATLAB 中这等价于对输入U_in做 FFT → 得到频谱U_f将U_f与滤波器H_filter逐点相乘 →U_f_filtered对U_f_filtered做 IFFT → 得到输出U_out% 示例低通滤波圆形光阑 N 512; U_in imread(letter_A.png); % 读入二值图像 U_in im2double(U_in); % 归一化为 0~1 U_in U_in - 0.5; % 转为 -0.5 ~ 0.5模拟透射率调制0全吸收1全透过 U_in complex(U_in, zeros(size(U_in))); % 初始化为复振幅相位为0 % 步骤1前焦面频谱夫琅禾费衍射 U_f farfield_diffraction(U_in, 0.6328, 10, 10, 1000); % lambda632.8nm, dxdy10um, f1000um % 步骤2设计低通滤波器半径 R 对应截止频率 fc R/(N*dx) R 30; % 频谱面像素半径 [H_filter, fx, fy] create_circular_filter(N, R); U_f_filtered U_f .* H_filter; % 步骤3逆傅里叶变换重建输出 U_out ifftshift(ifft2(ifftshift(U_f_filtered))); U_out real(U_out); % 输出为实数强度分布忽略相位 % 可视化 figure; subplot(1,3,1); imshow(U_in,[]); title(Input Object); subplot(1,3,2); imshow(mat2gray(abs(U_f).^2),[]); title(Fourier Spectrum); subplot(1,3,3); imshow(mat2gray(U_out),[]); title(Filtered Output);function [H, fx, fy] create_circular_filter(N, R) % 生成 N×N 圆形低通滤波器半径 R像素 fx (-N/2:N/2-1)/N; fy (-N/2:N/2-1)/N; [FX, FY] meshgrid(fx, fy); H sqrt(FX.^2 FY.^2) R/N; % 归一化半径保证圆心在中心 end参数说明R是滤波器在频谱面上的像素半径其物理截止频率为fc R / (N * dx)单位μm⁻¹。例如N512,dx10 μm,R30→fc ≈ 0.00586 μm⁻¹ 5.86 mm⁻¹即能分辨最小线宽约1/(2*fc) ≈ 0.085 mm。这个换算关系是连接代码参数与光学性能指标的关键桥梁。3.2 阿贝成像原理验证为什么显微镜分辨率受限于物镜 NA阿贝指出物体只有被物镜收集的衍射级才能参与成像。因此提高分辨率 收集更高阶衍射斑。我们可用上述 4f 框架定量验证不同“数值孔径”NA对应的截止频率。滤波器半径 R对应 NA近似理论最小可分辨线宽 δ (μm)观察现象10~0.1~3.2字母边缘严重模糊细节丢失30~0.3~1.1A 的横杠可见但内部纹理仍糊80~0.8~0.4横杠边缘锐利内部栅格隐约可辨提示NA 与频谱面半径的关系为R ≈ NA * N * dx / lambda。代入lambda0.6328 μm,dx10 μm,N512可得R≈80对应NA≈0.8。这正是高端显微物镜的典型值。4. 数字全息图生成与再现从干涉记录到三维重构的端到端流程全息术是信息光学皇冠上的明珠——它不仅记录光强更记录光波的全部复振幅信息。传统光学全息需稳定干涉环境而数字全息Digital Holography将参考光与物光的干涉图样用 CCD 记录再用 MATLAB 数值再现。本节聚焦离轴数字全息最易实现、抗噪性强完成从合成干涉图到三维层析的全流程。4.1 合成干涉图物光 参考光 → 强度叠加 ≠ 简单相加干涉图强度为$$ I(x,y) |U_o(x,y)|^2 |U_r(x,y)|^2 2\Re{U_o(x,y)U_r^*(x,y)} $$其中U_o是物光复振幅含三维形貌信息U_r是倾斜平面波参考光提供载频分离孪生像。关键在第三项——它携带物光全部信息且被参考光的载频调制到高频区。function I_holo generate_offaxis_hologram(U_obj, lambda, dx, dy, alpha, beta, N) % U_obj: 物光复振幅 (N x N)可由高度图生成 % alpha, beta: 参考光波矢方向余弦弧度决定载频位置 % 返回干涉图 I_holo (N x N) k 2*pi/lambda; % 生成倾斜参考光U_r exp(i*k*(alpha*x beta*y)) [x, y] meshgrid((-N/2:N/2-1)*dx, (-N/2:N/2-1)*dy); U_ref exp(1i*k*(alpha*x beta*y)); % 干涉图 |Uo|² |Ur|² 2*Re(Uo*Ur*) I_holo abs(U_obj).^2 abs(U_ref).^2 2*real(U_obj .* conj(U_ref)); end逻辑说明U_ref的构造是核心。alpha和beta控制参考光入射角从而在频谱中产生一个远离零频的载频点。典型取值alpha 0.01,beta 0沿 x 方向倾斜 0.57°此时载频位于(u,v) ≈ (alpha/lambda, 0) ≈ (0.0158, 0) mm⁻¹在 512×512 频谱中约在第 120 行附近与零频充分分离。4.2 全息图再现频谱滤波 逆傅里叶变换 三维形貌重建再现过程本质是对干涉图I_holo做 FFT → 在频谱中选取包含物光信息的载频分量滤除零频和共轭分量→ IFFT → 得到复振幅再现波前 → 取angle()得相位 → 转换为高度。function [height_map, U_recon] reconstruct_hologram(I_holo, lambda, dx, dy, z, filter_radius) % I_holo: 干涉图 % z: 再现距离对应虚拟观察距离 % filter_radius: 频谱滤波器半径像素 N size(I_holo,1); % 步骤1干涉图频谱 I_fft fftshift(fft2(fftshift(I_holo))); % 步骤2设计带通滤波器中心在载频位置半径 filter_radius % 假设载频在 (u0,v0) (120, 256) —— 需根据实际 alpha/beta 计算 u0 120; v0 256; [U, V] meshgrid(1:N, 1:N); H_filter ((U-v0).^2 (V-u0).^2) filter_radius^2; % 步骤3滤波 逆变换 I_filtered I_fft .* H_filter; U_recon ifftshift(ifft2(ifftshift(I_filtered))); % 步骤4相位解包裹 高度转换 phase angle(U_recon); phase_unwrapped unwrap(phase, [], 1); % 沿行解包裹 height_map phase_unwrapped * lambda / (2*pi); % 单位μm end参数说明filter_radius通常取 10~20 像素。太小则物光信息截断太大则混入噪声和共轭像。z不影响相位解算因离轴全息再现为菲涅尔传播此处简化为直接取相位但若要做深度扫描需对不同z值重复fresnel_propagate。5. 避坑指南那些让光学仿真实验集体翻车的 4 个硬核陷阱光学仿真是个“差之毫厘失之千里”的领域。以下是我带过多个模拟项目 X 时学生踩得最多、debug 时间最长的 4 类问题。每一条都附带真实报错现象、物理根源和可立即执行的检查清单。5.1 现象衍射图样完全对称但与理论预测的方位相反如竖条纹变横条纹原因fft2和ifft2的默认零频位置在左上角而物理频谱要求零频在中心。未用fftshift搬移导致相位因子符号错误进而使空间坐标系镜像翻转。解决强制在所有 FFT/IFFT 前后加fftshift/ifftshift。检查代码中fft2出现次数确保每次都有对应fftshift用meshgrid生成的x,y坐标也需确认是否以(0,0)为中心。自查命令max(abs(fftshift(fft2(fftshift(ones(8,8)))) - ones(8,8)))应返回接近 0若为64说明fftshift缺失。5.2 现象全息再现高度图出现密集条纹状伪影且随z变化剧烈抖动原因相位解包裹unwrap失败。当物面高度变化超过λ/2如 316 nm相邻像素相位跳变 πunwrap无法识别真实相位连续性强行“接续”导致条纹。解决改用二维相位解包裹算法如 Goldstein 算法或先对相位图做高斯平滑imgaussfilt再unwrap。更可靠的是——用多波长或多步相移法但仿真中可先降低物面斜率减小alpha/beta测试。自查命令max(abs(diff(angle(U_recon),1,1)))若 3.0说明存在大梯度unwrap必然失败。5.3 现象4f 系统输出一片全黑或仅中心一个亮点原因输入U_in未转为复数类型或U_in值域错误。imread读入uint8图像im2double后为[0,1]但光学透射率模型要求0全吸收对应复振幅01全透过对应10i。若直接complex(U_in)则U_in0时振幅为 0但U_in1时振幅为 1看似合理——然而干涉项2*Re(Uo*Ur*)要求Uo有合理相位参考。常见错误是U_in全为实数且无背景光导致干涉项被零频淹没。解决统一初始化U_in complex(im2double(I_obj), zeros(size(I_obj)))并确保I_obj是二值图0/1或用U_in 0.5 0.5*complex(im2double(I_obj), zeros(...))加直流偏置。自查命令min(abs(U_in(:)))和max(abs(U_in(:)))应分别接近 0 和 1若全为 0 或全为 1输入有误。5.4 现象菲涅尔传播后图像严重畸变出现环状伪影且随z增大而加剧原因采样定理 violated。当传播距离z过大频谱收缩高频成分被fft2的有限带宽截断混叠。物理上这相当于物平面采样太粗无法分辨传播后展宽的波前。解决增大N补零或减小dx提高物面采样率。经验公式z_max ≈ (N*dx)^2 / (2*lambda)。例如N512,dx10 μm,lambda0.6328 μm→z_max ≈ 20.5 mm。若需仿真z50 mm则必须N≥1200或dx≤6.5 μm。自查命令计算z_actual / z_max若 0.8必须升级采样。6. 进阶技巧用 GPU 加速百倍衍射仿真以及如何把 MATLAB 模型部署为 Python 接口当你的项目从单张图扩展到视频序列如动态全息显示、或需要遍历数百组参数如优化滤波器形状纯 CPU 的fft2会成为瓶颈。MATLAB 自 R2019a 起原生支持 GPU 数组而无需改写核心算法——只需将输入数据gpuArray化后续函数自动调用 CUDA。6.1 GPU 加速三行代码提速 80~120 倍% 原始 CPU 版本耗时 ~1.2s on i7-10875H tic; Uz_cpu fresnel_propagate(U0, 0.6328, 10, 10, 10000, 1024); toc; % Elapsed time is 1.234567 seconds. % GPU 版本耗时 ~0.015s on RTX 3060 U0_gpu gpuArray(U0); % 数据搬入 GPU 显存 Uz_gpu fresnel_propagate(U0_gpu, 0.6328, 10, 10, 10000, 1024); % 函数内所有计算在 GPU Uz_cpu_from_gpu gather(Uz_gpu); % 搬回 CPU 内存 toc; % Elapsed time is 0.014923 seconds.关键点fresnel_propagate函数本身无需修改MATLAB 会自动将fft2、.*、exp等内置函数映射到 GPU。唯一要求是输入为gpuArray且所有中间变量如H,U0_fft自动继承 GPU 属性。内存瓶颈在于显存容量——1024×1024 复数矩阵占约 16 MBRTX 30606GB可同时处理 300 个。6.2 MATLAB 模型转 Python 接口用 MATLAB Compiler SDK 生成.so库工业界常用 Python 做前端交互与数据处理但核心光学算法仍用 MATLAB 开发因其信号处理生态成熟。MATLAB Compiler SDK 可将函数编译为 C/C 共享库供 Python 调用。步骤概要将fresnel_propagate.m封装为类OpticalPropagator添加compile方法运行compiler.build.cppSharedLibrary(OpticalPropagator, OpticalPropagator.m)生成libOpticalPropagator.so及头文件Python 中用ctypes加载并传参import ctypes import numpy as np lib ctypes.CDLL(./libOpticalPropagator.so) lib.fresnel_propagate.argtypes [ np.ctypeslib.ndpointer(dtypenp.complex128, flagsC_CONTIGUOUS), ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_int ] lib.fresnel_propagate.restype None U0 np.random.rand(1024,1024).astype(np.complex128) Uz np.zeros_like(U0) lib.fresnel_propagate(U0, 0.6328, 10.0, 10.0, 10000.0, 1024)血泪经验MATLAB 编译时务必用coder.typeof显式声明输入类型如coder.typeof(complex(0), [1024 1024])否则 Python 传入的ndarray可能被解释为double而非complex128导致结果全零。这是我在某公司部署全息渲染引擎时花两天才定位的坑。最后说句实在话我坚持用 MATLAB 做光学仿真并非守旧而是它把fft2、ifft2、fspecial这些底层算子封装得足够干净让你专注物理建模而不是跟 FFTW 的 plan 创建、内存对齐、线程绑定死磕。当你在深夜调通一个衍射仿真看到屏幕上清晰浮现的艾里斑那种确定性带来的踏实感是任何框架文档都给不了的。希望帮到你。本文还有配套的精品资源点击获取