光纤光栅(FBG)和双光纤光栅(DFBG)的Matlab仿真,这个选题我一直想做一次系统梳理。原因很简单:网上关于FBG仿真的资料不少,但大多数停留在“贴一段代码、跑一张反射谱”的层面,很少有人讲清楚背后的建模逻辑、参数怎么定、双光栅和单光栅的本质区别在哪。我自己在做光纤传感解调方案时,在这上面踩了不少坑,趁着这次机会把完整的仿真思路、代码实现和踩坑记录整理出来,希望能给正在做光纤光栅仿真或者准备入手的朋友一些参考。
这个项目能解决什么问题?往小了说,是帮你用Matlab快速算出一条符合预期的FBG反射谱,做出相移光栅、级联光栅等DFBG结构的谱形;往大了说,是把“光栅设计—谱形分析—传感解调”这条链路打通,让你在写论文、做毕设、或者搭工程原型时,不用一上来就砸钱刻写光栅、买光谱仪,先用软件把方案验证一遍。
适合谁看?一类是刚接触光纤光栅、对耦合模理论和传输矩阵法还不熟的学生;另一类是已经能跑通单光栅仿真、但想搞明白双光栅结构(相移光栅、级联光栅)怎么做、怎么分析的工程师。代码我会给出可直接复跑的核心片段,参数怎么调、出现问题时怎么排查,也会一并说明。
1. 仿真前的理论准备:FBG基础原理与DFBG类型拆解
1.1 FBG的反射机理与关键光学参数
光纤布拉格光栅本质上是纤芯中一段周期性折射率调制结构。当一束宽谱光进入光栅区域时,满足布拉格条件的波长会被反射回来,其余波长继续透射。这个布拉格波长由相位匹配条件决定:
λ_B = 2 · n_eff · Λ
其中 n_eff 是纤芯模式的有效折射率,Λ 是光栅周期。以常用的1550nm波段为例,若 n_eff = 1.45,则周期大约在534nm左右。这个公式是所有仿真的起点,也是后面调参时最先要核对的量。
光栅的反射谱形状和以下参数直接相关:
- 折射率调制深度 Δn:决定反射率大小。Δn 越大,反射率越高,但过大时会导致旁瓣显著增大。
- 光栅长度 L:决定谱宽和反射率。L 越长,反射率越高、带宽越窄,但旁瓣也会更复杂。
- 光栅周期 Λ:决定布拉格波长位置。
- 切趾(apodization)函数:决定旁瓣抑制水平。常用的有余弦切趾、高斯切趾、升余弦切趾等。
仿真时大多数人直接解耦合模方程,但精确解只适用于均匀周期、均匀折射率调制的理想光栅。一旦引入切趾、啁啾(周期渐变)、相移或者级联结构,解析解就不够用了,这时候传输矩阵法(Transfer Matrix Method, TMM)是更通用的选择。
1.2 DFBG的常见结构:相移光栅与级联光栅
所谓双光纤光栅(DFBG),在文献和工程中有两种常见理解:
第一种是单一光纤上写入两个光栅,形成级联结构(双光栅级联)。两个光栅的布拉格波长可以相同,也可以略有差异。相同波长时,两个光栅之间形成一个法布里-珀罗(F-P)腔,反射谱内会出现周期性干涉条纹;波长有差异时,反射谱会出现两个分离的反射峰,可用于双参数传感。
第二种是相移光栅(Phase-shifted FBG),即在均匀光栅的中间某个位置插入一个相位跳变点,相当于在同一个“光栅结构”中引入了两个子光栅,反射谱中会在布拉格波长位置产生一个极窄的透射窗口。这种结构也常被归入DFBG的范畴,因为它在数学建模上就是两个子光栅与一个相移段的组合。
理解这两种结构对仿真建模至关重要,因为它们的传输矩阵写法不一样:
- 级联光栅:两个独立的光栅矩阵直接相乘,中间插入一段普通光纤的传播矩阵。
- 相移光栅:将光栅分为两段,中间插入一个纯相移矩阵(只有相位,没有耦合)。
2. 传输矩阵法:为什么选它以及如何建模
2.1 传输矩阵法的数学原理
传输矩阵法的基本思想是把非均匀光栅沿长度方向切分成N段,每一段近似看作均匀光栅,用解析的2×2矩阵描述其输入输出关系,再将所有段的矩阵依次相乘,得到整个光栅的传输特性。
每一段均匀光栅的传输矩阵表达式为:
F_i = [[cosh(γ·Δz) - j·(σ̂/γ)·sinh(γ·Δz), -j·(κ/γ)·sinh(γ·Δz)], [j·(κ/γ)·sinh(γ·Δz), cosh(γ·Δz) + j·(σ̂/γ)·sinh(γ·Δz)]]
其中:
- Δz 为子段长度
- κ 为交流耦合系数,κ = π·Δn·v / λ(v 为条纹可见度,通常取1)
- σ̂ 为直流自耦合系数,σ̂ = 2π·n_eff·(1/λ - 1/λ_D) + 2π·Δn / λ
- λ_D 为每段光栅的局部布拉格波长,啁啾光栅中每段的 λ_D 是随位置变化的
- γ² = κ² - σ̂²
整段光栅的总矩阵为:
F_total = F_N · F_{N-1} · ... · F_1
反射系数 r = F_total(2,1) / F_total(1,1),反射率 R = |r|²
2.2 为什么用传输矩阵法而不用耦合模解析解
直接解耦合模方程在均匀光栅场景下没有问题,而且速度快、实现简单。但实际工程中很少遇到理想均匀光栅:
- 需要抑制旁瓣时,要做切趾处理,这时折射率调制幅度沿长度是变化的,解析解失效。
- 需要展宽带宽或做色散补偿时,要引入啁啾,每段的布拉格波长都在变化。
- 需要分析相移光栅、取样光栅、级联光栅等复杂结构时,分段均匀化是唯一通用做法。
传输矩阵法本质上是把困难问题拆成若干个小问题,每段近似均匀、用解析式描述,最后矩阵乘起来。只要分段数量足够多(一般取200~500段),逼近精度是足够的。这就是工程中最常用的处理方式。
2.3 Matlab参数设置与核心代码实现
在Matlab中实现传输矩阵法的思路很清晰:先定义全局参数(n_eff、Δn、L、Λ等),再给定波长扫描范围,对每个波长计算总传输矩阵,最后提取反射率。
下面是均匀FBG反射谱仿真的核心代码:
% 均匀FBG传输矩阵法仿真 clear; clc; % 基本参数 n_eff = 1.45; % 纤芯有效折射率 delta_n = 1e-4; % 折射率调制深度 L = 10e-3; % 光栅长度 10mm lambda_D = 1550e-9; % 设计布拉格波长 1550nm M = 200; % 分段数 delta_z = L / M; lambda_scan = linspace(1549e-9, 1551e-9, 2000); % 波长扫描范围 % 预分配结果数组 R = zeros(size(lambda_scan)); for idx = 1:length(lambda_scan) lambda = lambda_scan(idx); % 耦合系数 kappa = pi * delta_n / lambda; % 交流耦合系数(可见度取1) sigma_hat = 2*pi*n_eff*(1/lambda - 1/lambda_D) + 2*pi*delta_n/lambda; gamma = sqrt(kappa^2 - sigma_hat^2); % 传输矩阵初始化(单位矩阵) F_total = eye(2); for m = 1:M % 每段均匀光栅矩阵 if abs(gamma) < 1e-12 % 防止除零,处理临界情况 F_seg = [1 - 1j*sigma_hat*delta_z, -1j*kappa*delta_z; -1j*kappa*delta_z, 1 + 1j*sigma_hat*delta_z]; else cosh_gz = cosh(gamma * delta_z); sinh_gz = sinh(gamma * delta_z); F_seg = [cosh_gz - 1j*(sigma_hat/gamma)*sinh_gz, -1j*(kappa/gamma)*sinh_gz; -1j*(kappa/gamma)*sinh_gz, cosh_gz + 1j*(sigma_hat/gamma)*sinh_gz]; end % 矩阵累乘,注意顺序 F_total = F_total * F_seg; end % 反射系数和反射率 r = F_total(2,1) / F_total(1,1); R(idx) = abs(r)^2; end % 绘制反射谱 plot((lambda_scan - lambda_D) * 1e9, R, 'LineWidth', 1.5); xlabel('波长偏移 (nm)'); ylabel('反射率'); title('均匀FBG反射谱(传输矩阵法)'); grid on;这段代码跑出来的反射谱主峰在中心波长处,峰值反射率由 Δn 和 L 共同决定。实测下来,Δn = 1e-4、L = 10mm 时,峰值反射率大约在90%左右,带宽(3dB)通常在0.2~0.3nm量级,具体数值取决于折射率调制深度。
2.4 切趾与啁啾的实现思路
切趾的实现方式很简单,就是在每一段的折射率调制深度上乘一个窗函数。以高斯切趾为例:
% 高斯切趾,中心最强,两端渐弱 for m = 1:M z = (m - 0.5) * delta_z - L/2; % 每段中心位置 apod = exp(-(z^2) / (2 * (L/6)^2)); % 高斯窗 delta_n_local = delta_n * apod; % 后续计算 kappa 时使用 delta_n_local end啁啾光栅的实现类似,只是让每段的布拉格波长沿位置线性变化:
% 线性啁啾,布拉格波长从 lambda_start 渐变到 lambda_end lambda_D_local = lambda_D + chirp_rate * z; % chirp_rate 单位:nm/mm这两个扩展说明一个关键点:传输矩阵法的魅力在于灵活性。均匀光栅只是特例,修改每段的参数就能生成各种复杂结构,代码结构本身不需要大改。
3. 从单光栅到双光栅:DFBG仿真实战
3.1 双光栅级联(F-P腔)的建模与谱形分析
级联双光栅是最直接的双光纤光栅结构。两个反射率相同或不同的光栅之间由一段普通光纤隔开,中间这段长度就是F-P腔的腔长。
建模方法不复杂:算出第一个光栅的传输矩阵 F1,算出中间光纤段的传播矩阵 F_prop,再算出第二个光栅的传输矩阵 F2,三者相乘即得总矩阵:
% 级联双光栅:F_total = F2 * F_prop * F1 % 中间普通光纤段的传播矩阵(只产生相位延迟,无耦合) L_cavity = 5e-3; % 腔长 5mm phi = 2 * pi * n_eff * L_cavity / lambda; F_prop = [exp(-1j*phi), 0; 0, exp(1j*phi)]; % 完整计算时,对每个波长: % F_total = F2_seg_product * F_prop * F1_seg_product;运行后发现一个典型现象:当两个光栅的中心波长相同时,反射谱不再是一个平滑的峰,而是在峰顶附近出现密集的干涉条纹。条纹间隔与腔长成反比,腔长越长,条纹越密。这个现象的本质是:两个光栅相当于两个部分反射镜,它们之间的光发生多次反射干涉,等效于一个F-P干涉仪。
这里要特别提醒:腔长是级联光栅仿真中最敏感的参数。腔长增加一倍,自由光谱范围(FSR)就缩小一半。做传感器设计时,如果需要在反射峰内看到可分辨的干涉条纹,腔长通常控制在毫米量级;如果想利用条纹做高精度解调,则要保证光谱仪的分辨率远小于FSR。
3.2 相移光栅(相移DFBG)的实现
相移光栅是在均匀光栅中插入一个相位跳变。实现上,把光栅分成前后两段,分别用传输矩阵计算,中间乘一个相移矩阵:
% 相移光栅:前段光栅 + 相移 + 后段光栅 % 相移矩阵,相位跳变 phi_shift F_shift = [exp(-1j*phi_shift/2), 0; 0, exp(1j*phi_shift/2)]; % F_total = F2_seg_product * F_shift * F1_seg_product;常用的相移量是 π 相移。仿真结果很直观:原本的反射峰中央出现一个极窄的透射谷,这个透射谷的线宽可以做到pm量级,远窄于光栅本身的带宽。这就是相移光栅能用于高精度波长解调的根本原因——窄线宽意味着对微小的波长偏移更敏感。
相移位置也很关键。大多数文献默认相移在光栅正中间,这时透射谷位于布拉格波长的正中心,且两个谐振模式对称。如果把相移放在偏离中心的位置,透射谷会发生偏移,两个谐振模式的深度也不对称。这个特征可以用于设计特殊滤波响应的器件。
3.3 两种DFBG结构的仿真结果对比
为了直观展示差异,我整理了下面这个对比表格,方便大家日后选型参考:
| 对比维度 | 级联双光栅(F-P腔) | 相移光栅 |
|---|---|---|
| 谱形特征 | 反射峰内出现密集干涉条纹 | 反射峰中央出现极窄透射谷 |
| 自由光谱范围 | 由腔长决定,腔长越长FSR越小 | 由光栅长度和折射率调制深度决定 |
| 窄线宽特性 | 条纹线宽由光栅反射率决定 | 透射谷线宽可达到pm量级 |
| 典型应用 | 双参数传感、F-P干涉型传感 | 窄带滤波、高精度波长解调、单频激光器选模 |
| 建模难度 | 较低,只需矩阵顺序相乘 | 中等,需要注意相移位置和相位量 |
仿真这两种结构时要注意:当折射率调制深度或光栅长度改变时,级联光栅的条纹对比度会明显变化,而相移光栅的透射谷深度对损耗很敏感,仿真中如果加了过大的吸收损耗项,透射谷会被“抹平”。所以做相移光栅仿真时,建议先不加损耗,把理想谱形跑出来,再逐步加损耗观察退化趋势。
4. 传感参数标定:灵敏度计算与解调逻辑
4.1 应变与温度灵敏度计算
FBG做传感的核心逻辑是:外界应变或温度变化引起光栅周期和有效折射率变化,进而导致布拉格波长漂移。仿真的目标不是直接模拟应变场,而是通过灵敏度系数,把波长漂移量算出来。
布拉格波长对应变和温度的响应可以写成:
Δλ_B / λ_B = (1 - p_e) · ε + (α + ξ) · ΔT
其中:
- p_e 为光弹系数,对典型石英光纤约 0.22
- ε 为轴向应变
- α 为热膨胀系数,约 0.55 × 10⁻⁶ /°C
- ξ 为热光系数,约 6.5 × 10⁻⁶ /°C
代入 λ_B = 1550nm,可以算出典型灵敏度:
- 应变灵敏度:约 1.2 pm/με
- 温度灵敏度:约 10.8 pm/°C
这两个数值是工程中最常用来做预估的经验值。仿真中验证方式很简单:改变输入参数中的 Λ 或 n_eff,观察反射峰位置移动量,然后和理论值对比。只要代码无误,反射峰移动量和公式计算值应当一致。
4.2 折射率变化对Bragg波长的影响
除了应变和温度,外界折射率变化也会影响有效折射率。在光纤光栅传感中,如果要测液体折射率,通常需要把光纤包层减薄或者使用D型光纤,让倏逝波与外界介质接触。这时候 n_eff 不再是固定值,而是随外界折射率变化。
在Matlab仿真中,可以这样处理:
% 外界折射率变化引起有效折射率变化 % 实际对应关系需要通过模式求解获得,这里用近似线性关系 n_eff_new = n_eff + dn_ext * sensitivity_factor; lambda_D_new = 2 * n_eff_new * Lambda;这里的 sensitivity_factor 取决于光纤结构设计和模式分布比例,没有统一数值。仿真中更大的意义在于定性观察传感器响应的趋势,以及为解调算法提供数据支持。
4.3 双光栅双参数解调的核心思路
单光栅测一个物理量足够,但温度和应变同时变化时,一个布拉格波长漂移量无法同时反演出两个变量。级联双光栅在这里就有优势了。
一种常用方案是:制作两个中心波长不同的光栅,一个对温度和应变都敏感,另一个通过特殊封装只对温度敏感(镀金属或置于毛细管内)。测量得到两个波长漂移量 Δλ₁ 和 Δλ₂,联立方程组:
Δλ₁ = K_ε1 · ε + K_T1 · ΔT Δλ₂ = K_ε2 · ε + K_T2 · ΔT
其中 K_ε 和 K_T 分别是应变和温度灵敏度系数。因为两个光栅的系数不同(矩阵非奇异),方程组可解。
在Matlab仿真中,可以把这部分做成一个函数模块,输入两个波长漂移量,输出应力和温度。我实践中习惯把灵敏度矩阵做成可配置参数,这样在更换光栅参数后不用改主体逻辑。
4.4 灵敏度矩阵的条件数问题
这里分享一个实际项目中容易忽略的问题:灵敏度的区分度。如果两个光栅的温度和应变灵敏度过于接近,灵敏度矩阵会接近奇异,解算结果对噪声极敏感——哪怕光谱仪读数差1pm,反解出的温度或应力误差都可能很大。
所以设计双光栅时要提前评估:两个光栅的灵敏度系数差异是否足够大。通常采用的手段是让其中一个光栅做特殊封装(例如钛合金管封装后应变传递很小),人为拉开灵敏度差异矩阵的条件数。做仿真时,可以顺手把矩阵的条件数打出来:
cond(K_matrix)条件数越小,解调稳定性越好。这个指标建议在论文和报告中一并列出,比单纯画谱线图更有说服力。
5. 常见问题与排查技巧实录
5.1 反射谱异常:旁瓣过高
旁瓣是FBG反射谱的典型特征,切趾的目的就是压低旁瓣。实际仿真中旁瓣过高通常有三个原因:
- 未使用切趾函数:均匀光栅的旁瓣本身就有约-20dB左右,这是正常现象。
- 切趾函数的参数不合适:例如高斯切趾的宽度过小,导致有效光栅长度变短,反射谱被展宽。
- 分段数不足:当分段数太少时,每段之间的不连续性会引入额外干扰。
排查方法很简单:把切趾关掉、把分段数M从200提高到1000,看谱形是否变化。如果提高M后谱形稳定,说明当前分段数不足。我一般建议M取500以上,仿真时间几乎可以忽略,但稳定性明显提升。
| 现象 | 可能原因 | 排查办法 |
|---|---|---|
| 旁瓣过高 | 未加切趾或切趾宽度不合适 | 检查切趾函数类型及参数 |
| 反射率偏低 | Δn偏小或L偏短 | 核对Δn和L的数量级 |
| 谱线左右不对称 | 波长扫描范围不足以覆盖全部旁瓣 | 扩大波长扫描范围 |
| 中心波长偏移与理论不符 | n_eff或Λ设置错误 | 用 λ_B=2n_effΛ 反算校验 |
| 透射谷消失或变浅 | 相移位置偏差或损耗过大 | 检查相移量及损耗项 |
5.2 中心波长偏移与理论计算不符
这是新手最常见的疑问:仿真出来的反射峰中心波长和 2·n_eff·Λ 算出来的不一致,差了几个pm甚至更多。
原因大概率是直流自耦合系数 σ̂ 中包含了 Δn/λ 项。当折射率调制深度较大时(比如 Δn > 1e-3),这项会把布拉格波长往长波方向推,即有效布拉格波长不是 λ_D 而是 λ_D + Δλ_shift,波长偏移量大约与 Δn 成正比。
这个现象在物理上称为“折射率调制带来的直流成分引起的Bragg波长偏移”。如果在高精度仿真中看到几十pm的偏移而怀疑代码写错了,先检查 Δn 是否过大,再决定是否需要修正目标波长。
5.3 DFT与波长采样点数的选择
光谱扫描的点数直接影响谱形平滑度。以1550nm附近、扫描范围2nm为例,若波长间隔取1pm,则需要2000个点;若要捕捉相移光栅pm量级的透射谷,需要更小的波长步长,比如0.1pm,这就要上万点。
分段数和扫描点数相乘后,循环总次数可能达到数百万甚至上千万次。用纯for循环在Matlab中跑会比较慢,这里提供几个加速策略:
- 向量化:尽量把波长循环改成矩阵运算,利用Matlab的向量化优势。
- 分段数自适应:均匀光栅可以适当减少M,非均匀光栅才需要更多的M。
- 只算感兴趣的范围:不要全波段扫描,先粗扫定位峰的位置,再对峰附近做细扫。
实测下来,2000点 × 500段大约在普通电脑上跑几秒钟,属于可接受范围。如果代码跑了几十秒还不停,先检查是不是循环内部重复计算了不随波长变化的部分。
5.4 复现相移光栅时透射谷变浅
我一开始做相移光栅仿真时,透射谷始终不够深,后来发现是因为相移矩阵乘反了方向。传输矩阵的乘法顺序必须和光传播方向对应:光从左到右传播,矩阵应按照第1段到第N段依次左乘(或者右乘,但必须保持一致)。
还有一个容易被忽视的点:相移矩阵有两种写法,一种是相位因子分别放在两个对角元素上(对称形式),另一种是把整个相位只放在其中一个对角元素上。这两种写法在物理上等价,但对应的相位跳变位置会差半个子段长度。如果混用两种约定,透射谷位置会出现偏差。
5.5 边界条件处理
仿真最后一步是反射系数的提取。有些资料里直接取 r = F(2,1),严格来说这是不完整的,因为前提是入射端没有反射波入射且出射端没有后向波。正确做法是:
r = F_total(2,1) / F_total(1,1)
这里除以 F_total(1,1) 是必要的。如果端口边界不是理想匹配的,直接取 F(2,1) 会导致反射率大于1的荒谬结果。
5.6 级联光栅条纹过密无法分辨
级联光栅仿真中另一个常见困惑是:腔内条纹明明存在,但画出来的图看起来却只有一个包络。原因是腔长太大导致FSR远小于光谱仪分辨率或者画图点数不足。
解决思路有三种:
- 减小腔长,让FSR变大,例如把腔长从10mm减至1mm。
- 增加波长扫描点数,最少保证每个条纹周期有10~20个采样点。
- 用短腔长做物理验证,把FSR的理论值:FSR = λ² / (2·n_eff·L_cavity) 算出来,和谱图对比。
以1550nm、n_eff = 1.45、腔长5mm为例,FSR约为0.166nm。光谱范围如果只有1nm,只能看到约6个条纹,不至于糊成一团。但腔长增大到20mm时,FSR降到约0.041nm,1nm范围内有近25个条纹,光谱仪分辨率稍差就分辨不出来了。
6. 代码工程化:从脚本到可复用的仿真模块
6.1 封装成函数模块
当仿真场景多起来之后,写一个脚本打天下就不再合适了。我的做法是把核心功能封装成几个独立函数:
function R = uniform_fbg(lambda_scan, n_eff, delta_n, L, lambda_D, M) % 均匀FBG反射谱 end function R = phase_shifted_fbg(lambda_scan, n_eff, delta_n, L, lambda_D, M, L_shift) % 相移光栅反射谱 end function R = cascaded_fbg(lambda_scan, n_eff, delta_n, L1, L2, lambda_D1, lambda_D2, L_cavity, M) % 级联双光栅反射谱 end封装之后,不同的结构只需调用对应函数,参数变化只需在配置文件中修改,不需要每次修改主体代码。这套方式在需要批量参数扫描(比如扫不同Δn、不同腔长)时优势非常明显,直接for循环调用即可。
6.2 参数扫描与批量分析
批量参数扫描是仿真中很常见的需求。比如我想看不同折射率调制深度对旁瓣抑制的影响:
delta_n_list = [0.5e-4, 1e-4, 2e-4, 5e-4]; for i = 1:length(delta_n_list) R = uniform_fbg(lambda_scan, n_eff, delta_n_list(i), L, lambda_D, M); % 记录峰值、3dB带宽、旁瓣抑制比等指标 end批量扫描的主要价值是找到参数设计的平衡点。比如提升 Δn 可以增强反射率,但旁瓣也会变高;增加 L 可以窄化带宽,但会增加制作难度和成本。仿真可以在设计阶段快速给出这个权衡曲线,避免反复试制光栅。
6.3 结果可视化与导出
谱线图是基础,但工程上建议额外做两个输出:一是关键指标表(峰值反射率、中心波长、3dB带宽、旁瓣抑制比、FSR),二是结果导出至Excel或MAT文件,方便后续和其他工具对接。
% 导出关键指标到结构化数组 results(i).peak_R = max(R); results(i).peak_lambda = lambda_scan(find(R == max(R), 1)); % 计算3dB带宽 half_max = (1 + max(R)) / 2; % 注意:3dB带宽按反射率最高点的一半计算 idx_band = find(R >= max(R)/2); results(i).bandwidth = lambda_scan(end) - lambda_scan(1); % 实际需按idx范围计算需要注意的是3dB带宽的计算有不同定义:反射率幅度降到峰值一半,还是dB值下降3dB。换算关系是:峰值反射率 R_peak,3dB点对应反射率为 R_peak / 2 或者 10*log10(R_peak) - 3,二者在较低反射率时差别不大,但在高反射率时有差异,建议在代码注释中写清楚采用的是哪种定义,避免后续讨论时出现歧义。
7. 仿真结果进阶:与实验对比的误差来源
仿真终究是模型,和实验存在偏差是正常的。我自己的经验是,偏差主要来自四个方面:
第一,理想模型 vs 实际光栅的非理想性。实际写入的光栅存在折射率调制不均匀、条纹可见度小于1、边沿效应等问题,这些在传输矩阵法中没有完全体现。最直接的表现是:实验测得的旁瓣通常比仿真高3~5dB,反射谱中心区域会有轻微畸变。
第二,模式耦合的近似。传输矩阵法只考虑正反向基模耦合,忽略了包层模式耦合、辐射模耦合以及高阶模的影响。在折射率调制深度较大或者光栅偏离理想结构时,这些被忽略的效应会逐渐显现。
第三,光谱仪分辨率限制。实验中的光谱采集存在分辨率带宽,相当于对仿真谱做了卷积平滑,结果是实验谱比仿真谱略宽、峰值略低,窄线宽特征(如相移光栅的透射谷)会被明显抹平。
第四,有效折射率的取值。仿真中用的 n_eff 是计算值,实际光纤的模式折射率与光纤类型、截止波长、弯曲状态都有关系。n_eff 差了1e-4,布拉格波长就差约0.2nm,这个偏差在精密对比时不可忽略。
针对这些误差,我的建议是:仿真主要用于趋势预判和参数寻优,不要期望与实验逐点吻合。将仿真曲线和实验曲线叠加对比时,保留一定的容差窗口,重点关注中心波长位置、谱形特征的相对变化,而非绝对数值一致。
写在最后的一点实践体会
做光纤光栅仿真一年多,最大的心得是:传输矩阵法看似简单,但真正用好它,需要对物理模型和数值实现两头都理解透彻。代码谁都能抄,但参数怎么设、矩阵为什么这么乘、谱形变化意味着什么,才是区别于“会跑代码”和“会做设计”的分水岭。
如果你刚开始接触这个方向,建议不要急着跑级联、相移这些复杂结构,先老老实实把均匀FBG的反射谱跑通,手动改变Δn、L、Λ三个参数,观察谱形变化规律,建立起直觉之后再往DFBG扩展。整个过程预计半天到一天就能完成,但带来的理解深度远超直接复制复杂代码。
另外还有一个实用建议:把所有仿真代码放在一个统一的项目文件夹里,用一套参数配置文件驱动。这样后期无论是调整光栅参数、更换仿真结构,还是生成论文图表,效率都会提高不少。工程习惯往往是决定项目后期省力与否的关键所在,这个观点在仿真工作中同样适用。