菲涅尔传播1(Fresnel Propagation)

菲涅尔积分公式

省去复杂的数学推导,这里我们直接给出菲涅尔积分公式
U 2 ( x 2 , y 2 ) = e j k z j λ z ∫ − ∞ ∞ ∫ − ∞ ∞ U 1 ( x 1 , y 1 ) e j k 2 z [ ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 ] d x 1 d y 1 , (1) U_2\left(x_{2}, y_{2}\right) =\frac{e^{j k z}}{j \lambda z} \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} U_1\left(x_{1}, y_{1}\right) e^{j \frac{k}{2 z}\left[\left(x_{2}-x_{1}\right)^{2}+\left(y_{2}-y_{1}\right)^{2}\right]} d x_{1} d y_{1},\tag{1} U2(x2,y2)=zejkzU1(x1,y1)ej2zk[(x2x1)2+(y2y1)2]dx1dy1,(1)
这里 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 代表光源平面的坐标, ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 代表观察平面的坐标, k = 2 π / λ k=2\pi/\lambda k=2π/λ 表示波数, λ \lambda λ 代表光学波长, z z z 代表光源平面和观察平面中心点的距离。图1展示了光源平面和观察平面的几何构造。

图1. 光源平面和观察平面的几何构造图形示意.
为了方便我们进行模拟菲涅尔传播,我们可以进一步对公式(1)进一步处理。把积分符号里指数部分的平方展开,最终我们可以得到如下的公式,
U 2 ( x 2 , y 2 ) = exp ⁡ ( j k z ) j λ z exp ⁡ [ j k 2 z ( x 2 2 + y 2 2 ) ] × ∬ { U 1 ( x 1 , y 1 ) exp ⁡ [ j k 2 z ( x 1 2 + y 1 2 ) ] } exp ⁡ [ − j 2 π λ z ( x 1 x 2 + y 1 y 2 ) ] d x 1 d y 1 , (2) \begin{aligned} U_{2}(x_2, y_2)= & \frac{\exp (j k z)}{j \lambda z} \exp \left[j \frac{k}{2 z}\left(x_2^{2}+y_2^{2}\right)\right] \\ & \times \iint\left\{U_{1}(x_1, y_1) \exp \left[j \frac{k}{2 z}\left(x_1^{2}+y_1^{2}\right)\right]\right\} \exp \left[-j \frac{2 \pi}{\lambda z}(x_1 x_2+y_1 y_2)\right] d x_1 d y_1, \tag{2} \end{aligned} U2(x2,y2)=zexp(jkz)exp[j2zk(x22+y22)]×{U1(x1,y1)exp[j2zk(x12+y12)]}exp[jλz2π(x1x2+y1y2)]dx1dy1,(2)
二维傅里叶变换的定义如下
G ( f x 1 , f y 1 ) = ∬ g ( x 1 , y 1 ) exp ⁡ [ − j 2 π ( f x 1 x 1 + f y 1 y 1 ) ] d x 1 d y 1 , (3) G\left (f_{x_1},f_{y_1}\right) =\iint g\left (x_1,y_1 \right)\exp\left [-j2\pi \left (f_{x_1}x_1+f_{y_1}y_1 \right)\right ]dx_1dy_1, \tag{3} G(fx1,fy1)=g(x1,y1)exp[j2π(fx1x1+fy1y1)]dx1dy1,(3)
对比公式(2)和公式(3),我们可以发现公式(2)中的积分符号里就是一个傅里叶变换,其中
g ( x 1 , y 1 ) = U 1 ( x 1 , y 1 ) exp ⁡ [ j k 2 z ( x 1 2 + y 1 2 ) ] , (4) g(x_1,y_1)=U_{1}(x_1, y_1) \exp \left[j \frac{k}{2 z}\left(x_1^{2}+y_1^{2}\right)\right],\tag{4} g(x1,y1)=U1(x1,y1)exp[j2zk(x12+y12)],(4)
f x 1 = x 2 λ z ,   f y 1 = y 2 λ z . (5) f_{x_1}=\frac{x_2}{\lambda z} ,\ f_{y_1}=\frac{y_2}{\lambda z}.\tag{5} fx1=λzx2, fy1=λzy2.(5)
这样,我们就可以用一个傅里叶变换快速计算积分部分,而快速傅里叶变换(FFT)在大部分软件中都直接可以调用相应的命令。

