简介:面向光纤通信与光子学学习者的MATLAB仿真资源,聚焦LP11模式电场分布与光斑形态的可视化分析。LP11作为常见的双模传输模式,具有两个正交偏振态,理解其场分布对多模光纤性能评估与系统设计有直接帮助。压缩包共5个文件,含1个FIberiaLP11.m脚本和4张结果图,整体仅73KB,轻量且便于直接运行验证。脚本围绕光纤折射率参数定义、Maxwell方程求解、模式计算与绘图展开,可帮助读者理解LP11双模传输特性;4张图片直观呈现电场强度分布与模式光斑,既可用于快速复现,也便于对照代码检查仿真结果。已有1163人学习,说明这类模式仿真小工具具备一定参考热度。通过这份小包,读者既能快速得到LP11模式光斑图样,又能将脚本迁移到其他高阶模式的MATLAB仿真练习中,适合作为光纤模式入门或课堂演示的补充材料。
1. 从一张双瓣光斑开始
光纤端面亮着一个“两个半圆对扣”的光斑,第一反应往往是耦合没调好,或者端面切坏了。实际上这大概率是 LP11 模式:当光纤归一化频率 V 越过 2.4048 后,LP11 出现在纤芯里,电场强度分布不再是 LP01 那样的轴对称高斯形状,而是两个对置的高强度瓣。压缩包里那几张 untitled.jpg、4.jpg 拍的就是这个现象,FIBeriaLP11.m 则是复现它的 MATLAB 脚本。这篇内容沿着“V 数计算 → 特征方程求根 → 电场重构 → 光斑绘制”这条线走一遍,把 LP11 的电场分布、参数选择依据和工程上的坑说清楚。适合在光纤传感、光通信或激光器项目里被“奇怪光斑”卡住,想用 MATLAB 做光纤模式分析的工程师。
2. 弱导阶跃光纤里的 LP 模式判定:从 V 数到 LP11 截止
2.1 为什么仿真里只用 LP11 这个标签就够
光纤模式严格来说应分为精确矢量模,比如 HE11、TE01、TM01、HE21。但在折射率差很小(Δn/n₁ 通常在 1%~3%)的阶跃光纤里,纵向分量远小于横向分量,可以把电场按标量波动方程求解,解出来的模式称为线偏振模 LP(l, m)。LP11 并不是某一个精确矢量模,而是 TE01、TM01、HE21 三个矢量模在弱导近似下的一组简并:它们的传播常数非常接近,偏振与相位不同,合在一起就表现为一个具有二阶方位角对称性的标量场。
这个标签在工程仿真中特别有用。我们关心的不是模式内部到底是 TE 还是 HE,而是它的截止条件、光斑形状、有效折射率和耦合行为。LP 模式用两个整数索引:l 表示角向变化次数,m 表示径向峰值个数。LP11 就是角向变化一次、径向有一个极大值环的模式。
提示:涉及偏振敏感器件或保偏光纤时,LP 近似不够,需要回到矢量模式。但做模场直径估算、模式截止判断和光斑分析,LP 模型是性价比最高的起点。
2.2 归一化频率 V 决定光纤里能跑哪些模式
判断一根光纤支持哪些 LP 模式的依据是归一化频率:
V = (2πa/λ) × sqrt(n₁² − n₂²)
其中 a 是纤芯半径,n₁ 和 n₂ 分别是纤芯和包层的折射率,λ 是真空波长。工程上经常把前半部分写成分量形式,即 V = k₀a·NA,其中数值孔径 NA = sqrt(n₁² − n₂²)。
以一个典型少模光纤仿真参数为例:λ=1550 nm,a=4 μm,n₁=1.470,n₂=1.440。算出的 NA ≈ 0.295,k₀ = 2π/1.55e-6 ≈ 4.054e6 m⁻¹,于是 V ≈ 4.79。这个值很小,但已经比“单模门槛”高不少。
不同模式有各自的截止 V 值,低于这个值该模式不存在。LP11 的截止由 J₀(Vc) = 0 决定,最低解 Vc = 2.40483,这也是工程上“单模光纤 V 值必须低于 2.4048”这一规则的来源。
| 模式 | l 与 m | 截止方程 | 截止 V 值 | 光斑特征 |
|---|---|---|---|---|
| LP01 | l=0, m=1 | 无截止(极限 V→0 才消失) | 0 | 中心圆斑,近高斯 |
| LP11 | l=1, m=1 | J₀(Vc)=0 | 2.40483 | 双瓣 |
| LP21 | l=2, m=1 | J₁(Vc)=0 | 3.83171 | 四瓣 |
| LP02 | l=0, m=2 | J₀(Vc)=0 的第二个根 | 3.83171 | 中心峰 + 外环 |
注意 LP21 和 LP02 的截止 V 值相同,都是 3.83171。所以在 V ≈ 4.79 的实例里,理论上可传播的模式不止 LP11,还有 LP21 和 LP02。实验光斑如果明显只有两个瓣,说明更高阶模式激励效率很低,或者测量系统不具备分辨四瓣的对比度。
2.3 LP11 截止附近的渐近行为
LP 模式刚过截止时,包层中的归一化衰减常数 W = sqrt(V² − U²) 很小,模式场在包层里延伸得很远,能量有相当一部分“漏”在纤芯之外。这时如果仿真网格半径只取 2~3 倍纤芯半径,光斑会被人为截断,画出来明显失真。
我的做法是:当 W 小于 1 时,把径向网格范围拉到至少 6 倍纤芯半径。反之,当 V 远大于截止值(比如 V > 3.5),W 变大,场在包层内衰减快,取 3 倍半径就足够。这个取舍直接决定后面重建的电场分布是否可靠,调参时最先检查的就是边界半径与 W 的匹配关系。
3. 从圆柱 Helmholtz 方程到 MATLAB 特征方程
3.1 柱坐标下的分离变量解
标量波动方程在柱坐标中分离变量,设场分布为 ψ(r, φ) = R(r)·Φ(φ),其中 Φ(φ) 满足 cos(lφ) 或 sin(lφ)。径向方程是贝塞尔方程,芯区要求原点有限,解取第一类贝塞尔函数 J_l(U·r/a);包层要求无穷远处衰减,取第二类修正贝塞尔函数 K_l(W·r/a)。U 和 W 的关系是:
W² = V² − U²
在 r = a 处匹配 R 与 dR/dr,得到 LP(l,m) 模式的特征方程:
U·J_{l−1}(U) / J_l(U) = −W·K_{l−1}(W) / K_l(W)
对 LP11,l=1,代入后写成便于数值求解的形式:
U·J₀(U) / J₁(U) + W·K₀(W) / K₁(W) = 0
3.2 特征方程求解:为什么不能直接 fzero
很多初学者在 MATLAB 里写 fzero 找一个初始猜测值,很容易踩坑:函数在贝塞尔函数零点附近是奇异的,J₁(U) 在 U=3.8317、7.0156 等处过零,直接猜一个区间端点会返回 Inf 或 NaN。另一个坑是区间右侧接近 V 时,W 趋向 0,K₀/K₁ 发散,函数行为同样不稳定。
稳妥的方式是先做粗网格扫描,找到符号变化区间,再把区间送入 fzero。下面这段代码是 FIBeriaLP11.m 里求解部分的重写版本,可以复用于任意 l 阶模式:
% 光纤参数 lambda = 1550e-9; % 波长,单位 m a = 4e-6; % 纤芯半径,单位 m n1 = 1.470; n2 = 1.440; k0 = 2*pi/lambda; NA = sqrt(n1^2 - n2^2); V = k0 * a * NA; % 归一化频率 % 定义 LP11 特征方程残差 l = 1; f = @(u) u .* besselj(l-1, u) ./ besselj(l, u) + ... sqrt(V^2 - u.^2) .* besselk(l-1, sqrt(V^2-u.^2)) ./ besselk(l, sqrt(V^2-u.^2)); % 粗扫描:从截止值到略小于 V 的范围 u_scan = linspace(2.405, V*0.999, 200); fval = f(u_scan); roots_uv = []; for i = 1:numel(u_scan)-1 if ~isfinite(fval(i)) || ~isfinite(fval(i+1)) continue; end if fval(i)*fval(i+1) < 0 try ur = fzero(f, [u_scan(i), u_scan(i+1)]); roots_uv(end+1) = ur; catch % 端点跨越极点时会失败,直接跳过 end end end % 只保留 LP11 的最低阶根 U = min(roots_uv); W = sqrt(V^2 - U^2); fprintf('V=%.3f, U=%.4f, W=%.4f\n', V, U, W);这段代码先算 V 数,再用符号变化法定位特征根。fzero 接收的是一个闭区间,但前提是区间两端的 fval 符号相反且区间内没有穿过无穷大极点;前面的 for 循环实际上做了两层筛选:先判有限值,再判符号变化,最后用 fzero 收敛。扫描点取 200 个,足够覆盖一阶根;如果一次要算多个高阶根,建议扫描点数提到 1000,并让 fzero 收敛后继续在下一个符号变化区间寻找,而不是提前 break。
对于上述参数,V≈4.79,扫描得到 LP11 对应的 U≈3.19,W≈3.57。可以用一个简单的关系验证根是否正确:U 必须大于截止值 2.40483 且小于 3.83171;W² 必须为正;同时 U 不能落在 J₁ 的零点 3.8317 上,否则残差函数会正负跳变且不存在真正的根。
3.3 验证特征方程根与贝塞尔函数行为
拿到 U 和 W 后,把数值代回原方程再算一次残差,应该接近机器精度级别:
residual = U*besselj(0,U)/besselj(1,U) + W*besselk(0,W)/besselk(1,W); disp(residual);如果残差大于 1e-6,说明 fzero 收敛到错误位置,通常是因为扫描区间跨过了极点。这时候缩小扫描范围,或者改用optimset('TolX',1e-12)提高收敛精度。另外可以检查 U 对应的 besselj(1, U) 是否远离 0,如果接近零,则当前根是伪根。
这段步骤的价值在于:后续所有电场分布都建立在 U、W 的基础上,根只要差 0.01,包层衰减就会明显变化,光斑边界会失真。根校验是每轮调参必做的第一件事。
4. FIBeriaLP11.m 中从模式场到光斑的可视化管线
4.1 用网格数据重构 LP11 电场
有了 U 和 W,径向场可以写成分段函数:
R(r) = J₁(U·r/a),r ≤ a
R(r) = [J₁(U)/K₁(W)]·K₁(W·r/a),r > a
方位角部分有两种简并态:cos(φ) 和 sin(φ)。matlab 里面用 meshgrid 生成二维坐标,然后按 r 和 φ 重建场。下面这段代码直接对应压缩包内脚本的电场构造部分:
N = 512; x = linspace(-12e-6, 12e-6, N); y = x; [X, Y] = meshgrid(x, y); [Phi, R] = cart2pol(X, Y); R(R < 1e-12) = 1e-12; % 避免原点奇异 % 分段径向场 Rfield = zeros(size(R)); core_mask = R <= a; clad_mask = R > a; Rfield(core_mask) = besselj(1, U * R(core_mask) / a); Rfield(clad_mask) = (besselj(1,U) / besselk(1,W)) * ... besselk(1, W * R(clad_mask) / a); % 两个简并的方位角形态 psi_cos = Rfield .* cos(Phi); psi_sin = Rfield .* sin(Phi); % 任意线性组合仍然是 LP11 theta = 0; % 相位旋转 psi = psi_cos * cos(theta) + psi_sin * sin(theta);代码里 N 取 512,是为了让每个强度瓣至少有几十个像素的平滑过渡。cart2pol 一次性给出径向和角度,比手动 atan2 更简洁,而且返回的 Phi 范围是 [-π, π],与 cos/sin 的周期性自动匹配。归一化系数可以放在最后统一处理,习惯上把最大幅度归一为 1,方便比较强度。
theta 参数的意义值得多说一句:LP11 的简并意味着光斑方向可以在实验里旋转。取 theta=0 时双瓣沿水平方向,theta=π/2 时沿垂直方向。实际光纤端面照片里,双瓣出现在哪个方向取决于入射激励条件,与模式本身无关。仿真时通过调整 theta 可以复现任意角度下的光斑。
4.2 电场强度与光斑的直接关系
对于标量近似,电场可以认为只沿一个横向方向偏振,例如 E ∝ ψ·x̂。实验中的光斑图实际上是强度分布 I = |E|²,而不是电场本身。对 LP11,取 ψ=psi_cos,则强度为:
I(r,φ) = R²(r) · cos²(φ)
这个式子清楚解释了双瓣的成因:cos² 在 φ=0 和 φ=π 处有峰值,在 φ=π/2 和 φ=-π/2 处为零。如果把两个简并态等幅叠加,理论上会得到环形强度,但单一简并态激励在实验中更常见,所以“双瓣”才是 LP11 光斑的典型标志。
绘制图像时建议同时看三个面板:左侧强度,中间电场实部,右侧振幅包络,这样才能判断仿真到底有没有跑对方向:
figure('Color','w'); subplot(1,3,1); imagesc(x*1e6, y*1e6, abs(psi).^2); axis image; colormap(turbo); colorbar; xlabel('\mum'); ylabel('\mum'); title('LP11 Intensity'); subplot(1,3,2); imagesc(x*1e6, y*1e6, real(psi)); axis image; colormap(turbo); colorbar; title('Re(E)'); subplot(1,3,3); imagesc(x*1e6, y*1e6, Rfield); axis image; colormap(turbo); colorbar; title('Radial envelope');强度图里双瓣的最大值处对应电场实部的同号区域;电场实部会有正负交替,这正是 cos(φ) 的体现。径向包络图应该只显示圆对称亮环,因为 R(r) 本身与角度无关。
4.3 导出符合出版要求的光斑图
写成期刊或报告用的图,不能直接用print -dpng应付。推荐exportgraphics,它可以裁剪白边,可按像素密度导出 tiff 或 jpg。untitled.jpg、4.jpg 这类从实验系统抓的图通常带有标尺和注释,仿真图对比时要保持相同的比例尺,否则“双瓣间距看起来不一样”会被误认为参数偏差。
exportgraphics(gcf, 'LP11_spot.png', 'Resolution', 300);参数说明:Resolution设置为 300,对应印刷需要的 300 dpi;gcf指当前图窗,若导出单张图请先确保子图采用固定纵横比。导出的 png 可以直接放进对比图里和实测光斑并排观察,验证瓣夹角与消光比是否在同一量级。
5. 参数、边界与排错:仿真与实际光斑对不上时看哪里
5.1 仿真参数对照表
参数设定是整个仿真里最容易被高估的部分。下面这张表是复现不同实验光斑时常用的调整依据:
| 参数 | 影响对象 | 调大后表现 | 调小后表现 |
|---|---|---|---|
| V 数 | 模式数量与 W 值 | 高阶模式增多,双瓣变形 | 低于 2.4048 时 LP11 消失 |
| 纤芯半径 a | 模场直径 | 光斑整体变大 | 光斑变小,包层占比增加 |
| 折射率差 Δn | V 数、相位常数 | 模式更容易存在 | 截止压力增大 |
| 网格半径 | 包层场是否被截断 | 尾部干净,边界无伪影 | 光斑外沿出现方形截止环 |
| 网格点数 N | 强度轮廓平滑度 | 瓣边界清晰 | 瓣边缘锯齿,方向偏转 |
对应到一个真实的调参流程:如果看仿真双瓣角度与实验照片相差 90°,不需要改光纤参数,改 theta 到对应角度即可;如果实验里明明 V 大于 2.4048 却看不到双瓣,先检查激励条件,不能只靠光纤设计参数解释光斑形状。
5.2 根搜索失败与“假单模”问题
fzero 返回空数组或残差不收敛,绝大多数情况出在 V 值比截止值大不了多少。当 V=2.43 时,LP11 虽然存在,但 W 不到 0.4,K₁(W) 非常大,R 在包层里衰减极慢,径向网格到了 20 μm 还没收敛到零。此时 fzero 的扫描区间如果上限取 V0.999,W 很小导致 K₀/K₁ 数值溢出。我的处理方式是将扫描上限定为 min(V-0.2, V0.95),牺牲一点右端范围但保证数值稳定。
另外一类常见 bug 是模式根索引串位。LP11 是 J₁ 的第一个有效根,但不是随便在残差函数图上看到的第一个过零点。J₁ 自身还有零点,扫描区间跨越这些零点时可能把多解混进来,“min(roots)”只取数值最小的根,如果粗扫描漏掉了真正的最小区间,就会意外保留高阶径向根。打印 U 值后做一次核对:LP11 的 U 应该局限在区间 (2.4048, 3.8317)。
5.3 光斑边界的伪影排除思路
用 imagesc 画强度图出现外方内圆、瓣外沿带矩形亮边,这是网格截断的典型特征,说明包层场在你设定的 x、y 范围边缘没有被截断到足够小的值。排错时不是单纯把范围拉大,而是看 Rfield 在 R=a 处与 R=max(x) 处的比值:如果边缘处振幅仍然超过中心峰值的 1%,就必须扩大范围。可以在 MATLAB 里快速查看一维曲线:
rline = linspace(0, max(x), 2000); Rr = besselj(1, U*rline/a); Rr(rline > a) = (besselj(1,U)/besselk(1,W)) * ... besselk(1, W*rline(rline>a)/a); semilogy(rline*1e6, abs(Rr)./max(abs(Rr)));坐标横轴正比于径向距离,纵轴取对数,可以看到包层尾部呈指数衰减。若衰减在 1e-3 水平之上,边界就应该扩大,否则后续计算模式重叠积分时误差会直接折进耦合效率。
6. 用模式重叠积分验证 LP11 光斑纯度
光纤模式仿真的落点通常不是画一张图,而是评估一段真实系统里激励了多少 LP11、它和 LP01 之间会发生多少串扰。正交性检验是这里成本最低、信息量最大的验证方法。
先构造二维网格上的两个模拟场:psi_01 用 J₀ 或高斯近似,psi_11 用前面算好的 psi_cos。两者的重叠积分定义为:
η = |∫∫ ψ_01* · ψ_11 dA|² / (∫∫ |ψ_01|² dA · ∫∫ |ψ_11|² dA)
理论值应为 0,因为不同 LP 模式在光纤横截面上正交。MATLAB 里实现这行代码:
S_cross = sum(sum(conj(psi01) .* psi11)); S01 = sum(sum(abs(psi01).^2)); S11 = sum(sum(abs(psi11).^2)); eta = abs(S_cross)^2 / (S01 * S11); fprintf('模式重叠因子 eta = %.3e\n', eta);eta 小于 1e-10 说明仿真网格与模式函数正确重建了正交关系;如果出现明显非零值,优先检查边界网格是否截断了 psi11 的包层尾部,因为截断破坏了函数内积的完备性。这个例子说明,用同一个脚本稍加扩展就能同时判断 LP01 与 LP11 的耦合上限,对模式复用链路设计有直接参考价值。
再进一步,可以计算 LP11 的核心功率占比,其定义为纤芯内功率与总功率之比:
P_ratio = ∫∫_core |psi|² dA / ∫∫_total |psi|² dA
当 V 刚过 2.4048 时这个占比很低,许多能量在包层里流动;当 V 增大到 4.8 后占比通常超过 90%。仿真中若发现 P_ratio 异常低,说明 U 根取错或者包层区域截断不够,直接回查第 3.2 节的求根过程。把这套流程固化到 FIBeriaLP11.m 里,以后再遇到光纤端面出现非圆光斑,就知道先算 V 数、找根、查正交性,再决定要不要怀疑实验中光纤本身出了问题。
本文还有配套的精品资源,点击获取