基于卷积法的数字全息记录与再现模拟系统
项目简介
本项目是一个基于MATLAB环境开发的数字全息仿真系统。它利用标量衍射理论中的菲涅耳(Fresnel)近似,通过卷积运算方法(Convolution Method)实现了数字全息图的计算机生成(CGH)与数字数值再现的完整物理过程。
与基于单次FFT的菲涅耳变换算法(S-FFT)不同,本项目采用的卷积算法(基于角谱理论的菲涅耳传递函数形式)具有显著优势:它能够确保重建图像的像素分辨率(像元尺寸)与记录平面完全一致,不随衍射距离的变化而缩放,特别适用于需要精确尺寸匹配的近距和中距衍射模拟。
主要功能特性
- 全流程模拟:涵盖了虚拟物光场生成、自由空间衍射传播、全息干涉记录、CCD量化效应以及全息数值再现的闭环模拟。
- 物光场合成:支持生成具有复杂振幅分布(Modified Shepp-Logan幻影)和虚拟球面相位的复振幅物体。
- 离轴全息记录:模拟参考光与物光的离轴干涉,引入倾斜平面波作为参考光,通过载频将物光频谱与零级项分离。
- 高精度衍射计算:核心算法采用基于FFT/IFFT的卷积法,并引入了零补(Zero-padding)技术,有效消除了由离散傅里叶变换引起的圆周卷积混叠效应。
- 共轭再现:模拟利用共轭参考光照明全息图,消除离轴载频相位,恢复物体的原始光场分布。
- 可视化分析:提供从原始物体、全息图及其频谱,到最终再现振幅与相位的多维度可视化展示。
系统环境要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(用于生成Shepp-Logan幻影
phantom 函数)
使用方法
直接在MATLAB环境中运行主脚本(main.m)即可启动模拟。程序将自动执行所有计算步骤,并弹出三个图形窗口显示各阶段的模拟结果:
- 原始物体信息:显示合成物体的振幅和相位图。
- 数字全息图及频谱:显示模拟记录的离轴全息图(模拟CCD采集效果)及其对数频谱。
- 数值再现结果:显示经过数值衍射传播后重建的物体振幅和相位。
系统详细实现逻辑
本项目的主程序严格按照光学物理过程编写,主要分为以下五个阶段:
1. 系统参数配置
程序首先定义了模拟所需的物理常量和空间参数:
- 设定激光波长为 532nm(绿光)。
- 定义采样分辨率为 512x512 像素,像元尺寸为 10μm。
- 设定记录距离(物体到全息面)和再现距离均为 0.3m。
- 构建中心化的二维空间坐标网格。
2. 物光场构建 (Object Field Generation)
- 振幅:调用MATLAB内置的
phantom 函数生成 Modified Shepp-Logan 图像作为物体振幅,模拟具有丰富内部结构的物体。 - 相位:通过公式生成一个虚拟的球面相位因子(类似透镜效果),模拟物体表面的三维起伏或透射相位变化,构建出复振幅物光场 $U_{obj}$。
3. 全息记录模拟 (Recording)
- 物光传播:调用核心函数
fresnel_convolution_propagation,将初始物光场向前传播 $z_{record}$ 距离,计算到达全息平面的复振幅分布。 - 参考光生成:构建一个带有微小倾斜角(x和y方向约0.5度)的平面波作为参考光,引入空间载频以实现离轴全息。
- 干涉计算:依据干涉定律计算全息面光强分布 $I = |O + R|^2$。
- 量化模拟:将计算出的浮点型光强数据归一化,并转换为 8位无符号整数(uint8),模拟CCD/CMOS相机的数字化采样过程。
4. 全息再现模拟 (Reconstruction)
- 照明光场:生成参考光的复共轭波($R^*$)作为照明光,照射数字全息图。此操作的作用是消除记录时引入的倾斜相位因子(解调载频)。
- 直流滤波:通过简单的减去均值操作,削弱零级衍射光(直流项)对重建图像对比度的影响。
- 逆向/正向传播:将照明后的光场再次传入卷积传播函数,传播 $z_{recon}$ 距离,计算再现像平面的复振幅。
- 信息提取:从复数结果中提取模(振幅)和辐角(相位)作为最终重建结果。
5. 结果可视化
利用
imshow 和
imagesc 等函数,结合灰度与伪彩色(jet)映射,直观展示全息记录与再现的物理效果。特别是通过频谱图可以观察到离轴全息导致的频谱分离现象。
核心算法分析:菲涅耳卷积传播
代码中的 fresnel_convolution_propagation 函数是本项目的核心算子,其实现细节如下:
算法原理
基于线性系统理论,自由空间光传播可视为输入光场与自由空间脉冲响应函数 $H(f_x, f_y)$ 的卷积:
$$ U_{out} = mathcal{F}^{-1} { mathcal{F}{U_{in}} cdot H(f_x, f_y) } $$
其中,菲涅耳近似下的传递函数形式为:
$$ H = e^{jkz} cdot e^{-jpilambda z (f_x^2 + f_y^2)} $$
关键实现细节
- 零补预处理 (Zero-padding):
* 为了防止离散傅里叶变换(DFT)隐含的周期性导致
圆周卷积混叠,函数首先将输入矩阵的尺寸扩充为原来的2倍(从 $N times N$ 扩充为 $2N times 2N$)。
* 原始光场被放置在扩充矩阵的中心,周围填充零值。
- 频域坐标构建:
* 根据扩充后的网格尺寸计算对应的频率分辨率 ($df = 1/L_{pad}$),生成对应的频域坐标网格。
- 传递函数计算:
* 在频域直接生成菲涅耳传递函数 $H$。
- 频域滤波:
* 使用
fft2 将扩充后的光场变换到频域。
* 利用
fftshift 和
ifftshift 确保频谱的零频分量移动到矩阵中心,以便与中心化的传递函数 $H$ 正确对齐相乘。
* 执行点乘操作:$F_{out} = F_{U} cdot H$。
- 逆变换与裁剪:
* 使用
ifft2 将结果变换回空域。
* 截取扩充矩阵中心的 $N times N$ 区域作为最终输出,去除用于防止混叠的边缘部分。
此算法保证了输出全息图或再现像的像素物理尺寸($dx, dy$)与输入面完全一致,这是相比于单次FFT算法最大的优势。