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

相关推荐
LDR0067 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术7 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园8 小时前
C++20 Modules 模块详解
java·开发语言·spring
xiao5kou4chang6kai48 小时前
MATLAB机器学习、深度学习--从数据预处理到模型训练
深度学习·机器学习·matlab·数据预处理
swordbob8 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享9 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.9 小时前
C语言--day30
c语言·开发语言
何以解忧,唯有..9 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽9 小时前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下9 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php