在探讨涡旋光的衍射之前,有必要回顾衍射的基本概念。当光在传播过程中遭遇障碍物或通过小孔时,会偏离直线传播路径,在障碍物或小孔后方形成明暗相间的条纹或图案,这一现象即为光的衍射。衍射是光波动性的重要体现,使得光能够绕过障碍物,展现出独特的传播特性。
从理论层面来看,衍射现象可用惠更斯 - 菲涅尔原理予以解释。惠更斯提出,波面上的每一点均可视为新的子波源,这些子波源发出的子波在空间中相互干涉、叠加,进而形成衍射图案。菲涅尔在此基础上引入子波相干叠加的概念,完善了对衍射现象的数学描述。在日常生活中,我们能够观察到一些简单的衍射现象,例如阳光透过树叶缝隙时,在地面形成的光斑并非规则圆形,而是带有复杂的边缘和图案,这便是光的衍射所致。
光场衍射的菲涅尔公式中,U(x0,y0,0)表示在源面的场分布,t表示衍射屏的分布函数。dx0dy0 表示对衍射平面径向积分从而得到z位置处的光场分布。
如何利用MATLAB模拟这个过程呢?可以利用之前提过的角谱传播的方法:
function field_prop = angular_spectrum_propagation(field,lambda, z, dx)
lambda, z, dx)
[N, ~] = size(field);
k = 2 * pi / lambda;
fx = (-N/2:N/2-1) / (N * dx);
[FX, FY] = meshgrid(fx, fx);
H = exp(1i * k * z * sqrt(1 - (lambda *FX).^2 - (lambda * FY).^2));
H = fftshift(H);
field_freq = fft2(fftshift(field));
field_prop_freq = field_freq .* H;
field_prop = ifftshift(ifft2(field_prop_freq));
首先,我们可以利用预先写好的函数生成拉盖尔高斯光束,然后去产生孔径:
图1:不同孔径涡旋光的衍射图样
如图1,下面我们分别产生了等边三角形孔、五角星孔、矩形孔和太极孔。上面一行则是对应的衍射图案。值得注意的是三角孔衍射的结果能够被应用于涡旋光的检测,不仅可以很容易地检测出涡旋光的拓扑荷,并且其朝向还可以很方便地反映涡旋光拓扑荷的振幅。相关研究还表明,三角孔可以实现对非整数涡旋光的检测。
图2:涡旋光三角孔衍射
如图2所示,在三角衍射的情况下,一条边上的散斑数目恰好等于拓扑电荷的数目加一而三角形衍射图样的朝向则和拓扑荷的符号有关。当然,我们还可以画出在不同平面的衍射图样,以揭示这种图样的形成过程,如图3所示。
图3:不同平面的三角孔干涉图样的形成过程
改变屏的形状,我们可以模拟其它形状孔径的干涉图样,当然,这并没有什么奇特的。比如如图4就展示了五角星孔径衍射图样的形成。
图4:五角星孔径衍射图样的形成
在某节百无聊赖的本科光学课上,你一定听说过这样一桩公案。
1818年,法国科学院被光的本质这一难题困扰许久。光究竟是微粒,像一颗颗高速飞行的子弹,还是如同水波一般的波动,科学界争论不休。为了终结这场旷日持久的争论,法国科学院举办了一场关于光的衍射的征文比赛,希望能从众多科学家中找到答案。
年轻的物理学家菲涅尔,坚信光的波动说。他一头扎进实验室,经过无数次的实验和复杂的数学推导,提交了一篇极具分量的论文。在论文里,他详细阐述了光的衍射现象,用严谨的数学公式描绘出光在遇到障碍物时,是如何像水波绕过石头一样,产生奇妙的图案。这篇论文如同一颗投入平静湖面的石子,激起了千层浪。
法国数学家泊松,是光的微粒说的忠实拥趸。他仔细研读了菲涅尔的论文,越看越觉得荒谬。在他心中,光一直是沿直线传播的微粒,怎么可能出现菲涅尔描述的那些奇特现象?泊松决定给菲涅尔的理论致命一击。他运用自己卓越的数学才能,对菲涅尔的理论进行了深入的计算。结果让他既惊讶又兴奋,根据菲涅尔的理论,如果让一束光照射在一个小圆盘上,在圆盘后方一定距离处的屏幕上,除了圆盘的影子外,在影子的中心竟然应该会出现一个亮斑!泊松觉得这简直是天方夜谭,在他的认知里,圆盘的影子中心必然是黑暗的,这个亮斑的预言简直违背了所有常识。
泊松迫不及待地站出来,拿着自己的计算结果,向菲涅尔发起了挑战。他嘲讽地说:“如果按照你的理论,那岂不是会出现一个连三岁小孩都觉得荒谬的亮斑?” 面对泊松的质疑和众人的目光,菲涅尔并没有退缩。他深知,科学的真理需要实验来验证。于是,他和物理学家阿拉果一起,精心搭建实验装置。他们找来了精密的光源、小巧的圆盘和高灵敏度的屏幕,在实验室里反复调试。
终于,决定命运的时刻来临了。当他们打开光源,那束光如同一把利剑,射向圆盘。所有人都屏住呼吸,眼睛紧紧盯着屏幕。慢慢地,奇迹出现了!在圆盘影子的中心,一个明亮的光斑清晰地显现出来,就像黑暗中的一颗璀璨星辰。这个亮斑的出现,不仅让在场的人目瞪口呆,也让整个科学界为之震惊。
虽然到了5202年了,科学家还是说不清光到底是个啥,但是我们不妨尝试来仿真这个物理现象。首先,我们让拉盖尔高斯光束的拓扑荷变为0,这样我们就得到了一个高斯光束,再让高斯光束充分地大。然后,让我们创建一个圆盘掩膜。圆盘掩膜中心是低通的,让它为0,其余部分则让它为1,这样我们就完成了二值化的过程。
图5: 泊松亮斑
可以清晰地看到,在圆盘的中心点出现了一个亮点。当增大圆盘的尺寸,两点就会变小,而减小圆盘的尺寸,亮点就会变大。这个现象说明光可以绕过障碍物向前传播,极大地支持了波动说。
如果是矩形孔呢?
图6:矩形孔衍射
如图6展示了矩形孔衍射。虽然也可以用来检测涡旋光地拓扑荷。但是看上去并没有什么奇特的。但是,当我意识到我可以压缩矩形孔的时候,事情开始变得不简单了。如果一侧压缩矩形孔的高度,那么恭喜你将获得单缝。如果你碰巧将两个单缝组合到一起,你就得到了双缝隙。这样你就会得到双缝干涉的经典结果,因为干涉和衍射本质都是光的叠加。当增加缝的宽度,事情又开始变得不简单起来了,这个时候你可以仿真处缝宽对于双缝实验的影响,这个时候衍射效应开始变得显著起来了。
图7:双缝实验缝宽的影响
如果我们把无数个宽度不为零的矩形孔组合到一起我们就收获了一个光栅,事情再度变得不简单起来了。涡旋光的衍射的确很玄妙,但是让我们回到一开始,问出那个早已经在心里酝酿已久的问题?涡旋光的确很妙,那么,在哪里能够买到呢?涡旋光的产生、检测和调控是涡旋光研究的三大支柱。就产生涡旋光而言,为人们所熟知的就是叉形衍射。为了得到相应的光束,需要先制备相应的衍射光栅,制备衍射光栅可以选择计算机全息直接加载到空间光场调制器中,也可以刻蚀为实物
图8:论文中生成的达曼光栅
在MATLAB中可以通过干涉产生对于的叉形光栅,并且将其二值化,从而可以被制作成全息图。
function mask = damann_mask(E,X,Y,lambda,t1,t2,a,R)
%% 根据目标涡旋光创建达曼光栅
%% E是目标涡旋光; X和Y是达曼光栅的坐标
%% lambda是波长
%% Angle1是曲率因子
%% R是达曼光栅的尺寸
[~,r] = cart2pol(X,Y);
Create LG object wave
LG=exp(1i*angle(E));
Create tilted plane reference wave
r_1= sqrt((X-t1).^2+(Y-t2).^2);
B=exp(-1i*2*pi*r_1.^2/lambda/2/a);
Simulate interference between object and reference wave
I =LG+B; H = I.*conj(I); H = H./max(max(H));
mask=imbinarize(H).*(r<R);
end
这里E是理论仿真的光场,与中心偏移的球面波前干涉就可以生成对应的达曼光栅。如图9所示即为高斯光束经过该达曼光栅所形成的结果。
图9:高斯光束经过达曼光栅产生涡旋光束
如果要生成其它光束也不是不行,只需要加载对应的光栅即可。
图10:高斯光束经过达曼光栅生成双涡旋
前面所有的均为二值化掩膜,那么如果是相位屏或者相位型物体呢,譬如说涡旋光经过柱面镜?如图11所示涡旋光经过表示一个倾斜的柱面镜后形成的像散光束。
图11:涡旋光经过倾斜柱面镜
三、涡旋光衍射特性的应用领域及前景
涡旋光的衍射特性在众多领域具有重要应用价值。在光学通信领域,利用涡旋光的轨道角动量可实现多路复用,显著提高通信容量和速度,为未来高速通信网络的发展提供新思路。例如,在自由空间光通信中,科研人员将不同拓扑荷数的涡旋光作为不同信道,成功实现多通道数据传输,大幅提升了通信系统的容量。在水下光通信领域,由于涡旋光独特的衍射特性,在一定程度上能够减少水中粒子对光信号的散射和吸收,有望提高水下通信的距离和稳定性。
在光学成像领域,涡旋光的衍射可用于提高成像分辨率和对比度,助力科研人员更清晰地观测微观世界。传统光学显微镜受限于衍射极限,分辨率存在一定瓶颈。而基于涡旋光的成像技术,如涡旋光扫描显微镜(Vortex Beam Scanning Microscopy,VBSM),利用涡旋光的特殊衍射特性,能够突破传统衍射极限,实现对生物细胞、纳米材料等微观结构的高分辨率成像。在生物医学领域,该技术可辅助医生更准确地诊断疾病,为疾病的早期治疗提供有力支持。
此外,在原子操控、量子信息处理等前沿领域,涡旋光的衍射也发挥着关键作用,推动这些领域不断发展和突破。在原子操控方面,利用涡旋光的轨道角动量可对原子进行精确操控,实现原子的囚禁、旋转和冷却等,为量子计算和量子模拟提供重要的实验基础。在量子信息处理中,涡旋光的轨道角动量可作为量子比特的候选之一,与传统量子比特相比,具有更高维度和更多量子态,有望提升量子信息系统的存储和处理能力。
四、研究进展与面临的挑战
随着科研人员对涡旋光衍射研究的不断深入,新的研究成果不断涌现。例如,通过设计特殊的光学元件,能够精确调控涡旋光的衍射特性,实现对光场的灵活操控。近年来,超表面(Metasurface)作为一种新型人工光学材料,在涡旋光调控方面展现出巨大潜力。超表面由亚波长尺度的光学单元组成,通过对这些单元的结构和排列进行精心设计,可实现对光的振幅、相位和偏振等特性的任意调控。利用超表面制作的涡旋光发生器和衍射元件,具有体积小、效率高、易于集成等优点,为涡旋光技术的实用化开辟了新途径。
然而,当前的研究仍面临一些挑战。例如,如何进一步提高涡旋光在复杂环境下的传输稳定性,以及如何更高效地产生和检测涡旋光等。在大气通信中,大气湍流会导致涡旋光的波前畸变,从而影响通信质量和可靠性。为解决这一问题,科研人员正在研究各种自适应光学技术,通过实时监测和补偿波前畸变,提高涡旋光在大气中的传输性能。在涡旋光检测方面,传统检测方法存在灵敏度低、带宽有限等问题,开发新型的高灵敏度、宽带宽的涡旋光检测技术也是当前研究的热点之一。这些问题的解决将有助于推动涡旋光衍射技术的进一步发展和应用。
clc;clear;close all;
%% 参数设置
d = 2e-3; % 掩膜半径
a =10; % 曲率半径
d_1 = d*10; % x方向波前偏移
d_2 = 0; % y方向波前偏移
%网格参数
L =20e-3; % 模拟区域大小 (m) 50 mm
N = 500; % 网格点数
dx = L / N; % 空间步长
x = linspace(-L/2, L/2, N); % 空间网格
[X, Y] = meshgrid(x, x); % 二维网格
[theta,r] = cart2pol(X,Y); % 转化为极坐标
% Z方向的切片参数
m= 5; % 画出5个切片
zk = 300e-3; % 间隔
zm = m*zk; % 终点坐标
z0 = zk; % 起始坐标
c = zm/L/4; % 横纵向和谐尺度因子
Z = zk:zk:zm; % Z传播向量
% 光源参数
lambda =532e-9; % 波长 (m)
k = 2 * pi / lambda; % 波数
% 入射高斯光
w0 = 0.5e-3; % 光束waist (m) 0.5 mm
E = exp(-r.^2/w0^2);
E = E ./ sum(sum(E));
I0 = E.*conj(E);
I0 = I0./max(max(I0));
% 生成掩膜
TC =2;p = 0;
E0 =@(TC) (r/w0).^(abs(TC)).*exp(-r.^2/w0^2).*(exp(1i*TC*theta)).*laguerre(p,TC,2*r.^2/w0^2);
E1 = E0(TC)+0.3*E0(0);
A = damann_mask(E1,X,Y,lambda,d_1,d_2,a,d);% 生成达曼光栅
figure('position',[0 0 1920 1200],'color','w');
h1 = surf(-zk*ones(size(X))*1e3/c,X*1e3, Y*1e3,I0,'EdgeColor','none');
colormap(lambda2rgb(lambda*1e9));
freezeColors;
set(h1,'Facealpha',0.99);
hold on;
axis equal;
grid on;
h2 = surf(-0*ones(size(X))*1e3/c,X*1e3, Y*1e3,real(A),'EdgeColor','none');
colormap(nclCM(26,238));freezeColors;set(h2,'Facealpha',0.8);
% 画出切片
for i = 1:length(Z)
z =Z(i); % 传输距离 (m)
E_prop = angular_spectrum_propagation(E.*A, lambda, z, dx); % 绘制结果
I_k = (E_prop.*conj(E_prop));
I_k = I_k./max(max(I_k));
h3 = surf(z*ones(size(X))*1e3/c,X*1e3, Y*1e3,I_k*10,'EdgeColor','none'); colormap(lambda2rgb(lambda*1e9));
freezeColors;
set(h3,'Facealpha',0.8);
end
xlabel('$Z\ (\rm{mm})$','color','b','Interpreter','latex','Fontname','times new roman','fontsize',20)
ylabel('$X\ (\rm{mm})$','color','b','Interpreter','latex','Fontname','times new roman','fontsize',20)
zlabel('$Y\ (\rm{mm})$','color','b','Interpreter','latex','Fontname','times new roman','fontsize',20)
set(gca,'ztick',(-L/2:L/2:L/2)*1e3,'zticklabel',ceil(-L/2*1e3:L/2*1e3:L/2*1e3))
set(gca,'ytick',(-L/2:L/2:L/2)*1e3,'yticklabel',ceil(-L/2*1e3:L/2*1e3:L/2*1e3))
set(gca,'xtick',(-zk:zk:zm)*1e3/c,'xticklabel',ceil((-zk*1e3:zk*1e3:zm*1e3)))
set(gca,'XColor','b','YColor','b','ZColor','b','color','w')
set(gca,'fontname','times new roman','fontsize',20,'TickDir','in')
view(45,10);
box on;
ax = gca;
ax.BoxStyle = 'full';
三角孔
%% 三角孔% /* 三角形光阑 */
function [ result ] = Tri_mask(E0,Length,Width,Lx,Ly)
%Length Width 为光阑长宽 Lx Ly为采样点x,y方向长度
[Nx,Ny] = size(E0);
result = zeros(Nx,Ny);
X_begin = ceil((1-Length/Lx)*Nx/2);
X_end = ceil((1+Length/Lx)*Nx/2);
Y_begin = ceil((1-Width/Ly)*Ny/2);
for a = X_begin:X_end
for b = Y_begin:a
result(a,b) = 1;
end
end
end
矩形孔
function E = rect_mask(X,d1,d2)
% 参数设置
% 矩形光阑掩膜 长d1,宽d2
[~, N] = size(X);
rectWidth = d1/max(max(X))*N/2; % 矩形宽度 (像素) rectHeight = d2/max(max(X))*N/2; % 矩形高度 (像素)
center = [N/2, N/2]; % 中心坐标
%% 生成矩形孔径
E = zeros(N);
E(...
center(2)-rectHeight/2 : center(2)+rectHeight/2,...
center(1)-rectWidth/2 : center(1)+rectWidth/2) = 1;
五角星孔
function E = star_mask(X0,d1)
% 参数设置
[~, N] = size(X0);
imgSize = N; % 图像尺寸
starRadius = d1/max(max(X0))*N/2; % 五角星外接圆半径 (像素)
center = [N/2, N/2]; % 中心坐
%% 生成五角星孔径
% 计算五角星顶点坐标 (极坐标系)
theta = deg2rad(0:72:359); % 基本角度 outerPoints = starRadius * exp(1i*theta); % 外顶点
innerPoints = 0.4*starRadius * exp(1i*(theta + deg2rad(36))); % 内顶点
% 组合顶点坐标 (交替连接内外顶点)
starPoints = zeros(10,2);
starPoints(1:2:9,:) = [real(outerPoints);
imag(outerPoints)]';
starPoints(2:2:10,:) = [real(innerPoints);
imag(innerPoints)]';
% 平移至中心并转换为像素坐标
starPoints(:,1) = starPoints(:,1) + center(1); starPoints(:,2) = starPoints(:,2) + center(2);
% 生成二值化掩模
E = poly2mask(starPoints(:,1), starPoints(:,2), imgSize, imgSize);
太极孔
function mask = taiji_mask(X, Y, R)
% X, Y: 网格坐标矩阵
% R: 太极图半径
% 计算右上半鱼形区域(中心在右R/2处,半径R/2的上半圆)
right_upper = ((X - R/2).^2 + Y.^2 >= (R/2)^2) & (Y >= 0);
% 计算左下半鱼形区域(中心在左R/2处,半径R/2的下半圆)
left_lower = ((X + R/2).^2 + Y.^2 <= (R/2)^2) & (Y <= 0);
% 计算大圆边界
big_circle = (X.^2 + Y.^2 <= R^2);
% 组合掩模 (大圆内且属于右上半或左下半鱼形)
mask = big_circle & (right_upper | left_lower);
双缝
function mask = double_slit_mask(X, Y, slit_width, slit_length, slit_spacing,center_x, center_y)
% X, Y: 网格坐标矩阵
% slit_width: 缝的宽度
% slit_spacing: 两条缝之间的间距
% slit_length: 缝的长度
% center_x, center_y: 双缝的中心位置
% 初始化掩膜为全零
mask = zeros(size(X));
% 计算每条缝的边界
slit_left = center_x - slit_spacing/2 - slit_width/2;
slit_right = center_x - slit_spacing/2 + slit_width/2; slit_left2 = center_x + slit_spacing/2 - slit_width/2; slit_right2 = center_x + slit_spacing/2 + slit_width/2;
% 计算缝的上下边界
slit_top = center_y - slit_length/2;
slit_bottom = center_y + slit_length/2;
% 创建第一条缝的掩膜 mask((X >= slit_left) & (X <= slit_right) & (Y >= slit_top) & (Y <= slit_bottom)) = 1;
% 创建第二条缝的掩膜
mask((X >= slit_left2) & (X <= slit_right2) & (Y >= slit_top) & (Y <= slit_bottom)) = 1;
多缝光栅
function mask = rectangular_slits(X, Y, d, width, length)
% GENERATE_RECTANGULAR_SLITS 生成一系列具有宽度的矩形狭缝
% 输入参数:
% X, Y: 网格坐标矩阵,由meshgrid生成
% d: 矩形狭缝之间的间隔
% width: 每个矩形狭缝的宽度(沿x轴方向)
% length: 每个矩形狭缝的长度(沿y轴方向)
% mask: 二值掩膜矩阵,1表示矩形狭缝区域,0表示背景
% 初始化掩膜为全false
mask = false(size(X));
% 确定x轴的范围
x_min = min(X(:));
x_max = max(X(:));
% 计算y轴的中心位置
y_center = (max(Y(:)) + min(Y(:))) / 2;
y_start = y_center - length/2;
y_end = y_center + length/2;
% 在x轴上生成每个矩形狭缝
current_x = x_min;
while current_x <= x_max % 当前矩形的x范围
x_end_rect = current_x + width;
% 生成当前矩形的逻辑掩膜
in_x = (X >= current_x) & (X <= x_end_rect);
in_y = (Y >= y_start) & (Y <= y_end);
rect_mask = in_x & in_y;
% 将当前矩形合并到总掩膜中
mask = mask | rect_mask;
% 更新下一个矩形的起始位置(当前结束位置 + 间隔d)
current_x = x_end_rect + d;
end