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

相关推荐
今天AI了吗31 分钟前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5211 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing3 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse3 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
丰锋ff3 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
夜不会漫长4 小时前
C++入门(1)
开发语言·c++·算法
大鹏说大话4 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo4 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python