涡旋光束这个方向,我在读研那会儿就接触过,当时只觉得相位图长得像漩涡,挺好看。后来真正动手做仿真、搭光路,才意识到拓扑荷、轨道角动量这些概念背后藏着完全不同于平面波的物理逻辑。这篇笔记就把我入门到实操的一些理解和坑,系统梳理一遍,主要的代码和参数也会给到,方便直接复现。
1. 涡旋光束与OAM:它到底是什么,能解决什么问题
涡旋光束(vortex beam)这个名字很直白:光束的波前不是平面,也不是球面,而是像一个旋涡一样绕着传播轴旋转。对应的波前相位分布是螺旋形,在中心处相位不确定,光强反而为零,所以你会看到一个明亮的环形光斑,中间有个暗洞。这种结构非常特殊,普通高斯光束给不了。
轨道角动量(Orbital Angular Momentum, OAM)这个物理量的直观理解其实不复杂。光不仅有能量,还能携带角动量。角动量可以分成两类:一类是偏振相关的自旋角动量,对应圆偏振的左旋、右旋;另一类就是轨道角动量,对应的是波前螺旋结构的宏观扭转。每个光子携带的OAM是整数倍的约化普朗克常数,这个整数l被称为拓扑荷(topological charge)。拓扑荷越大,波前螺旋缠绕得越紧密,光斑的暗洞直径也会变大。
为什么这个方向近些年被反复提及,核心在于OAM提供了光的一个全新复用维度。比如传统通信用波长、振幅、偏振来编码信息,OAM相当于又加了一个自由度,理论上可以承载无穷多正交模态,极大扩展通信容量。除了通信,涡旋光束在超分辨成像、光镊操控微粒、量子信息编码、旋转物体探测等领域都有广泛研究。在高阶涡旋光束的轨道角动量探测场景中,OAM还被用作旋转多普勒效应的测量工具。
对于初学者,最难跨过的坎有两个:第一个是理解螺旋相位如何从数学公式走到物理图像;第二个是知道了理论之后,怎么在实验或者仿真里真正把涡旋光束“做”出来。这篇笔记的重点放在后者,用MATLAB做仿真来走通完整流程,顺便把相位、光强、干涉条纹这些关键结果都可视化出来,见到的图像多了,概念自然就立住了。
2. 仿真思路拆解:为什么用MATLAB,建模仿真要抓哪些物理量
2.1 选型考虑:MATLAB在光学仿真里为什么顺手
市面上的光学仿真工具并不少,比如商用软件、开源库,Python也能做物理光学仿真。但对于涡旋光束这种偏理论验证和课堂教学的场景,MATLAB依然是最顺手的选项。原因有几个:
- 矩阵就是天然的光场画布。光场可以表示成二维复数矩阵,而MATLAB对矩阵操作的支持非常成熟。
- 内置函数丰富,傅里叶变换、特殊函数、复数运算、各类绘图命令都能直接调用,不需要额外安装光学专用包。
- 可视化方便,mesh、surf、imagesc、slice等命令可以快速把振幅、相位、三维强度分布展示出来。
- 项目代码简单明了,不需要复杂的工程化配置,适合快速验证想法。
当然,如果你要做的仿真规模非常大,或者要跑复杂的大气湍流信道模型,Python的灵活性可能更高一点。但初学阶段,MATLAB把从公式到图像的路径缩到最短。
2.2 涡旋光束仿真的核心变量与物理设计
仿真之前先理一下必须关心的物理量。一个涡旋光束的电场复振幅,常用拉盖尔-高斯模式来描述。径向指数p取0时,也就是最常见的单环涡旋光束,其复振幅在柱坐标下可以写成:
[ E(r, \phi, z) \propto \left(\frac{\sqrt{2}r}{w(z)}\right)^{|l|} L_p^{|l|}\left(\frac{2r^2}{w^2(z)}\right) \exp\left(-\frac{r^2}{w^2(z)}\right) \exp(-il\phi) \exp(ikz) ]
其中:
- (r) 是径向坐标,(\phi) 是方位角坐标,(z) 是传播距离;
- (l) 是拓扑荷,整数,决定波前螺旋缠绕的次数;
- (w(z)) 是光束在位置z处的束腰半径;
- (L_p^{|l|}) 是拉盖尔多项式;
- (k = 2\pi/\lambda) 是波数;
- (\exp(-il\phi)) 这一项就是涡旋光束螺旋相位的来源。
这个公式看起来复杂,但仿真时真正需要关注的就这么几个量:
| 参数 | 符号 | 取值建议 | 物理含义 |
|---|---|---|---|
| 波长 | (\lambda) | 632.8 nm 或 1550 nm | 决定尺度,影响相位变化率 |
| 束腰半径 | (w_0) | 1 mm 左右 | 决定光束横向尺度 |
| 拓扑荷 | (l) | 1 ~ 5 | 决定波前螺旋结构和OAM阶数 |
| 传播距离 | (z) | 0 到几个瑞利距离 | 观察光束演化 |
| 折射率 | (n) | 1(空气) | 影响波矢大小 |
仿真的时候,我习惯把网格大小、采样点数、束腰半径这些参数放在代码最前面,方便统一调整。网格太小容易出现边缘截断,采样点太少则相位在中心附近表现不准确,具体怎么选,后面讲到实操时再展开。
2.3 为什么拓扑荷和OAM是绑在一起的核心指标
拓扑荷l在数学上就是相位绕轴一圈的累计变化量除以2π。实际光场中,l等于几,相位图沿着方位角扫一圈就转了几次。
更值得强调的是,OAM的期望值直接正比于拓扑荷l。一个光子携带的轨道角动量大小就是 ( l\hbar )。所以做什么实验、做什么通信方案,首先要确定你想要几阶的涡旋光束,也就是l值的选择。l越大,光子携带的OAM越大,光斑暗洞越大,但也意味着对系统误差越敏感,产生难度上升。
我见过不少初学者在这个点上犯迷糊:以为“OAM”是一个连续的物理量,其实从量子化角度看,l是离散整数,OAM的变化都是整数倍跳变的。理解这一点,对后续理解干涉测量、相位解包裹都大有帮助。
3. MATLAB五步仿真实战:从空光场到涡旋光束
以下流程是我自己反复用的套路,每跑一个新参数组合都靠这套流程快速出图。总体思路是:建网格、定义参数、生成复振幅、可视化分析、验证特征。整个过程不需要额外工具箱,基础MATLAB就能跑。
3.1 第一步:创建空间网格与基础参数
仿真一个二维光场,本质是在一个平面上采样复振幅。网格的精细程度直接决定结果质量。我的习惯是取坐标范围在-3 mm到3 mm之间,采样点常用512×512或者1024×1024。坐标范围太小,光束边缘会被截断;采样点太少,光强环会出现不均匀的锯齿。
%% 基础参数设置 lambda = 632.8e-9; % 波长 632.8 nm w0 = 1e-3; % 束腰半径 1 mm l = 1; % 拓扑荷,想要几阶涡旋就改成几 z = 0; % 观察位置,在束腰平面 k = 2 * pi / lambda; % 波数 zR = pi * w0^2 / lambda; % 瑞利距离 %% 创建空间网格 N = 512; % 采样点数 L = 6e-3; % 空间范围:-3mm 到 3mm x = linspace(-L/2, L/2, N); y = linspace(-L/2, L/2, N); [X, Y] = meshgrid(x, y); [Phi, R] = cart2pol(X, Y); % 转极坐标,方便计算螺旋相位这里利用cart2pol把直角坐标转成极坐标是最省事的做法。后面计算拉盖尔高斯模式时,径向和方位角两个变量都有了。
3.2 第二步:计算拉盖尔-高斯模式的复振幅
p=0时的拉盖尔多项式是个常数,所以真实计算并不难。
%% 计算LG光束场分布(p=0) wz = w0 * sqrt(1 + (z/zR)^2); % 传播z距离后的光斑半径 Rz = z + zR^2 / z; % 波前曲率半径,仅在z≠0时需要 if z == 0 Rz = inf; % 束腰处曲率半径无穷大 end Gouy = atan(z / zR); % Gouy相位 % 归一化因子 C = sqrt(2 * factorial(0) / (pi * factorial(0 + abs(l)))) / wz; % 径向部分 radial = (sqrt(2) * R / wz).^abs(l) .* exp(-R.^2 / wz^2); % 螺旋相位部分 spiral = exp(-1i * l * Phi); % 完整复振幅 E = C * radial .* spiral .* exp(-1i * k * R.^2 / (2 * Rz)) * exp(1i * Gouy);这段代码里,radial多项式和spiral相乘的结果,决定了光束的空间形态。如果只想要一个纯涡旋相位(也叫螺旋相位板近似模型),而不关注高斯包络,可以直接用E = exp(-1i*l*Phi)配合一个均匀振幅圆孔。两种模型各有用途,LG光束更接近实验真实,螺旋相位模型更常用于快速相位分析。
光强图可以用abs(E).^2得到,相位图用angle(E)得到。注意angle返回的相位范围是([-\pi, \pi]),所以相位图是有锯齿的“包裹相位”,这是正常的。
3.3 第三步:可视化光强分布与螺旋相位
最直观的验证方式就是看强度和相位两张图。
%% 可视化光强分布 I = abs(E).^2; I = I / max(I(:)); % 归一化方便显示 figure('Name', 'Light Intensity'); imagesc(x*1e3, y*1e3, I); axis image; colormap('hot'); colorbar; xlabel('x (mm)'); ylabel('y (mm)'); title(['LG Beam Intensity, l = ', num2str(l)]); %% 可视化螺旋相位 phase = angle(E); figure('Name', 'Spiral Phase'); imagesc(x*1e3, y*1e3, phase); axis image; colormap('hsv'); % hsv色条最直观,因为它是循环色图 colorbar; xlabel('x (mm)'); ylabel('y (mm)'); title(['Spiral Phase, l = ', num2str(l)]);运行这段代码,强度图上应该出现一个完美的环形亮斑,中心是暗的;相位图上应该出现从(-\pi)到(\pi)的平滑螺旋过渡,绕中心一圈颜色恰好循环l次。如果这两个特征都出现了,说明涡旋光束已经“生成”成功。
这里有个重要的操作细节:相位图必须用hsv这类循环色图,不能用jet。jet是非循环色图,会把(-\pi)和(\pi)两端显示成差异很大的两种颜色,实际上这两端在物理上是连续的,会造成严重的视觉误导。这是我第一次做相位可视化时的教训,后来再也没用错。
3.4 第四步:传播演化与干涉条纹模拟
很多场合不仅要看束腰平面的光场,还要看传输一段距离后的样子。用角谱传播法(Angular Spectrum Method)可以轻松模拟菲涅尔衍射:
%% 角谱传播法模拟传播一段距离 distance = 0.5; % 传播距离,单位米 fx = (-N/2 : N/2-1) / L; [FX, FY] = meshgrid(fx, fx); H = exp(1i * k * distance) .* exp(-1i * pi * lambda * distance * (FX.^2 + FY.^2)); E_prop = ifft2(fft2(E) .* ifftshift(H)); I_prop = abs(E_prop).^2; I_prop = I_prop / max(I_prop(:)); figure('Name', 'Propagated Intensity'); imagesc(x*1e3, y*1e3, I_prop); axis image; colormap('hot'); colorbar; xlabel('x (mm)'); ylabel('y (mm)'); title(['Propagated Intensity, z = ', num2str(distance), ' m']);传播后涡旋光束的环会扩大,因为衍射效应,这是正常的。理科学生初学时会担心光强分布变了,是不是算错了,其实只要暗洞还存在、环结构还完整,就说明涡旋特性保持了。
干涉图样的模拟也很关键。让涡旋光束和一束平面波或者高斯光束干涉,赛道条纹会出现分叉,分叉数目恰好等于拓扑荷绝对值。这就是实验上测量OAM最常用也最直观的手段之一。
%% 与高斯参考光干涉 E_ref = exp(-R.^2 / w0^2); % 简单高斯参考光 I_interf = abs(E + E_ref).^2; I_interf = I_interf / max(I_interf(:)); figure('Name', 'Interference Pattern'); imagesc(x*1e3, y*1e3, I_interf); axis image; colormap('gray'); colorbar; xlabel('x (mm)'); ylabel('y (mm)'); title('Interference with Gaussian Beam');干涉图中你会看到梳状条纹在中心处分叉成两条或者更多,分叉数就是拓扑荷的数值。这个视觉特征很适合用来口头讲解OAM拓扑荷是什么,我很多次组会汇报都用这一张图,效果比纯讲公式好得多。
3.5 第五步:高阶涡旋拓扑荷的参数扫描与保存
我通常会跑一个批量仿真,把l从1到5各算一遍并保存结果:
%% 批量模拟不同拓扑荷 for l_test = 1:5 spiral_l = exp(-1i * l_test * Phi); radial_l = (sqrt(2) * R / wz).^abs(l_test) .* exp(-R.^2 / wz^2); E_l = C * radial_l .* spiral_l; I_l = abs(E_l).^2; I_l = I_l / max(I_l(:)); figure; imagesc(x*1e3, y*1e3, I_l); axis image; colormap('hot'); title(['Intensity, l = ', num2str(l_test)]); saveas(gcf, ['LG_l', num2str(l_test), '_intensity.png']); end从l=1到l=5,最明显的变化是暗洞直径逐渐增大,环越来越宽。这个趋势也与理论预期一致:拓扑荷越大,离心力效应越强,光强分布向外扩展。
如果要进一步验证OAM的物理意义,可以计算光场的能量通量角分布,或者做模式分解分析。不过在入门阶段,强度、相位、干涉条纹这三个特征已经足够说明涡旋光束的产生和性质了。
4. 涡旋光束仿真的常见问题与排错经验
4.1 相位图螺旋方向不对或者颜色混乱
很多人第一次画相位图,看到的不是平滑的螺旋,而是一堆杂色,或者螺旋方向跟预期相反。最常见的原因有两个:
- 色图用错。相位图务必使用循环色图
hsv。非循环色图会让(-\pi)到(\pi)看起来像两个极端,整张图出现伪边界。 - 方位角定义方向。
cart2pol返回的角度范围是([-\pi, \pi]),螺旋相位(\exp(-il\phi))的旋转方向是确定的。如果发现螺旋方向跟论文里的相反,把l取负号即可,这没有物理差别,l的符号只代表手性,不代表拓扑荷绝对值。
我发现,很多人排除错误时急着改算法,其实先确认可视化参数往往就能解决大半问题。
4.2 光强环不圆,出现明显的网格痕迹或马赛克
这个问题一般出在采样点不足或者网格范围太小。N=128时环周围可能明显出现锯齿感,N=512之后基本平滑。如果环的上半部分被截平,那就是L太小,光束边缘被计算域的边界“切”到了。把L增大到束腰半径的4到6倍,通常就安全了。
另外提醒一点,当拓扑荷很大(比如l>10)时,环的半径随l缓慢增大,需要更大的计算域和更高的采样密度,否则结果会失真。这不是算法问题,是离散采样带来的必然约束。
4.3 传播模拟结果发散或者强度分布出现环绕伪影
用角谱传播法时,如果传播距离很大,或者网格频率范围设置不对,会出现严重的边缘反射伪影。经典的表现是:图像边缘出现一圈一圈的亮纹。
解决手段是把计算域扩大,并在边缘加一个吸收边界(比如高斯窗函数)。还有一个小技巧:传播距离比较长时,需要检查频域网格分辨率是否足够,频率分辨率 (\Delta f = 1/L) 决定了衍射传播的准确性,L太小会导致远距离传播的严重失真。
我在实际项目里,往往先跑小距离(0.1 m级别)验证模型正确,再逐步加传播距离,这样出问题时比较容易定位是参数问题还是模型问题。
4.4 OAM电荷数无法从干涉条纹中直接读出
干涉条纹分叉数确实等于拓扑荷数值,但前提是参考光质量够好。参考光如果是球面波,条纹间距会不均匀;如果参考光带倾斜角,叠加后条纹会呈梳状偏转,分叉位置会移动。
最简单的调整:保持涡旋光轴和参考光轴一致,并让参考光用准直高斯光束。如果用了倾斜参考光,就需要通过傅里叶变换提取空间载波,做相位解包裹再读拓扑荷,步骤复杂许多。入门阶段直接让它们同轴干涉就好。
4.5 单精度与双精度误差导致的仿真不稳定
MATLAB默认是双精度,但在循环体内反复迭代计算时,如果手动转成单精度以减少内存,相位累加误差有可能在传播几步之后就让涡旋结构“塌陷”。我的建议是初始化时就保持双精度,不要为了性能提前降精度。光学仿真不像深度学习,矩阵规模通常可控,双精度完全跑得动。
5. 从仿真走向应用:设计时容易忽视的细节
当涡旋光束仿真做得比较熟练之后,可以开始思考怎样把这套模型用到更真实的问题里。我自己总结了一些仿真本身之外,但在项目评估里绕不开的细节。
首先,涡旋光束对系统的对准误差极其敏感。仿真里坐标系是完美对准的,但实验里光束轴向稍有偏移,OAM谱就会展宽,能量从目标模态漏到相邻模态。评估一个涡旋光通信系统,不只要看理想情况下的信道容量,还要看模态串扰。仿真时可以人为加一个横向偏移、角向倾斜、湍流随机相位屏,看看接收端的模态纯度下降到多少。这个做法在很多项目申报和论文里都是很有说服力的数据。
其次,产生涡旋光束的常见手段包括螺旋相位板、空间光调制器、Q-plate、光纤模式转换等。仿真时,很多人习惯直接用理想螺旋相位(\exp(-il\phi))去生成涡旋光束,这对应着螺旋相位板的近似模型。但实际用空间光调制器时,因为像素化离散相位台阶,会产生少量高阶OAM分量。模型的精度取舍,要看你关注的是远场强度分布,还是严格的OAM模态纯度。我见过一个项目规划,仿真里用了理想模型声称99%纯度,实际系统连85%都勉强,差别就出在相位离散化上。
另外,OAM复用通信是现在比较热的方向。仿真里用两个不同拓扑荷的涡旋光束同轴合束,接收端通过匹配滤波区分,这个流程本身不难。难的是评估在大气湍流或者光纤弯曲扰动下的性能衰退。我的建议是先把理想情况下串扰矩阵算清楚,再逐级加入扰动。把一条路走通,理解每个环节损耗从哪里来,比直接搭一套完整系统更有收获。
如果要做更进阶的探索,可以试试非整数拓扑荷光束、涡旋光束的聚焦特性、涡旋光束在散射介质中的传输等方向。每一条路都能从这次基础仿真出发扩展,代码框架是通用的。
6. 自查清单:仿真结果是否可信
前面写了这么多,最后给一个自查清单,跑完仿真之后,可以在几分钟内验证结果是否合理:
| 检查项 | 合格标准 |
|---|---|
| 光强分布 | 中心暗洞,环形亮斑,形态对称 |
| 相位分布 | hsv色图下螺旋平滑,颜色循环次数等于l |
| 干涉条纹 | 与高斯光干涉后条纹分叉数等于|l| |
| 传播演化 | 传输后环半径增大,涡旋结构保持 |
| 拓扑荷扫描 | l增大时暗洞半径单调增大 |
| 计算域 | 边缘无截断,光强在边界处充分衰减 |
| 色图选择 | 相位图用循环色图,光强图用hot或gray均可 |
这套清单也是我给组里新同学整理的第一份材料。照着这个流程走一遍,涡旋光束的基础概念、仿真技术、结果分析,基本就能盘顺了。
在实际操作中,我最深的体会是:学涡旋光束这一块,不要急着背公式,也不要急着上复杂光路。先花一个下午,把这套MATLAB仿真跑通,强度、相位、干涉、传播四张图都在眼前了,很多抽象概念会瞬间落地。后面再看文献里的OAM复用、涡旋光镊这些应用,你会有一种“原来就是这个东西在起作用”的感觉。这份笔记能帮你把这个过程缩到最短。