长周期光纤光栅透射谱MATLAB仿真:从耦合模方程到传输矩阵实现
2026/9/3 3:19:50 网站建设 项目流程

简介:长周期光纤光栅(LPG)透射谱仿真MATLAB项目,面向光通信、光纤传感领域的研究者与初学者,帮助理解LPG模式耦合机理并快速掌握透射谱仿真方法。压缩包内共4个文件,包含3个M脚本和1份PDF说明文档:主程序负责整体仿真流程并输出透射谱,两个辅助函数分别计算芯层导模有效折射率与芯层折射率,PDF文档则涵盖理论背景、仿真步骤与结果解释。资源包仅289KB,轻量便携,已有2120人学习。通过调整光栅周期、纤芯直径、包层厚度、折射率差及光栅长度等参数,可直观观察透射谱峰值移动与衰减变化,进而优化LPG性能,为光纤通信滤波、传感器设计与环境响应研究提供高效低成本的仿真支撑。 做光纤传感实验的人,十有八九都会被长周期光纤光栅的透射谱震惊一次。我第一次拿到LPG的透射谱时,差点以为是实验台出了问题:宽谱光源进去,透射谱上莫名其妙出现一串深浅不一的损耗峰,跟FBG那种单峰、窄带、反射式的谱形完全是两回事。后来我把长周期光纤光栅透射谱的MATLAB仿真完整跑通,才真正明白每一根损耗峰背后对应着一个具体的包层模,也才理解了为什么这类光栅能做温度、应变、折射率传感,而且灵敏度能做到FBG的好几倍。这篇文章就把我从理论到代码的完整仿真思路整理出来,包括耦合模方程怎么落地成传输矩阵、有效折射率怎么求、以及我踩过的几个坑。

1. 我为什么劝你别用FBG的套路去理解LPG透射谱

1.1 周期差两个数量级,物理机制完全不同

先看最直观的区别。光纤布拉格光栅的栅格周期一般在0.5微米左右,而长周期光纤光栅的典型周期在100微米到1毫米之间。这一个数量级上的差异,决定了它们根本不是同一种工作机制。

FBG满足的是纤芯基模之间的反向耦合条件,也就是前向传输的基模被周期性折射率调制反射回后向基模,所以在反射谱上看到一个窄尖峰,透射谱上对应一个窄的凹陷。LPG则完全不同,它的周期足够长,满足的是纤芯基模与前向传输的包层模之间的相位匹配条件。光没有被反射回来,而是从纤芯"漏"进了包层,然后在包层-空气界面发生全反射继续向前传播,最终在末端损耗掉。反映在透射谱上,就是多个离散的损耗峰,每个峰对应一个不同阶数的包层模。

1.2 透射谱上为什么会有多个峰

FBG谱上通常只有一个主峰,高阶模式耦合一般比较弱。但LPG的透射谱上,你会看到四五个甚至十几个损耗峰,而且深度参差不齐。

这里的关键是:包层模不是只有一个,而是一族模式。阶数m越高,包层模的有效折射率越低,对应的谐振波长也就越短。相位匹配条件决定每个模式的谐振波长:

λ_res = (n_eff_core - n_eff_clad(m)) × Λ

其中n_eff_core是纤芯基模有效折射率,n_eff_clad(m)是第m阶包层模的有效折射率,Λ是光栅周期。由于m不同,n_eff_clad不同,谐振波长自然被“拉开”到了不同位置,形成一串峰。第一次仿真时看到一串谐振峰,不要觉得是数值振荡出了问题,那恰恰说明你的模型算对了。

1.3 仿真LPG比FBG难在哪

FBG的仿真,很多时候用一个简单的公式加一个高斯型的谱形就能应付。LPG不行,因为它必须处理“模式耦合”问题:

  • 你需要知道参与耦合的纤芯基模和各个包层模的有效折射率;
  • 你需要计算出它们之间的耦合系数;
  • 你需要用耦合模方程或传输矩阵法把“能量从纤芯逐步转移到包层”的过程数值化。

所以这篇文章选择的仿真路线很明确:先用三层阶跃折射率光纤模型求模式有效折射率,再用传输矩阵法计算透射谱。整个过程在MATLAB里只需要两个核心函数,我下面会拆开来讲。

2. 仿真前先算清楚:纤芯基模和包层模的有效折射率

2.1 三层波导结构与特征方程

