
简介本资源是一套面向光学仿真初学者与研究生的涡旋光束MATLAB建模实践包聚焦于利用超表面调控相位生成携带轨道角动量OAM的涡旋光束解决传统实验中难以灵活调控拓扑荷、实时观测相位结构等实际问题。压缩包共10个文件含9个MATLAB源码.m与1份说明文档.docx其中源码覆盖螺旋相位面构建、超表面相位响应模拟、二维傅里叶传播计算fft2/ifft2、强度/相位可视化等核心环节文档则系统梳理了涡旋光物理模型、l值与OAM关系、超表面相位调制原理及代码运行逻辑。资源仅18KB轻量易用所有脚本均基于基础MATLAB函数编写无需额外工具箱适合快速复现与二次开发。已有1761人学习下载读者可直接运行获得不同拓扑荷l±1,±2,…下的涡旋光强度图、径向相位分布及衍射场演化结果是理解相位工程、OAM光通信与超表面设计的实用入门材料。1. 项目概述从理论到代码手把手实现涡旋光束最近在光学和光通信领域涡旋光束Optical Vortex Beam的热度一直不减。无论是用于高容量光通信、光学微操控还是量子信息处理这种携带轨道角动量OAM的特殊光束都展现出了独特的魅力。很多朋友尤其是光学工程、物理相关专业的学生和研究者都希望能亲手用MATLAB模拟出这种神奇的光场但往往卡在理论和代码实现的衔接上。网上的资料要么过于理论化要么代码片段零散缺乏从原理到完整可视化的一站式指南。今天我就结合自己多年在计算光学和MATLAB仿真方面的经验带大家彻底搞懂涡旋光束的MATLAB生成。我们不只停留在“画出个图”更要深入理解每一个公式背后的物理意义以及每一行代码所对应的光场操作。你会发现抛开复杂的数学外壳其核心思想非常直观。通过本文你将能独立编写代码生成任意拓扑荷数、任意束腰半径的拉盖尔-高斯LG涡旋光束并清晰地观察其相位奇点和“甜甜圈”状的光强分布。2. 涡旋光束核心原理与数学模型拆解在动手写代码之前我们必须先弄清楚我们要模拟的到底是什么。涡旋光束最核心的特征是相位奇点和携带轨道角动量。2.1 相位奇点与轨道角动量想象一下水流中的漩涡中心是一个速度为零的点水流围绕这个点旋转。涡旋光束的光场与之类似在光束传播轴的中心光波的相位是未定义的奇点光强为零。而围绕这个中心光场的等相位面波前呈现螺旋状结构就像旋梯一样。这种螺旋状的波前结构意味着光子不仅具有沿着传播方向的线动量还具有绕轴旋转的角动量这就是轨道角动量。每个光子携带的OAM为lħ其中ħ是约化普朗克常数而l是一个整数称为拓扑荷数。l的正负决定了波前螺旋的旋转方向左旋或右旋l的绝对值大小则决定了相位在绕轴一周2π内的变化周期数。l±1时相位变化2πl±2时相位变化4π以此类推。正是这个l参数为光通信中的模分复用提供了海量的独立信道资源。2.2 拉盖尔-高斯光束模型在实践和仿真中最常用也最容易实现的是拉盖尔-高斯光束。它是亥姆霍兹方程在傍轴近似下的一个解完美描述了在自由空间中传播的、携带OAM的光束。其复振幅在束腰处z0平面的表达式为U_p^l(r, φ, z0) A_0 * (sqrt(2)r/w0)^|l| * L_p^|l|(2r^2/w0^2) * exp(-r^2/w0^2) * exp(-ilφ)看起来复杂我们来逐一拆解r, φ: 观察点的极坐标径向距离和方位角。A_0: 振幅常数影响整体光强。w0: 束腰半径决定了光束的粗细。l:拓扑荷数即我们最关心的参数。它出现在两项中(sqrt(2)r/w0)^|l|这项决定了光束中心r0的光强必然为零形成中空的“甜甜圈”状光强分布。|l|越大中心暗斑的半径通常也越大。exp(-ilφ)这是产生螺旋相位的核心项。它使得复振幅的相位随方位角φ线性变化φ增加2π相位变化-l*2π。正是这项赋予了光束轨道角动量。L_p^|l|(…): 广义拉盖尔多项式其中p是径向指数。p0时最为常见此时光束在径向上只有一个亮环。p0时会出现多个同心亮环。为了入门清晰我们后续仿真将主要关注p0的情况。exp(-r^2/w0^2): 高斯包络项确保光束能量在横截面上是局域分布的不会无限扩展。注意exp(-ilφ)是复数指数形式。在MATLAB中生成网格后φ是一个矩阵对这个矩阵进行exp(-1i*l*φ)运算就能高效地生成整个平面的螺旋相位分布。这是代码实现的关键一步。理解了模型我们就知道MATLAB仿真的任务就是在x-y平面上生成离散网格对每个网格点(x,y)根据上述公式计算其复振幅U然后分别可视化其强度I |U|^2和相位angle(U)。3. MATLAB仿真环境准备与参数设计工欲善其事必先利其器。在开始编码前我们需要明确仿真的目标和设置合理的参数。3.1 仿真目标与思路我们的目标是生成一幅图像清晰展示涡旋光束的两个核心特征光强分布图显示一个中心暗斑、周围亮环的“甜甜圈”形状。相位分布图显示围绕中心、呈螺旋状或同心圆状因表示方法而异的相位缠绕。思路非常直接定义仿真区域网格。计算每个网格点对应的(r, φ)。将(r, φ)和预设参数(l, p, w0)代入 LG 光束公式计算复振幅U。从U中提取强度I和相位Phi。使用imagesc,pcolor或surf等函数进行可视化。3.2 关键参数设置与物理意义在脚本开头我们会定义一组参数它们的取值直接影响仿真结果%% 参数设置 N 512; % 网格点数决定图像分辨率。推荐512或1024兼顾速度和细节。 L 0.01; % 仿真区域物理尺寸米即 [-L/2, L/2]。10mm对于可见光尺度是合理的。 lambda 632.8e-9; % 波长米这里选用常见的He-Ne激光波长632.8nm。 w0 0.001; % 束腰半径米1mm。它应与仿真区域尺寸L协调。w0 L但也不能太小导致特征看不清。 l 3; % 拓扑荷数可正可负整数。这是本次仿真的核心变量。 p 0; % 径向指数先设为0生成单环光束。网格点数N并非越大越好。N越大计算越慢内存消耗越大。对于初步观察512x512的网格已经能提供非常平滑的图像。关键在于采样定理一个相位周期2π/|l|内至少需要2个采样点才能避免混叠。我们的网格间距dx L/N应满足dx (波长/2)对于空间频率是更宽松的经验准则对于相位变化只要l不是极大如50512网格通常足够。束腰半径w0这是光束的“粗细”参数。w0过小高斯包络衰减太快亮环会很细很锐利w0过大高斯包络衰减慢亮环会扩散中心暗斑对比度降低。通常设置为L/5到L/10之间比较合适能确保光束特征完整呈现在视场中。拓扑荷数l这是最重要的探索变量。你可以尝试l 1, 2, 3, -1, 5等观察光强环半径如何随|l|增大而增大以及相位图的变化。实操心得在调试阶段可以先将N设为256或128来快速验证代码逻辑和参数效果待结果满意后再提高分辨率进行最终出图这能节省大量等待时间。4. 核心代码实现与分步详解下面我们进入核心环节一步步构建仿真代码。我将对每一段代码进行详细注释说明其物理和编程含义。4.1 生成计算网格与坐标转换%% 生成计算网格 % 在实空间创建一维坐标轴 x linspace(-L/2, L/2, N); y linspace(-L/2, L/2, N); % 生成二维网格矩阵 [X, Y] [X, Y] meshgrid(x, y); % 将直角坐标 (X, Y) 转换为极坐标 (R, PHI) % R: 网格上每点到原点的距离 R sqrt(X.^2 Y.^2); % PHI: 网格上每点的方位角范围 [-pi, pi]使用 atan2 函数 PHI atan2(Y, X); % atan2(Y,X) 返回的是从正X轴逆时针旋转到点(X,Y)的角度linspace创建了从-L/2到L/2的N个等间距点模拟我们的观测平面。meshgrid是生成二维网格的关键函数它从一维向量x和y生成两个矩阵X和Y。X的每一行都是x的副本Y的每一列都是y的副本。这样X(i,j)和Y(i,j)就唯一确定了平面上第i行、第j列点的坐标。atan2(Y, X)是计算四象限反正切的函数它返回的角度值范围在(-π, π]之间完美符合方位角的定义。这是计算φ的标准且安全的方法避免了使用atan(Y/X)时对象限的判断错误。4.2 计算拉盖尔-高斯光束复振幅这是整个仿真的核心计算部分。我们假设光束在束腰位置z0且径向指数p0。当p0时广义拉盖尔多项式L_0^|l|(x) 1公式得以简化。%% 计算拉盖尔-高斯光束复振幅 (p0 情况) % 振幅部分 (包含高斯包络和径向因子) amplitude (sqrt(2)*R/w0).^abs(l) .* exp(-R.^2 / w0^2); % 注意这里省略了广义拉盖尔多项式项因为 p0 时其为常数1。 % 如果 p0需要调用 laguerreL(p, abs(l), 2*R.^2/w0^2) 函数。 % 相位部分 (核心螺旋相位因子) phase_factor exp(-1i * l * PHI); % 1i 是MATLAB中的虚数单位 % 合成复振幅 U % 乘以一个常数 A0 用于调整显示亮度这里设为1。 U amplitude .* phase_factor;(sqrt(2)*R/w0).^abs(l)计算径向因子。注意这里用了.^点乘幂因为R是一个矩阵我们需要对每个元素进行幂运算。abs(l)确保了即使l为负这项也是非负的这符合物理事实光强与l的符号无关。exp(-R.^2 / w0^2)高斯包络项。同样使用.^和./。exp(-1i * l * PHI)灵魂所在。-1i*l*PHI计算了每个网格点因螺旋相位产生的相位延迟。exp函数将其转化为复平面上的单位圆旋转。l决定了旋转的速度和方向。l3意味着方位角φ每增加2π相位增加-6π等价于-3*2π。U amplitude .* phase_factor将振幅和相位因子逐元素相乘.*得到最终的复振幅分布U。它是一个复数矩阵。4.3 提取强度与相位并可视化得到复振幅U后我们需要从中提取可观测的物理量进行绘图。%% 提取强度与相位 I abs(U).^2; % 光强正比于复振幅模的平方 Phi angle(U); % 相位使用 angle 函数提取复数的相位角范围 [-pi, pi] %% 可视化结果 figure(Position, [100, 100, 1200, 500]); % 设置一个宽幅图窗 % 子图1光强分布 subplot(1, 2, 1); imagesc(x*1e3, y*1e3, I); % 显示图像坐标转换为毫米(mm)更直观 axis square; % 使坐标轴比例相等 xlabel(x (mm)); ylabel(y (mm)); title([涡旋光强分布 (l , num2str(l), , p , num2str(p), )]); colorbar; colormap(hot); % 使用‘hot’色图更符合光强的视觉习惯 % 子图2相位分布 subplot(1, 2, 2); imagesc(x*1e3, y*1e3, Phi); axis square; xlabel(x (mm)); ylabel(y (mm)); title([涡旋相位分布 (l , num2str(l), )]); colorbar; colormap(hsv); % 使用‘hsv’色图相位在[-π, π]循环时颜色也循环非常直观 caxis([-pi, pi]); % 固定相位显示范围确保颜色与相位值正确对应abs(U).^2计算光强。abs取模.^2平方。angle(U)计算相位。这个函数返回复数U的相位角辐角范围在(-π, π]之间。对于涡旋光束在中心奇点处相位未定义angle函数会返回一个不确定的值但这不影响我们观察整体的螺旋结构。imagesc用于显示矩阵数据并自动缩放颜色。比imshow更适合科学数据可视化因为它会尊重我们设定的坐标轴x和y。axis square确保显示区域是正方形的这样光束的圆形对称性不会被扭曲。colormap(hsv)与caxis([-pi, pi])这是可视化相位图的黄金组合。HSV色相环是循环的正好对应相位从-π或0到π或2π的周期性变化。caxis手动设置颜色映射的数据范围确保-π和π映射到同一种颜色例如深红色从而清晰显示出相位的2π跳变线。当l1时你会看到一条从中心向外辐射的跳变线l2时会有两条以此类推。这直接印证了相位缠绕l次的概念。运行上述完整代码你将得到类似下图的仿真结果。左图是光强分布中心暗外围一个亮环右图是相位分布呈现出l条颜色跳变线本例l3。5. 仿真结果深度分析与参数探索得到初始结果只是第一步更重要的是学会分析和解读它并通过改变参数来加深理解。5.1 结果解读光强与相位图的意义以l3, p0的结果为例光强图中心是一个完美的暗斑因为r0时径向因子(r)^|l|为零。周围是一个亮环其峰值位置大致在r ≈ w0 * sqrt(|l|/2)处对于p0的 LG 光束。|l|越大这个亮环的半径也越大。整个图案呈圆对称这是高斯包络和 LG 光束本征模式决定的。相位图使用hsv色图后你会看到颜色沿方位角连续变化。仔细看有3条明显的、从中心向外辐射的“裂缝”那是相位从π跳变到-π或反之的边界线即2π相位不连续线。线的数量等于拓扑荷数l的绝对值。这正是螺旋相位的直观体现绕中心一周相位变化了l * 2π因此必须经历|l|次2π的跳变才能衔接。5.2 关键参数影响实验现在你可以像做实验一样修改参数并重新运行脚本观察变化改变拓扑荷数ll 1光强环最小最亮相位图有一条跳变线。l 5光强环明显变大、变宽且峰值光强可能降低因为能量分散到更大的环上相位图有五条跳变线。l -2光强图与l2完全相同因为依赖|l|但相位图的螺旋旋转方向相反跳变线旋转方向不同。这体现了OAM的手性。改变束腰半径w0将w0从0.001减小到0.00050.5mm光强环变得更细、更锐利中心暗斑区域相对变小。将w0增大到0.0022mm光强环扩散、变宽与背景对比度下降中心暗斑区域变大。如果w0接近L/2光束特征可能会触及仿真边界导致图像边缘被截断。改变径向指数p进阶要模拟p0的情况需要计算广义拉盖尔多项式。MATLAB 2014b及以上版本内置了laguerreL(n, k, x)函数。修改振幅计算部分% 假设 p1 p 1; L_poly laguerreL(p, abs(l), 2*R.^2/w0^2); % 计算拉盖尔多项式 amplitude (sqrt(2)*R/w0).^abs(l) .* L_poly .* exp(-R.^2 / w0^2);当p1时你会看到光强图出现两个亮环。p的物理意义就是径向的节线光强为零的圆环数量。5.3 传播演化仿真拓展思路上述代码模拟的是束腰处的光场。一个更完整的仿真可以观察光束在自由空间中的传播。这需要用到角谱传播理论或菲涅尔衍射积分。核心思路是计算束腰处光场U0的二维傅里叶变换U0_ft得到角谱。乘以传递函数H exp(1i*2*pi*z/lambda * sqrt(1 - (lambda*fx).^2 - (lambda*fy).^2))其中(fx, fy)是空间频率坐标z是传播距离。做逆傅里叶变换得到传播后z处的光场Uz。在一个循环中计算不同z距离的光场并观察光强和相位分布的变化如环半径扩大、相位结构演化等。这可以作为一个非常有价值的课后练习。6. 常见问题、调试技巧与代码优化在实际操作中你可能会遇到一些问题。这里我总结了一些常见坑点和解决技巧。6.1 常见问题排查表问题现象可能原因解决方案光强图中心不是暗斑而是亮斑1.l被设为0。2. 径向因子(sqrt(2)*R/w0).^abs(l)计算错误如忘了取绝对值。3. 网格中心点R(0,0)在计算时因浮点误差不为零。1. 检查并设置l为非零整数。2. 检查代码确保使用了.^和abs(l)。3. 这是正常现象中心可能有一个极小的亮像素。可通过imagesc后的axis image或提高N来改善观感。相位图全是一个颜色没有螺旋结构1. 相位因子exp(-1i*l*PHI)计算错误可能l0。2. 使用了atan而不是atan2计算PHI导致象限错误。3. 相位显示范围caxis设置不当。1. 检查l值。2.务必使用PHI atan2(Y, X);。3. 确保使用了colormap(hsv)和caxis([-pi, pi])。图像看起来有“锯齿”或不够平滑网格分辨率N太低采样不足。增加N如到1024。注意计算时间会显著增加。光束特征被截断只看到一部分环束腰半径w0相对于仿真尺寸L太大。增大L或减小w0确保w0在L/10到L/5量级。运行速度很慢N设置过大如2048以上。调试时用较小的N。对于最终出图512或1024通常足够。考虑将计算量大的部分如R.^abs(l)进行向量化优化代码本身已是向量化形式效率很高。相位图中心区域颜色混乱中心奇点处R0相位无定义angle函数在该点附近计算不稳定。这是正常物理现象。可以通过对I设置一个阈值将光强极低的区域如I max(I(:))*1e-3的相位掩膜掉设为NaN再绘图能使图像更干净。6.2 代码优化与高级可视化技巧使用parfor循环对于单纯的网格计算MATLAB的矩阵运算向量化已经是最优方式远比任何循环包括parfor快。不要在这里使用parfor。parfor适用于相互独立的迭代任务而我们的网格计算是高度向量化的单条语句。内存优化当N很大时如N2048网格矩阵X, Y, R, PHI, U都会是2048x2048的双精度矩阵每个约33MB多个变量可能耗尽内存。计算完U后可以及时清除中间变量clear X Y R PHI amplitude phase_factor; % 保留 U, I, Phi 用于绘图更专业的可视化三维可视化使用surf(x, y, I)并加上shading interp和合适的灯光可以生成非常漂亮的三维光强曲面图。动态传播利用循环计算不同z位置的光场并用getframe和movie函数制作光束传播的动画直观展示衍射过程。干涉测量生成一个平面波参考光U_ref exp(1i*k*x)与涡旋光U干涉计算I_interf |U U_ref|.^2。你会看到典型的叉形干涉条纹这是实验上检测拓扑荷数l的经典方法。条纹分叉数等于|l|。生成报告级图片在论文或报告中图片质量很重要。可以使用exportgraphics或print函数以高DPI保存图片。figure(Position, [100,100,800,400], Color, w); % 白色背景 % ... 绘图代码 ... exportgraphics(gcf, vortex_beam_l3.png, Resolution, 300); % 保存为300DPI的PNG通过以上步骤你不仅能够生成涡旋光束的MATLAB仿真图更能深刻理解其背后的每一个参数和物理图景。这个仿真的框架非常牢固你可以在此基础上轻松地修改去模拟更复杂的情况如像散涡旋光、矢量涡旋光、或者通过衍射光学元件生成涡旋光。记住仿真的目的是为了理解和预测物理清晰的代码和正确的物理图像是关键。希望这份详细的指南能成为你探索涡旋光世界的一块坚实跳板。本文还有配套的精品资源点击获取