基于MATLAB的圆孔菲涅尔衍射多维可视化仿真
项目简介
本项目是一个基于MATLAB开发的物理光学仿真系统,专注于模拟和展示单色平行光通过圆形孔径后的菲涅尔(近场)衍射现象。程序利用标量衍射理论,结合快速傅里叶变换(FFT)算法,能够精确计算并在观察屏上呈现光波的复振幅及二维/三维光强分布。该工具旨在通过多维度的可视化图表,帮助用户直观理解衍射光场的物理特性,适用于光学教学演示及实验前的数值模拟预研。
功能特性
- 高精度数值仿真:基于物理光学的标量衍射理论,采用频域传递函数法进行计算。
- 高效FFT算法:利用快速傅里叶变换处理大尺寸矩阵(1024x1024),确保计算速度与分辨率。
- 多维可视化展示:自动在一个窗口内生成四张关键图表,包括光阑原图、二维光斑、径向剖面和三维立体分布。
- 参数化设计:支持灵活调整波长、孔径半径、衍射距离和采样精度。
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 工具箱:本项目主要依赖MATLAB基础数值计算与绘图功能,无需安装额外的专用工具箱。
使用方法
- 确保MATLAB环境已准备就绪。
- 将主要脚本文件(main.m)放置于当前工作目录。
- 直接运行该脚本。
- 程序运行结束后,将自动弹出包含四个子图的仿真结果窗口,并在控制台输出当前的仿真参数信息。
核心算法与实现逻辑
本项目脚本完全基于包含在 main.m 中的逻辑进行构建,其核心处理流程如下:
1. 参数初始化与空间建模
程序首先定义了光学的物理参数和计算网格参数:
- 物理参数:设定红光波长(632.8 nm)、圆孔半径(0.5 mm)以及观察屏距离(0.5 m)。
- 空间网格:定义了一个边长为 8 mm 的物理平面,并将其离散化为 1024x1024 的采样网格。
- 坐标系构建:使用
meshgrid 生成二维空间直角坐标系 $(x, y)$。
2. 光阑透射函数生成
程序通过计算网格点到中心的距离 $r = sqrt{x^2 + y^2}$ 来构建输入场:
- 二值化处理:根据圆孔半径判定,孔内($r le text{radius}$)赋值为 1,孔外赋值为 0。这也代表了入射波为振幅为 1、相位为 0 的垂直入射平面波。
3. 基于传递函数的衍射计算
这是仿真的核心部分,采用了
频域传递函数法计算菲涅尔衍射:
- 频域转换:根据空间采样率生成对应的频率坐标 $(f_x, f_y)$。
- 构建传递函数:代码中定义了菲涅尔近似下的传递函数 $H(f_x, f_y)$。公式包含常数相位因子 $exp(jkz)$ 和二次相位因子 $exp(-jpilambda z(f_x^2 + f_y^2))$。
- FFT运算流程:
1. 对输入场 $U_0$ 进行二维快速傅里叶变换 (
fft2),并使用
fftshift 将低频分量移至频谱中心。
2. 在频域将输入频谱与传递函数 $H$ 相乘。
3. 对结果进行二维傅里叶逆变换 (
ifft2),得到观察屏上的复振幅分布 $U_z$。
- 光强计算:通过取复振幅模的平方 ($|U_z|^2$) 获得光强分布,并进行归一化处理以便于绘图。
4. 数据可视化模块
程序创建了一个大尺寸图形窗口,并划分为 2x2 的子图区域进行展示:
* 绘制孔径的透过率函数(二值图像)。
* 使用灰度(gray)色图,直观展示光阑的几何形状(白色透光,黑色不透光)。
* 绘制观察屏上的二维归一化光强图。
* 使用热力图(hot)配色,明亮区域代表光强高,清晰呈现菲涅尔衍射特有的同心圆环结构。
* 提取矩阵中心行的数据,绘制一位光强分布曲线。
* 横轴为位置(mm),纵轴为归一化光强,用于量化分析中心亮斑及旁瓣的强度变化。
* 利用
mesh 函数绘制光强的三维曲面。
*
降采样处理:为了保证三维绘图的流畅性和视觉效果,代码对数据进行了降采样(每4个点取1个)。
* 使用 Jet 色图和平滑着色(shading interp),并设置了 45 度俯视视角的观察角度。
技术细节说明
- 频谱中心化:在FFT和IFFT过程中,代码严格使用了
fftshift 和 ifftshift,确保零频分量位于矩阵中心,这对于正确使用解析表达式构建的传递函数至关重要。 - 物理单位换算:在绘图阶段,代码将内部计算用的“米”制单位统一转换为“毫米”,使坐标轴读数更符合常规实验习惯。
- 菲涅尔近似:代码中使用的传递函数形式基于菲涅尔近似(二次相位因子),适用于近轴及远场条件,相比完整的角谱理论计算速度更快且在近场条件下依然保持了极高的精度。