要模拟一根真实的光纤,最常用的模型是三层阶跃折射率结构:纤芯、包层和空气(或涂覆层)。纤芯半径a1通常在4~5微米,包层半径a2是62.5微米左右。折射率分布是阶跃的:纤芯折射率n1略高于包层n2,空气折射率n3=1。

在这个结构里,纤芯基模的场主要集中在纤芯,而包层模的场则弥散在整个包层区域,并迅速在空气界面衰减。所以求解包层模的有效折射率时,必须把空气层也作为边界条件纳入特征方程,否则算出来的模式分布和相位匹配会对不上。

具体的特征方程推导比较长,这里直接说实现思路:在纤芯区域,场用第一类贝塞尔函数J描述;在包层区域,用第一类和第二类贝塞尔函数J和Y的线性组合描述;在空气区域,用修正贝塞尔函数K描述。然后利用电场和磁场的边界连续条件,得到一个关于有效折射率n_eff的行列式方程。方程求根,就是模式有效折射率。

2.2 用二分法还是fzero?我的建议

MATLAB里求解这个特征方程,我一开始直接用fzero,结果发现很依赖初始值选得好不好。选得不好,迭代直接发散或者跳到别的模式上去。

后来我的做法是:先用解析近似公式估算一下大致位置,再用fzero在这个小范围内精确求根。比如包层模的有效折射率范围,粗略看就在包层折射率n2以下、空气折射率1以上。第m阶模式的截止特性也有规律可循,高阶模的有效折射率逐渐向1靠近。所以我的建议是:

  1. 先扫描n_eff从n2到1.0的区间,计算特征方程函数值;
  2. 找出函数值变号的区间;
  3. 对每个变号区间用fzero精确定位。

这样能一次性把前N个包层模的有效折射率全部求出来,而且不会漏模式。

2.3 材料色散不可忽略

很多入门教程会告诉你,直接用固定折射率算就完事了。但如果你希望在1.2微米到1.7微米的宽谱范围里得到靠谱的透射谱,材料色散一定要加进去。

二氧化硅的折射率随波长变化可以用Sellmeier方程描述,这个方程在MATLAB里就是一行代码的事。不要偷懒用常数近似,否则你会发现谐振峰的位置整体偏移,而且在长波段的误差特别明显。我在仿真中加入Sellmeier色散之后,谐振峰位置和实验数据吻合度明显提升。

3. 耦合模方程到传输矩阵:完整MATLAB仿真框架

3.1 为什么选传输矩阵法而不是直接解微分方程

耦合模方程本质上是一组常微分方程,描述纤芯模振幅和包层模振幅沿光栅长度方向的变化。有人习惯直接用ode45去解,第一次跑通很简单,但问题是:一旦你要研究非均匀光栅、变迹光栅、相移光栅,ode45的代码结构就要大改。

传输矩阵法的思路完全不同:把光栅沿长度方向分成很多小区段,每个区段内假设参数恒定,用一个2×2矩阵描述该区段的耦合作用,最后把所有区段的矩阵相乘,就得到整个光栅的传输特性。它的好处是,分段、拼接、加相移都变得非常自然。这也是为什么我做LPG仿真首选传输矩阵法。

3.2 传输矩阵的数学形式

对于单模耦合情形,也就是只考虑纤芯基模和第m阶包层模的耦合,耦合模方程可以写成:

dA_core / dz = i·δ·A_core + i·κ·A_clad dA_clad / dz = i·κ·A_core - i·δ·A_clad

其中失谐量δ = π·(n_core - n_clad) / λ - π / Λ,κ是耦合系数。这个常系数微分方程组解出来,得到的传输矩阵就是:

T = [ cos(γ·L) + i·(δ/γ)·sin(γ·L), i·(κ/γ)·sin(γ·L); i·(κ/γ)·sin(γ·L), cos(γ·L) - i·(δ/γ)·sin(γ·L) ]

其中γ = sqrt(κ² + δ²)。光栅总长为L,如果分成N段,每段长度为dz,那就把每一段的矩阵按顺序相乘,得到总矩阵M。透射振幅就是1/M(1,1),透射率等于它的模平方。

3.3 耦合系数的近似与精确计算

耦合系数κ描述的是折射率调制把纤芯基模能量耦合到包层模的强度。对于紫外写入的LPG,折射率调制主要集中在纤芯区域,所以κ可以写成:

κ = (π·Δn / λ) × η

其中Δn是折射率调制幅度,η是纤芯基模与包层模在纤芯区域的重叠积分。这个重叠积分需要数值计算,MATLAB里可以用trapz在二维平面上积分。对于低阶包层模,场在纤芯区域还有一定的重叠,耦合系数较大;对于高阶包层模,重叠越来越少,耦合系数明显下降,所以高阶谐振峰通常也更浅。这个规律在透射谱上表现得很清楚。

