基于物理光学(波动光学)模型的 MATLAB 程序

该模型适用于 显微成像 / 光学系统 / 光刻 / 遥感 / 计算成像 等场景。


一、物理光学 PSF 原理

在标量衍射理论 下,PSF 由 瞳孔函数(Pupil Function) 的傅里叶变换给出:

PSF(x,y)=∣F{P(u,v)}∣2\text{PSF}(x,y) = \left| \mathcal{F}\{P(u,v)\} \right|^2PSF(x,y)=∣F{P(u,v)}∣2

其中:

  • P(u,v)P(u,v)P(u,v):瞳函数(振幅 + 相位)
  • F\mathcal{F}F:傅里叶变换
  • 包含 衍射、像差、波长、数值孔径(NA)

二、标准物理光学 PSF(无像差)

1、参数设置

matlab 复制代码
%% 基本参数
lambda = 550e-9;      % 波长 (m)
NA = 1.4;              % 数值孔径
n = 1.0;               % 介质折射率(空气)
pixel_size = 6.5e-6;   % 探测器像素尺寸 (m)

N = 1024;              % 计算网格大小
L = 20e-6;             % 视场大小 (m)

2、频域坐标(瞳孔平面)

matlab 复制代码
% 空间频率坐标
fx = linspace(-1/(2*pixel_size), 1/(2*pixel_size), N);
fy = fx;
[Fx, Fy] = meshgrid(fx, fy);

% 归一化频率
rho = sqrt(Fx.^2 + Fy.^2) * lambda / NA;

3、瞳函数(圆形孔径)

matlab 复制代码
P = double(rho <= 1);   % 理想圆形孔径

4、物理光学 PSF(FFT)

matlab 复制代码
PSF = abs(fftshift(fft2(P))).^2;
PSF = PSF / sum(PSF(:)); % 能量归一化

5、可视化

matlab 复制代码
figure;
imagesc(linspace(-L/2,L/2,N), linspace(-L/2,L/2,N), PSF);
axis image; colormap hot; colorbar;
title('PSF (Physical Optics Model)');
xlabel('x (m)'); ylabel('y (m)');

三、加入像差(Zernike 多项式)

1、Zernike 相位

matlab 复制代码
% 极坐标
[theta, r] = cart2pol(Fx, Fy);
r = r / max(r(:));

% 像差系数
Z11 = 0.5;   % 离焦
Z20 = 0.3;   % 球差

% Zernike 多项式
defocus = Z11 * sqrt(3) * (2*r.^2 - 1);
spherical = Z20 * sqrt(5) * (6*r.^4 - 6*r.^2 + 1);

phase = defocus + spherical;

2、含像差的瞳函数

matlab 复制代码
P_aberr = P .* exp(1i * 2*pi/lambda * phase);

3、有像差的 PSF

matlab 复制代码
PSF_aberr = abs(fftshift(fft2(P_aberr))).^2;
PSF_aberr = PSF_aberr / sum(PSF_aberr(:));

四、三维 PSF(光学切片)

matlab 复制代码
z_range = linspace(-10e-6, 10e-6, 21); % 离焦范围
PSF_3D = zeros(N, N, length(z_range));

for k = 1:length(z_range)
    z = z_range(k);
    phase_z = exp(1i * pi * rho.^2 * z / (lambda * NA^2));
    P_z = P .* phase_z;
    PSF_3D(:,:,k) = abs(fftshift(fft2(P_z))).^2;
end

五、与理想 PSF 对比

模型 特点
几何光学 无衍射,无限小
Airy 盘 无像差衍射极限
物理光学 衍射 + 像差
矢量光学 偏振效应(更高阶)

参考代码 MATLAB程序-按物理光学模型生成PSF www.youwenfan.com/contentcsv/78984.html

六、工程级封装函数

matlab 复制代码
function PSF = generatePSF(N, lambda, NA, aberration)
    [Fx, Fy] = meshgrid(linspace(-1,1,N));
    rho = sqrt(Fx.^2 + Fy.^2);
    P = double(rho <= 1);

    if nargin > 3
        phase = aberration;
        P = P .* exp(1i * 2*pi/lambda * phase);
    end

    PSF = abs(fftshift(fft2(P))).^2;
    PSF = PSF / sum(PSF(:));
end

七、常见扩展

矢量 PSF(Richards--Wolf)
部分相干照明 PSF
宽场 / 共聚焦 / STED
与相机像素卷积
用于超分辨重建(Deconvolution)

相关推荐
H.莓飛12 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu11412 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶13 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子14 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放14 小时前
面向对象高级(实战案例)
开发语言·python·学习
fanruitian15 小时前
python else用法
开发语言·python
FRing0315 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿15 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_4173968316 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
某不知名網友16 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft