基于物理光学(波动光学)模型的 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)

相关推荐
SomeOtherTime5 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood5 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青6 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
饮水桶_T9 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘5610 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Felven12 小时前
C. Brr Brrr Patapim
c语言·开发语言
路溪非溪13 小时前
python标准库使用总结
开发语言·python
SomeOtherTime14 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust
zh_xuan15 小时前
kotlin常见面试题
开发语言·kotlin·面试题
草莓熊Lotso16 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试