4. 可运行的MATLAB代码:核心函数与参数配置

4.1 模式有效折射率求解函数

我不能把全部代码贴在这里,但核心骨架是这样的。先定义光纤几何参数和材料色散,然后扫描求解特征方程:

% 参数定义 a1 = 4.15e-6; % 纤芯半径 (m) a2 = 62.5e-6; % 包层半径 (m) n1 = 1.4681; % 纤芯折射率(此处需用Sellmeier修正) n2 = 1.4628; % 包层折射率 n3 = 1.0; % 空气折射率 lambda = 1.55e-6; % 工作波长 (m) N_modes = 20; % 需要求解的包层模数量 % 用二分法找特征函数零点 % 特征函数 f(n_eff) 由边界条件行列式构成 % 核心代码省略详细推导,函数返回有效折射率数组 neff_clad

这里我特意把“特征函数”的详细推导留白。实际编码时,这部分是最容易出错的,因为行列式的每一项都涉及贝塞尔函数在不同区域的取值,下标和正负号不能搞混。建议先用最基础的LP模式近似验证一下,再逐步加上包层边界条件。

4.2 传输矩阵透射谱计算

下面是整个仿真的主循环。波长扫描范围我一般取1.2微米到1.7微米,扫描点数4001个,既能看到完整的谐振峰,又不会让计算时间太长。

lambda = linspace(1.2e-6, 1.7e-6, 4001); Lambda = 550e-6; % 光栅周期 L_total = 0.02; % 光栅长度 2cm N_seg = 100; % 分段数 dz = L_total / N_seg; kappas = 1e-4; % 耦合系数(可按模式单独设) T_spec = zeros(size(lambda)); for i = 1:length(lambda) % 失谐量随波长变化 delta = pi * (n_core - n_clad) / lambda(i) - pi / Lambda; gamma = sqrt(kappas^2 + delta^2); % 单段传输矩阵 T_seg = [cos(gamma*dz) + 1i*delta/gamma*sin(gamma*dz), 1i*kappas/gamma*sin(gamma*dz); 1i*kappas/gamma*sin(gamma*dz), cos(gamma*dz) - 1i*delta/gamma*sin(gamma*dz)]; % 总传输矩阵 M = T_seg; for j = 2:N_seg M = M * T_seg; end % 透射率 t = 1 / M(1,1); T_spec(i) = abs(t)^2; end plot(lambda*1e6, 10*log10(T_spec)); xlabel('波长 (μm)'); ylabel('透射损耗 (dB)');

4.3 参数配置表:一组能直接复现的数据

我把一组能直接跑出多个谐振峰的关键参数整理成了表格,方便你对照:

参数数值说明
纤芯半径 a14.15 μm标准单模光纤典型值
包层半径 a262.5 μm标准单模光纤典型值
光栅周期 Λ550 μm经典LPG周期
光栅长度 L20 mm决定峰深和带宽
折射率调制深度 Δn1e-4~4e-4决定耦合强弱
包层折射率 n21.4628需按Sellmeier修正

这组参数跑出来的透射谱,在1.3微米到1.6微米范围内能看到至少四五个谐振峰,最深的一个峰损耗能超过10dB。把它和文献里的实验结果对照,形态上是非常像的。

5. 参数扫描实验:谐振峰是怎么随Λ、L、Δn变化的

5.1 周期Λ决定峰的“位置”

把Λ从400微米扫到700微米,你会发现所有谐振峰一起往长波长方向移动,而且峰间隔也会变大。原因在相位匹配公式里写得很清楚:λ_res和Λ近似成正比。仿真中常见的错误是,扫完周期之后发现峰没动,那多半是因为你在程序里把Λ写死了,循环体里没有读新的值。

这个规律在做传感设计时很实用:你希望某个峰的谐振波长落在哪个波段,就可以先用这个线性关系估算光栅周期,再通过精确仿真微调。

5.2 长度L决定峰的“深度”

光栅长度对透射谱的影响更加直观。L太短,模式来不及充分耦合,损耗峰很浅;L太长,能量来回耦合,峰过深之后甚至会出现分裂。仿真时我做了一组对比:L=10mm时,最大损耗峰大约在5dB;L=20mm时,峰深能到15dB;再增加到40mm,主峰旁边开始出现振荡,反而破坏了谱形。