如何模拟菲涅尔传播

首先,我们需要先构造出一个取样空间,设定好取样间隔。 如图2所示, x x x 方向上的取样间隔是 Δ x \Delta x Δx, 取样点数是 N N N, 那么 x x x 方向上对应的取样物理尺寸就是 L X = N Δ x L_X=N\Delta x LX=NΔx。类似的, y y y 方向上的取样间隔是 Δ y \Delta y Δy, 取样点数是 M M M, 那么 y y y 方向上对应的取样物理尺寸就是 L Y = M Δ y L_Y=M\Delta y LY=MΔy。 通常,我们取 M = N M=N M=N, Δ x = Δ y \Delta x = \Delta y Δx=Δy, 并且设置 M M M N N N 为偶数。
在这里插入图片描述
图2. 一个二维平面的离散取样。

光源平面的坐标系统

根据图2,我们可以进一步构建光源平面坐标系统, x 1 x_1 x1 方向共有 N N N 个点,从左到右,坐标点数为 − N / 2 -N/2 N/2 N / 2 − 1 N/2-1 N/21 y 1 y_1 y1 方向共有 M M M 个点,从下到上,坐标点数为 − M / 2 -M/2 M/2 M / 2 − 1 M/2-1 M/21。这里,我用图3进一步阐明这个坐标系统。
在这里插入图片描述

图3. 坐标系统。
根据图三所示的坐标系统,我们可以借助软件,例如matlab来实现这一坐标系统。matlab的代码如下

% source plane coordinates
[x1, y1] = meshgrid((-N/2 : 1: N/2 -1) * delta1, (-M/2 : 1: M/2 -1) * delta1);

在上述代码中,我们借助matlab中的命令meshgrid来构造图3所示的一个网格坐标系统。代码中,delta1即是取样间隔,这里我们认为 Δ x 1 = Δ y 1 = Δ 1 \Delta x_1 = \Delta y_1 = \Delta_1 Δx1=Δy1=Δ1。这里 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 代表着光源平面的坐标。

观察平面的坐标系统

为了得到观察平面的坐标系统,我们需要知道观察平面的取样间隔。这个取样间隔可以由下面的公式计算得出
Δ x 2 = λ z N Δ x 1 , (6) \Delta x_2 = \frac{\lambda z}{N\Delta x_1},\tag{6} Δx2=NΔx1λz,(6)
在公式(2)中,观察平面的取样间隔可以由传播距离和光源平面的取样间隔得到。因此,我们可以进而得到观察平面的坐标系统,其matlab代码如下

% observation plane coordinates
delta2 = lambda * z / (N * delta1);
[x2, y2] = meshgrid((-N/2 : 1: N/2 -1) * delta2, (-M/2 : 1: M/2 -1) * delta2);

根据公式(2)模拟菲涅尔传播

根据公式(2),我们可以定义如下菲涅尔传播函数。

function [U2, x2, y2] = direct_fresnel_propagation(U1, lambda, delta1,z)
% U1: source plane
% lambda: wavelength
% delta1: sampling interval in the source plane, delta_x1 and delta_y1,
% delta_x1 = delta_y1
% z:distance of the central point between source plane and observation
% plane, i.e., the propagation distance
% U2: output in the observation plane
% x2, y2:the coordinates in the observation plane
[M, N] = size(U1);  % obtain the number of points along each side
k = 2 * pi / lambda; % wave number
% source plane coordinates
[x1, y1] = meshgrid((-N/2 : 1: N/2 -1) * delta1, (-M/2 : 1: M/2 -1) * delta1);
% observation plane coordinates
delta2 = lambda * z / (N * delta1);
[x2, y2] = meshgrid((-N/2 : 1: N/2 -1) * delta2, (-M/2 : 1: M/2 -1) * delta2);
% Fresnel propagation integral
U2 = (exp^(1j * k * z)/1j * lambda * z) * exp(1j * (k/(2*z)) * (x2.^2 + y2.^2))...
    .* fftshift(fft2(fftshift(U1 .* exp(1j * (k/(2*z)) * (x1.^2 + y1.^2))))) * delta1^2;
