ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

涡旋光束MATLAB仿真入门:OAM拓扑荷与螺旋相位可视化实战

涡旋光束MATLAB仿真入门:OAM拓扑荷与螺旋相位可视化实战 涡旋光束这个方向我在读研那会儿就接触过当时只觉得相位图长得像漩涡挺好看。后来真正动手做仿真、搭光路才意识到拓扑荷、轨道角动量这些概念背后藏着完全不同于平面波的物理逻辑。这篇笔记就把我入门到实操的一些理解和坑系统梳理一遍主要的代码和参数也会给到方便直接复现。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 第二步计算拉盖尔-高斯模式的复振幅p0时的拉盖尔多项式是个常数所以真实计算并不难。%% 计算LG光束场分布p0 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从l1到l5最明显的变化是暗洞直径逐渐增大环越来越宽。这个趋势也与理论预期一致拓扑荷越大离心力效应越强光强分布向外扩展。如果要进一步验证OAM的物理意义可以计算光场的能量通量角分布或者做模式分解分析。不过在入门阶段强度、相位、干涉条纹这三个特征已经足够说明涡旋光束的产生和性质了。4. 涡旋光束仿真的常见问题与排错经验4.1 相位图螺旋方向不对或者颜色混乱很多人第一次画相位图看到的不是平滑的螺旋而是一堆杂色或者螺旋方向跟预期相反。最常见的原因有两个色图用错。相位图务必使用循环色图hsv。非循环色图会让(-\pi)到(\pi)看起来像两个极端整张图出现伪边界。方位角定义方向。cart2pol返回的角度范围是([-\pi, \pi])螺旋相位(\exp(-il\phi))的旋转方向是确定的。如果发现螺旋方向跟论文里的相反把l取负号即可这没有物理差别l的符号只代表手性不代表拓扑荷绝对值。我发现很多人排除错误时急着改算法其实先确认可视化参数往往就能解决大半问题。4.2 光强环不圆出现明显的网格痕迹或马赛克这个问题一般出在采样点不足或者网格范围太小。N128时环周围可能明显出现锯齿感N512之后基本平滑。如果环的上半部分被截平那就是L太小光束边缘被计算域的边界“切”到了。把L增大到束腰半径的4到6倍通常就安全了。另外提醒一点当拓扑荷很大比如l10时环的半径随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复用、涡旋光镊这些应用你会有一种“原来就是这个东西在起作用”的感觉。这份笔记能帮你把这个过程缩到最短。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进