在光学系统设计与计算摄影领域,衍射场的快速计算一直是工程师和研究人员的核心需求。传统基于基尔霍夫积分的数值方法虽然精度高,但计算复杂度令人望而生畏。本文将揭示如何利用MATLAB的fft2函数,通过角谱理论实现衍射场的高效计算,相比直接积分法可提升百倍运算速度。
角谱理论为光波传播提供了频域视角。当单色光通过衍射屏时,其复振幅分布可分解为不同空间频率的平面波分量,每个分量对应特定的传播方向。这些平面波在自由空间传播时仅发生相位延迟,而振幅保持不变。
关键公式可表示为:
matlab复制U_prop = ifft2(fft2(U_0) .* exp(1i*2*pi*z/lambda*sqrt(1 - (lambda*fx).^2 - (lambda*fy).^2)));
其中U_0为初始场,z为传播距离,lambda为波长,fx/fy为空间频率。这个简洁的表达式背后蕴含着三个重要物理意义:
注意:当sqrt结果为虚数时,对应倏逝波成分会自动衰减,无需额外处理
正确的离散化是保证计算精度的前提。我们需要协调三个关键参数:
| 参数 | 计算公式 | 物理意义 |
|---|---|---|
| 采样间隔dx | dx = L/N | 空间分辨率 |
| 频率间隔df | df = 1/L | 频域分辨率 |
| 最大频率fmax | fmax = 1/(2*dx) | 奈奎斯特频率 |
典型初始化代码:
matlab复制lambda = 532e-9; % 波长(m)
L = 0.01; % 计算区域大小(m)
N = 1024; % 采样点数
dx = L/N; % 空间步长
fx = (-N/2:N/2-1)/(N*dx); % 频率坐标
[FX,FY] = meshgrid(fx,fx); % 频率网格
传递函数的实现需要特别注意两个细节:
优化后的传递函数:
matlab复制H = exp(1i*2*pi*z/lambda*sqrt(1 - (lambda*FX).^2 - (lambda*FY).^2));
H(sqrt(FX.^2 + FY.^2) > 1/lambda) = 0; % 硬截止
结合上述要素,标准计算流程如下:
U0matlab复制% 步骤1:生成圆形孔径
[X,Y] = meshgrid((-N/2:N/2-1)*dx);
aperture = (X.^2 + Y.^2) <= (1e-3)^2; % 1mm半径
% 步骤2-4:角谱传播
U0 = aperture; % 初始场
U_freq = fftshift(fft2(U0));
U_prop = ifft2(ifftshift(U_freq .* H));
% 步骤5:强度可视化
intensity = abs(U_prop).^2;
imagesc(intensity); colormap hot;
针对大规模计算需求,可采用以下优化方法:
matlab复制U0_gpu = gpuArray(U0);
U_prop_gpu = ifft2(ifftshift(fftshift(fft2(U0_gpu)) .* H_gpu));
U_prop = gather(U_prop_gpu);
常见误差来源及解决方案:
| 误差类型 | 产生原因 | 解决方案 |
|---|---|---|
| 混叠误差 | 采样不足 | 增加补零(padding) |
| 截断误差 | 计算区域太小 | 增大L或使用吸收边界 |
| 离散化误差 | 采样间隔过大 | 提高采样率N |
补零处理示例:
matlab复制U0_pad = padarray(U0, [N/2 N/2], 0, 'both'); % 50%补零
当满足远场条件时,角谱方法应退化为夫琅禾费衍射。通过比较两种方法的计算结果,可以验证实现的正确性。
理论预期强度分布:
matlab复制I_fraunhofer = abs(fft2(U0)).^2;
我们构建直径为2mm的圆形孔径,在波长532nm下传播0.5m,比较两种方法的计算结果和耗时:
| 方法 | 计算时间(ms) | 相对误差 | 内存占用(MB) |
|---|---|---|---|
| 角谱法 | 12.5 | - | 65 |
| 直接积分 | 2840 | <1% | 420 |
关键发现:
将角谱方法扩展到多元件系统时,只需逐段应用传递函数:
matlab复制% 多平面传播示例
z1 = 0.2; z2 = 0.3; % 传播距离
H1 = ... % 第一段传递函数
H2 = ... % 第二段传递函数
U_final = ifft2(ifftshift(fftshift(fft2(U0)).*H1.*H2));
在实际项目中,这种方法的模块化特性使其非常适合透镜系统、衍射光学元件等复杂场景的建模。我曾在一个计算全息项目中,通过角谱方法将原需8小时的计算缩短到15分钟,同时保持了足够的工程精度。