end

在上述定义的函数中,有几点值得注意:

  1. 虚数单位 j j j 加个数字1是为了增加程序稳定性, 不加这个数字1也是可以的,前提是不能在其它地方再给 j j j 赋值了,否则引发的错误你很难发现;
  2. 程序中点乘的地方需要特别注意,例如 在这里插入图片描述
    这里的点乘代表对向量或者矩阵中每一个元素进行操作;
  3. 程序中,…代表换行续写;
  4. 最后要乘以delta1^2这个比例因子来对应真实的尺寸。
  5. 程序中要用fftshift(fft2(fftshift( )))来实现一个标准的数学上的傅里叶变换,用fftshift的根本原因是软件的索引只能从正整数开始。但是我们不需要关心这一点,可以简单的认为用fftshift(fft2(fftshift( )))就是来实现二维傅里叶变换。

模拟一个圆孔和方形孔的菲涅尔衍射

圆孔和方形孔的定义

圆孔定义如下

circ ⁡ ( x 2 + y 2 a ) = { 1 x 2 + y 2 < a 1 2 x 2 + y 2 = a 0 x 2 + y 2 > a (7) \operatorname{circ}\left(\frac{\sqrt{x^{2}+y^{2}}}{a}\right)=\left\{\begin{array}{ll} 1 & \sqrt{x^{2}+y^{2}}<a \\ \frac{1}{2} & \sqrt{x^{2}+y^{2}}=a \\ 0 & \sqrt{x^{2}+y^{2}}>a \end{array}\right.\tag{7} circ(ax2+y2 )= 1210x2+y2 <ax2+y2 =ax2+y2 >a(7)
这里 a a a 代表圆孔的半径。
根据定义,我们可以用如下代码实现这个函数:

function [circle_shape] = circ(x,y,a)
% x,y: coordinates
% a:radius used to control the size of circle
r = sqrt(x.^2 + y.^2);
circle_shape = double(r<a);
circle_shape(r==a) = 0.5;
end

方形孔定义如下

一维的方形函数定义如下
rect ⁡ ( x a ) = { 1 ∣ x ∣ < a 2 1 2 ∣ x ∣ = a 2 0 ∣ x ∣ > a 2 \operatorname{rect}\left(\frac{x}{a}\right)=\left\{\begin{array}{cc} 1 & |x|<\frac{a}{2} \\ \frac{1}{2} & |x|=\frac{a}{2} \\ 0 & |x|>\frac{a}{2} \end{array}\right. rect(ax)= 1210x<2ax=2ax>2a
其对应的实现代码如下

function [out] = rect(x,a)
% x:coordinates
% a:used to control the width of rectangular
out = double(abs(x)<a/2);
out(abs(x)==a/2) = 0.5;
end

二维的方形孔,可以用两个一维的方形函数构造

% two dimensional rectangular shape
rect_shape = rect(x, a) .* rect(y, b);

圆孔的菲涅尔衍射

圆孔的菲涅尔衍射代码如下

clear;close all;clc
%% parameters
a = 1e-3;   % radius of circle shape unit:m
N = 1024;    % number of points along each side (row and column)
L = 1e-2;    % physical size of the source plane, unit: m
delta1 = L / N; % sampling interval in the source plane
lambda = 532e-9; % wavelength,unti: m
z = 0.1;        % propagation distance, unit:m
%% circle shape
% cooridates in the source plane
[x1, y1] = meshgrid((-N/2 : 1: N/2 -1) * delta1, (-N/2 : 1: N/2 -1) * delta1);
circle_shape = circ(x1, y1, a);
figure(1) 
imagesc(x1(1,:),y1(:,1),circle_shape); %image display 
colormap('gray'); %linear gray display map 
axis square;      % square figure 
axis xy           % y positive up 
xlim([-0.005,0.005])  % x axis range
ylim([-0.005,0.005])  % y axis range
set(gca,'FontSize',16) % Fontsize of x, y ticks
% Fontsize of x,y labels
xlabel('x [m]', 'FontSize', 16); ylabel('y [m]', 'FontSize', 16);  
%% Fresnel propagation of circle shape
[Fres_circ,x2, y2] = direct_fresnel_propagation(circle_shape,lambda,delta1,z);
figure(2),
imagesc(x2(1,:),y2(:,1),abs(Fres_circ)); %image display 
colormap('gray'); %linear gray display map 
axis square;      % square figure 
axis xy           % y positive up 
set(gca,'FontSize',16) % Fontsize of x, y ticks
% Fontsize of x,y labels
xlabel('x [m]', 'FontSize', 16); ylabel('y [m]', 'FontSize', 16);  

产生的圆形孔和相应的衍射光斑如下图所示
圆形孔
(a)
在这里插入图片描述
(b)
图4. (a)圆形孔,(b)圆形孔对应的衍射光斑。

方形孔的菲涅尔衍射

方形孔的菲涅尔衍射代码如下

clear;close all;clc
%% parameters
a = 1e-3;   % radius of circle shape unit:m
N = 1024;    % number of points along each side (row and column)
L = 1e-2;    % physical size of the source plane, unit: m
delta1 = L / N; % sampling interval in the source plane
lambda = 532e-9; % wavelength,unti: m
z = 0.1;        % propagation distance, unit:m
%% rectangular shape
% cooridates in the source plane
[x1, y1] = meshgrid((-N/2 : 1: N/2 -1) * delta1, (-N/2 : 1: N/2 -1) * delta1);
rect_shape = rect(x1, a) .* rect(y1, a);
figure(1) 
imagesc(x1(1,:),y1(:,1),rect_shape); %image display 
colormap('gray'); %linear gray display map 
axis square;      % square figure 
axis xy           % y positive up 
xlim([-0.005,0.005])  % x axis range
ylim([-0.005,0.005])  % y axis range
set(gca,'FontSize',16) % Fontsize of x, y ticks
% Fontsize of x,y labels
xlabel('x [m]', 'FontSize', 16); ylabel('y [m]', 'FontSize', 16);  
%% Fresnel propagation of circle shape
[Fres_rect,x2, y2] = direct_fresnel_propagation(rect_shape,lambda,delta1,z);
figure(2),
imagesc(x2(1,:),y2(:,1),abs(Fres_rect)); %image display 
colormap('gray'); %linear gray display map 
axis square;      % square figure 
axis xy           % y positive up 
set(gca,'FontSize',16) % Fontsize of x, y ticks
% Fontsize of x,y labels
xlabel('x [m]', 'FontSize', 16); ylabel('y [m]', 'FontSize', 16);  

产生的方形孔和相应的衍射光斑如下图所示
在这里插入图片描述
(a)
在这里插入图片描述
(b)
图5. (a)方形孔,(b)方形孔对应的衍射光斑。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
gs算法(Grid-Space算法)是一种用于光学计算的模拟方法。它将光传播过程中的空间分割成网格,通过计算每个网格点上的光场的传播和相位调制,来模拟光的传播和干涉现象。 在gs算法中,首先将传播距离离散化,然后将空间分割成网格。每个网格点上的光场可以用复数表示,包括振幅和相位信息。通过迭代计算每个网格点上的光场,可以模拟出在传播过程中的衍射效应。 菲涅尔全息(Fresnel holography)是一种全息成像的方法。它利用光的波动性,通过记录对象光波的干涉图案,来还原出真实的三维图像。 菲涅尔全息的基本原理是,将被记录对象的光波分为物光和参考光两部分,这两部分光波通过相干干涉形成干涉图案。通过记录这个干涉图案,并经过适当的处理,可以获得物体的全息图。再通过使用参考光波与全息图发生干涉,就可以还原出三维物体的立体图像。 与传统的摄影不同,菲涅尔全息记录下来的是光的相位信息,因此它可以保留更多的光学信息,在成像的时候可以得到更高质量的图像。而且菲涅尔全息可以实现实时成像,并且对于观察者来说,可以从不同角度观察到不同的视角,呈现出更真实的立体感。 总结来说,gs算法是一种模拟光传播的方法,用于计算光场的传播和干涉现象。而菲涅尔全息则是一种基于干涉原理的全息成像方法,可以实现高质量的三维图像重建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xy_optics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值