这个现象背后的物理是:耦合存在周期性,能量在纤芯和包层之间来回交换。所以选L时,本质上是让耦合长度刚好对应π/2的奇数倍,使能量最大化地转移到包层模。这在设计阶段用仿真去定参数,比在实验台上反复磨光纤高效得多。

5.3 折射率调制深度Δn决定峰的“带宽”

Δn控制的是耦合强度。Δn小,耦合弱,峰浅且窄;Δn大,耦合强,峰深且带宽变大。如果你是想做高精度传感,窄峰更有利,因为谐振波长的微小移动更容易被分辨;但峰太窄对光源稳定性和解调仪分辨率要求就高。这个取舍只能通过仿真来量化。

我还习惯在仿真里把Δn设为沿光栅长度方向渐变的形式,比如高斯变迹。这样能抑制旁瓣,让谐振峰两侧更干净。实现起来只需要在传输矩阵循环里,把kappas从一个常数改成一个数组,每个分段的耦合系数不同即可,通用性很好。

6. 仿真里的三个隐匿大坑:模式截断、失谐量符号与计算时长

6.1 坑一:包层模数量截断不足,谐振峰“凭空消失”

第一次跑完仿真,我发现谱线异常平滑,一个峰都没有。排查了很久才发现,我只算出了前5个包层模的有效折射率,而在这个周期下可能参与耦合的是更高阶的模式,剩下的峰当然一个都看不到。这个问题在参数表变化时尤其隐蔽:不同周期对应的相位匹配模式不同,截断数量不足就会导致某个波长区间“秃”了。

后来我把包层模数量增加到20个,并加了一段自动检测:哪几个模式的谐振波长落在扫描区间内,就自动参与透射谱计算。做完这一步,所有峰就都出现了。

6.2 坑二:失谐量的符号与单位换算

耦合模方程里失谐量δ = β_core - β_clad - 2π/Λ,如果写成β_core - β_clad + 2π/Λ或者在传播常数上丢了2π因子,结果就是所有峰的位置全部错乱。这个坑非常常见,因为很多教材在不同地方用了不同的符号约定。

我的排查方式是:先取一个特定的包层模,手算它的谐振波长,再在仿真结果里找对应峰的位置。如果两者能对上,说明公式没问题;对不上,优先检查传播常数和失谐量符号。这个方法我一直在用,屡试不爽。

6.3 坑三:传输矩阵分段数不足导致谱线振荡

理论上,传输矩阵分段数越多越精确,但分段数不够时,矩阵乘法引入的数值误差会让谱线出现高频振荡。我实测下来,20mm的光栅分成100段以上就能稳定,分段数增加到1000段计算时间大约增加十倍,谱形基本不再变化。

如果你发现谱线尾部有奇怪的抖动,先不要急着怀疑物理模型,把N_seg调大试试,多半能解决。

6.4 一个额外的经验:从单模耦合到多模耦合

这篇文章默认每个谐振峰独立处理,也就是把一个包层模单独拉出来算透射谱。但实际LPG中,不同包层模之间也可能存在微弱耦合。如果你追求非常精确的谱线深度,就需要把多个模式放进同一个耦合模方程组里联立求解,矩阵会从2×2变成(N+1)×(N+1)。这个扩展用传输矩阵法也能做,我后续计划把多模耦合的版本也整理出来,到时候可以直接复用这里的框架。

7. 仿真与实际实验对照的心得

跑通仿真之后,我拿它和实验数据做了对照,发现有几个细节值得特别注意。

第一,理论谱的谐振峰深度一般比实验谱更深,因为实验中的光栅写入不均匀、模式损耗、弯曲等都会削弱耦合效率。不要试图让仿真和实验的峰深完全一致,重点看峰的位置和相对形态。

第二,仿真里用的是理想的三层光纤模型,忽略光纤椭圆度、芯包偏心等非理想因素。这些因素会导致模式简并解除,实验谱上某些单峰会变成双峰。如果你想在仿真里复现这种现象,需要引入椭圆纤芯模型,复杂度会高一个等级。

第三,温度对LPG的影响可以通过热光系数和热膨胀系数添加到折射率和周期里。这个扩展很简单,在循环里加两项温度修正就能实现,我建议新手把温度响应作为第一个扩展实验。

长周期光纤光栅的MATLAB仿真,本质上就是三件事:算对模式、算对耦合、选对参数。把这套流程走通,后面做参数优化、传感特性分析、乃至非均匀光栅设计,都只是在这个框架上添砖加瓦而已。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询