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

相关推荐
香蕉鼠片1 小时前
八股C++(二)
开发语言·c++
影寂ldy1 小时前
C#数组的高级方法
开发语言·c#
zzzsde1 小时前
【Linux网络】传输层协议UDP
linux·服务器·开发语言·网络·算法·udp
曹牧2 小时前
C#:基类中定义泛型方法
java·开发语言·c#
游乐码2 小时前
c#基础(七)延迟函数
开发语言·unity·c#·游戏引擎
思麟呀2 小时前
在C++基础上理解CSharp-4
开发语言·jvm·c++·c#
神仙别闹2 小时前
基于C++ OpenGL 绘制太阳系
开发语言·c++
froginwe112 小时前
Rust 数据类型
开发语言