
简介长周期光纤光栅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空气折射率n31。在这个结构里纤芯基模的场主要集中在纤芯而包层模的场则弥散在整个包层区域并迅速在空气界面衰减。所以求解包层模的有效折射率时必须把空气层也作为边界条件纳入特征方程否则算出来的模式分布和相位匹配会对不上。具体的特征方程推导比较长这里直接说实现思路在纤芯区域场用第一类贝塞尔函数J描述在包层区域用第一类和第二类贝塞尔函数J和Y的线性组合描述在空气区域用修正贝塞尔函数K描述。然后利用电场和磁场的边界连续条件得到一个关于有效折射率n_eff的行列式方程。方程求根就是模式有效折射率。2.2 用二分法还是fzero我的建议MATLAB里求解这个特征方程我一开始直接用fzero结果发现很依赖初始值选得好不好。选得不好迭代直接发散或者跳到别的模式上去。后来我的做法是先用解析近似公式估算一下大致位置再用fzero在这个小范围内精确求根。比如包层模的有效折射率范围粗略看就在包层折射率n2以下、空气折射率1以上。第m阶模式的截止特性也有规律可循高阶模的有效折射率逐渐向1靠近。所以我的建议是先扫描n_eff从n2到1.0的区间计算特征方程函数值找出函数值变号的区间对每个变号区间用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太长能量来回耦合峰过深之后甚至会出现分裂。仿真时我做了一组对比L10mm时最大损耗峰大约在5dBL20mm时峰深能到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变成(N1)×(N1)。这个扩展用传输矩阵法也能做我后续计划把多模耦合的版本也整理出来到时候可以直接复用这里的框架。7. 仿真与实际实验对照的心得跑通仿真之后我拿它和实验数据做了对照发现有几个细节值得特别注意。第一理论谱的谐振峰深度一般比实验谱更深因为实验中的光栅写入不均匀、模式损耗、弯曲等都会削弱耦合效率。不要试图让仿真和实验的峰深完全一致重点看峰的位置和相对形态。第二仿真里用的是理想的三层光纤模型忽略光纤椭圆度、芯包偏心等非理想因素。这些因素会导致模式简并解除实验谱上某些单峰会变成双峰。如果你想在仿真里复现这种现象需要引入椭圆纤芯模型复杂度会高一个等级。第三温度对LPG的影响可以通过热光系数和热膨胀系数添加到折射率和周期里。这个扩展很简单在循环里加两项温度修正就能实现我建议新手把温度响应作为第一个扩展实验。长周期光纤光栅的MATLAB仿真本质上就是三件事算对模式、算对耦合、选对参数。把这套流程走通后面做参数优化、传感特性分析、乃至非均匀光栅设计都只是在这个框架上添砖加瓦而已。本文还有配套的精品资源点击获取