ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Matlab的光纤光栅(FBG/LPFG)原理仿真与传感数据分析实践

基于Matlab的光纤光栅(FBG/LPFG)原理仿真与传感数据分析实践 简介本资源是一套面向光学工程、光纤传感及光通信方向本科生与研究生的MATLAB仿真代码集聚焦布拉格光纤光栅FBG与长周期光纤光栅LPFG的光谱特性建模与参数分析。通过耦合模理论与傅里叶变换方法实现反射谱、传输谱计算及温度/应变等外界参量影响的可视化模拟有效支撑课程设计、实验预研与器件优化任务。压缩包共9个.m文件涵盖均匀FBG、高斯型啁啾FBG、LPFG相位匹配函数、光谱可见度分析及温变响应仿真等核心模块全部为可直接运行的MATLAB脚本总大小仅7KB轻量易用且结构清晰。已有293人学习下载读者可即刻获取完整光栅建模流程从基础参数定义、耦合方程构建、谱线计算到多工况对比绘图显著降低理论理解门槛提升光纤器件仿真能力。1. 从“刻痕”到“传感器”光纤光栅的核心原理与价值如果你从事传感、通信或光学领域那么“光纤光栅”这个词你一定不陌生。它听起来像是一种精密的光学元件但实际上它更像是在一根头发丝粗细的光纤内部用激光“刻”下的一串周期性“条形码”。这个微小的“条形码”结构赋予了光纤感知外界环境变化的超凡能力使其从单纯的光信号传输通道摇身一变成为高灵敏度的传感器。今天我们不谈那些复杂的公式推导就从最直观的物理图像出发聊聊两种最常见的光纤光栅——布拉格光纤光栅FBG和长周期光纤光栅LPFG——它们到底是什么如何工作以及为什么在Matlab的加持下我们能更深入地理解和设计它们。简单来说FBG和LPFG都是通过改变光纤纤芯的折射率形成周期性结构。但这个“周期”的长短直接决定了它们与光相互作用方式的根本不同。FBG的周期在百纳米量级它像一个精密的波长选择镜只反射一个非常特定的波长布拉格波长而让其他所有波长通过。LPFG的周期则要长得多在几百微米量级它不反射光而是将纤芯中传输的特定波长的光耦合到包层中并迅速耗散掉在透射谱上形成一个“损耗峰”。正是这种反射与透射、波长选择与模式耦合的差异让它们在应用场景上分道扬镳FBG是点式应变、温度测量的王者而LPFG则在弯曲、扭曲、折射率传感以及模式转换等方面大放异彩。理解它们的原理是第一步但如何设计一个满足特定性能指标如中心波长、带宽、灵敏度的光纤光栅或者如何从实验测得的光谱中反推出光栅的结构参数才是工程实践中的核心挑战。这时Matlab就从一款强大的数学计算软件变成了我们不可或缺的“虚拟实验室”和“数据分析大脑”。无论是基于耦合模理论进行正向仿真还是利用优化算法进行逆向设计Matlab都能提供从底层算法到上层可视化的一整套工具链。接下来我们就深入这两种光栅的物理世界并看看如何用Matlab将理论转化为可操控的代码和直观的图形。2. FBG精准的波长“守门员”及其Matlab仿真实践布拉格光纤光栅FBG的工作原理可以用一个非常形象的类比来理解想象一队士兵光波正步通过一座每隔固定距离就有一根柱子的长廊光栅周期结构。如果士兵的步长光的波长恰好是柱子间距的两倍那么每走两步就会撞上一根柱子。所有士兵的步伐一致他们撞击柱子的节奏就会同步产生的回声反射光会相互叠加变得非常强。如果步长不对撞击就杂乱无章回声相互抵消几乎听不见。这个“同步增强”的条件就是著名的布拉格条件决定了FBG的中心反射波长。这个中心波长λ_B由光栅周期Λ和纤芯的有效折射率n_eff共同决定公式为 λ_B 2 * n_eff * Λ。任何导致Λ或n_eff发生变化的物理量如应变、温度都会引起λ_B的漂移。这就是FBG传感的基石通过高精度光谱仪测量反射波长的移动就能推知外界环境的变化。它的反射谱通常是一个接近高斯或sinc函数形状的尖峰带宽窄边沿陡峭非常适合波分复用一根光纤上可以刻写数十个甚至上百个不同中心波长的FBG实现准分布式测量。在Matlab中仿真一个FBG本质上就是求解耦合模方程。对于均匀FBG即周期、折射率调制深度恒定其反射谱有解析解Transfer Matrix Method, TMM 或 Coupled-Mode Theory, CMT我们可以直接编码实现。注意在开始编码前请确保你的Matlab工作路径设置正确或者将脚本和函数保存在同一目录下。以下代码是一个高度简化的示例旨在展示核心流程实际工程仿真需要考虑更多因素如切趾、啁啾等。首先我们定义FBG的基本参数并计算其反射谱% FBG反射谱仿真示例 (均匀光栅传输矩阵法) clear; clc; % 1. 基本参数设置 lambda 1540e-9 : 0.1e-9 : 1560e-9; % 扫描波长范围1540nm 到 1560nm步长0.1pm lambda_B 1550e-9; % 布拉格中心波长 n_eff 1.45; % 纤芯有效折射率 delta_n 5e-4; % 折射率调制深度 L 0.01; % 光栅长度10 mm % 2. 根据布拉格条件计算光栅周期 Lambda lambda_B / (2 * n_eff); % 单位米 % 3. 计算失谐量 (detuning) delta 2*pi*n_eff*(1./lambda - 1/lambda_B); % 单位rad/m % 4. 计算耦合系数 (对于均匀光栅kappa为常数) kappa pi * delta_n / lambda_B; % 单位1/m % 5. 传输矩阵法计算反射率 (简化版忽略损耗) R zeros(size(lambda)); % 初始化反射率数组 for i 1:length(lambda) delta_i delta(i); s sqrt(kappa^2 - delta_i^2); if isreal(s) % 情况1: kappa |delta| 光栅处于阻带内 R(i) (kappa^2 * (sinh(s*L))^2) / ... (s^2 * (cosh(s*L))^2 delta_i^2 * (sinh(s*L))^2); else % 情况2: kappa |delta| 光栅处于阻带外 s sqrt(delta_i^2 - kappa^2); % 此时s为实数 R(i) (kappa^2 * (sin(s*L))^2) / ... (delta_i^2 - kappa^2 * (cos(s*L))^2); end end % 6. 可视化 figure(Position, [100, 100, 800, 400]); plot(lambda*1e9, R*100, LineWidth, 2); % 波长单位转换为nm反射率转换为百分比 xlabel(波长 (nm)); ylabel(反射率 (%)); title(sprintf(均匀FBG反射谱仿真 (\\lambda_B%.2f nm, L%.0f mm), lambda_B*1e9, L*1e3)); grid on; xlim([1540, 1560]);运行这段代码你会得到一条以1550nm为中心、具有一定宽度的反射峰曲线。通过调整delta_n折射率调制深度和L光栅长度你可以直观地看到反射谱的变化delta_n越大反射率峰值越高带宽也可能略有增加L越长反射峰越窄边沿越陡峭。这就是Matlab仿真的魅力——无需昂贵的实验设备就能探索参数空间优化设计。在实际传感应用中我们更关心波长随应变ε和温度ΔT的漂移灵敏度。其关系可以线性近似为Δλ_B λ_B * (1 - p_e) * ε λ_B * (α ξ) * ΔT。其中p_e是弹光系数α是热膨胀系数ξ是热光系数。对于1550nm附近的石英光纤FBG应变灵敏度约为1.2 pm/με温度灵敏度约为10 pm/°C。在Matlab中我们可以很容易地模拟这种漂移并加入噪声来模拟真实测量环境。% 模拟FBG波长漂移与测量 % 假设参数 p_e 0.22; % 弹光系数 alpha 0.55e-6; % 热膨胀系数 /°C xi 6.7e-6; % 热光系数 /°C lambda_B0 1550e-9; % 初始中心波长 % 模拟施加的应变和温度变化 applied_strain 1000e-6; % 1000微应变 applied_deltaT 50; % 温度升高50°C % 计算波长漂移 delta_lambda_strain lambda_B0 * (1 - p_e) * applied_strain; delta_lambda_temp lambda_B0 * (alpha xi) * applied_deltaT; delta_lambda_total delta_lambda_strain delta_lambda_temp; fprintf(施加应变: %.0f με 导致波长漂移: %.3f pm\n, applied_strain*1e6, delta_lambda_strain*1e12); fprintf(温度变化: %.0f °C 导致波长漂移: %.3f pm\n, applied_deltaT, delta_lambda_temp*1e12); fprintf(总波长漂移: %.3f pm\n, delta_lambda_total*1e12); % 生成带噪声的模拟反射谱假设波长扫描测量 lambda_scan (lambda_B0 - 1e-9) : 0.5e-12 : (lambda_B0 1e-9); % 精细扫描 lambda_B_shifted lambda_B0 delta_lambda_total; % 漂移后的中心波长 % 假设反射谱为高斯型 R_peak 0.9; % 峰值反射率 FWHM 0.2e-9; % 半高全宽 R_spectrum R_peak * exp(-4*log(2)*((lambda_scan - lambda_B_shifted)/FWHM).^2); % 加入高斯白噪声 noise_level 0.01; % 噪声幅度 R_noisy R_spectrum noise_level * randn(size(lambda_scan)); R_noisy max(R_noisy, 0); % 反射率不能为负 % 使用简单峰值查找实际中可能用更复杂的算法如高斯拟合 [~, idx] max(R_noisy); lambda_measured lambda_scan(idx); fprintf(理论漂移后中心波长: %.6f nm\n, lambda_B_shifted*1e9); fprintf(从带噪光谱中提取的中心波长: %.6f nm\n, lambda_measured*1e9); fprintf(测量误差: %.3f pm\n, abs(lambda_measured - lambda_B_shifted)*1e12);这个模拟展示了从物理变化到可测量信号的全过程并引入了实际测量中必然存在的噪声。通过Matlab我们可以反复测试不同噪声水平下峰值检测算法的精度为实际解调系统的设计提供依据。3. LPFG模式转换的“魔术师”与光谱分析如果说FBG是精准的波长过滤器那么长周期光纤光栅LPFG就是一个模式转换器。它的周期通常几百微米远大于波长满足的是相位匹配条件而非布拉格条件。其核心原理是将纤芯中传输的基模LP01模的能量耦合到同向传输的包层模如LP0m模中。由于包层模被外面的涂覆层强烈衰减这个耦合过程在透射谱上就表现为一个特定波长处的宽损耗峰。LPFG的谐振波长公式为 λ_res (n_co - n_cl) * Λ。其中n_co是纤芯基模的有效折射率n_cl是某个包层模的有效折射率Λ是光栅周期。由于包层模的有效折射率对外界环境特别是包层外的介质折射率极其敏感使得LPFG在折射率、弯曲、扭曲传感方面具有天然优势。此外通过设计不同的周期可以选择性地将能量耦合到不同的包层模产生多个谐振峰实现多参数传感。在Matlab中仿真LPFG比FBG稍复杂因为涉及多个模式至少一个纤芯模和一个包层模之间的耦合。通常采用三层纤芯、包层、环境或两层模型结合耦合模方程进行求解。一个更实用的切入点是分析实验测得的LPFG透射谱。假设我们通过光谱仪得到了一组LPFG的透射数据我们的任务是分析其谐振波长、深度、带宽并可能反推一些光栅参数。以下是一个典型的数据处理流程% LPFG透射光谱数据处理与分析示例 clear; clc; % 1. 加载实验数据这里用模拟数据代替 % 假设数据格式第一列波长(nm)第二列透射率(dB) % load(LPFG_measurement_data.txt); % 实际从文件加载 % 生成模拟数据 wavelength_sim 1500:0.02:1600; % nm % 模拟两个谐振峰 peak1_center 1540; peak1_depth -15; % dB peak1_width 2; % nm peak2_center 1580; peak2_depth -20; % dB peak2_width 3; % nm % 生成高斯型损耗峰 transmission_dB peak1_depth * exp(-((wavelength_sim - peak1_center)/peak1_width).^2) ... peak2_depth * exp(-((wavelength_sim - peak2_center)/peak2_width).^2); % 添加背景和噪声 background -0.5; % dB 的背景损耗 noise 0.1 * randn(size(wavelength_sim)); transmission_dB transmission_dB background noise; data [wavelength_sim, transmission_dB]; wavelength data(:, 1); transmission data(:, 2); % 2. 数据预处理平滑去噪 windowSize 15; % 滑动平均窗口大小需为奇数 transmission_smooth smoothdata(transmission, movmean, windowSize); % 3. 寻找谐振峰谷值 % 由于是透射谱谐振处是损耗峰谷我们找局部最小值 [peakVals, peakLocs] findpeaks(-transmission_smooth, wavelength, MinPeakProminence, 1); % findpeaks找的是峰值我们对数据取负就相当于找原数据的谷值 % MinPeakProminence 设置了最小峰突出度用于过滤噪声引起的小起伏 resonant_wavelengths peakLocs; resonant_depths -peakVals; % 转换回真实的透射率dB值 fprintf(找到 %d 个谐振峰:\n, length(resonant_wavelengths)); for i 1:length(resonant_wavelengths) fprintf( 峰%d: 波长 %.2f nm, 深度 %.2f dB\n, i, resonant_wavelengths(i), resonant_depths(i)); end % 4. 计算每个峰的3dB带宽半高全宽FWHM % 对于每个谐振峰在其中心波长附近寻找透射率比峰值高3dB即损耗小3dB的点 % 注意透射率是dB值所以“高3dB”意味着数值上增加3因为损耗减小。 bandwidths zeros(size(resonant_wavelengths)); for i 1:length(resonant_wavelengths) lambda_c resonant_wavelengths(i); depth_c resonant_depths(i); % 定义搜索窗口通常取中心波长左右若干倍于预估宽度的范围 search_half_width 10; % nm idx_range find(wavelength lambda_c - search_half_width wavelength lambda_c search_half_width); wl_range wavelength(idx_range); tr_range transmission_smooth(idx_range); % 寻找左右两侧透射率为 (depth_c 3) dB 的点 target_level depth_c 3; % 左侧交叉点 idx_left find(tr_range(1:end-1) target_level tr_range(2:end) target_level, 1); if isempty(idx_left) [~, idx_left] min(abs(tr_range - target_level)); end % 右侧交叉点 idx_right find(tr_range(1:end-1) target_level tr_range(2:end) target_level, 1, last); if isempty(idx_right) [~, idx_right] min(abs(tr_range - target_level)); end if ~isempty(idx_left) ~isempty(idx_right) idx_right idx_left wl_left interp1(tr_range([idx_left, idx_left1]), wl_range([idx_left, idx_left1]), target_level); wl_right interp1(tr_range([idx_right, idx_right1]), wl_range([idx_right, idx_right1]), target_level); bandwidths(i) wl_right - wl_left; else bandwidths(i) NaN; end end % 5. 可视化原始数据、平滑后数据及分析结果 figure(Position, [100, 100, 1000, 500]); subplot(1,2,1); plot(wavelength, transmission, Color, [0.7, 0.7, 0.7], LineWidth, 0.5, DisplayName, 原始数据含噪); hold on; plot(wavelength, transmission_smooth, b-, LineWidth, 2, DisplayName, 平滑后数据); plot(resonant_wavelengths, resonant_depths, rv, MarkerSize, 10, LineWidth, 2, DisplayName, 检测到的谐振峰); xlabel(波长 (nm)); ylabel(透射率 (dB)); title(LPFG透射光谱处理); legend(Location, best); grid on; % 标记带宽 for i 1:length(resonant_wavelengths) if ~isnan(bandwidths(i)) line_x [resonant_wavelengths(i)-bandwidths(i)/2, resonant_wavelengths(i)bandwidths(i)/2]; line_y [resonant_depths(i)3, resonant_depths(i)3]; plot(line_x, line_y, k--, LineWidth, 1.5); text(resonant_wavelengths(i), resonant_depths(i)5, sprintf(BW: %.2f nm, bandwidths(i)), ... HorizontalAlignment, center, FontSize, 9); end end % 绘制结果表格 subplot(1,2,2); axis off; results_str sprintf(谐振峰分析结果:\n\n); for i 1:length(resonant_wavelengths) results_str [results_str, sprintf(峰 %d:\n, i)]; results_str [results_str, sprintf( 中心波长: %.2f nm\n, resonant_wavelengths(i))]; results_str [results_str, sprintf( 峰值深度: %.2f dB\n, resonant_depths(i))]; if ~isnan(bandwidths(i)) results_str [results_str, sprintf( 3dB带宽: %.2f nm\n, bandwidths(i))]; else results_str [results_str, sprintf( 3dB带宽: 计算失败\n)]; end results_str [results_str, sprintf(\n)]; end text(0.1, 0.9, results_str, VerticalAlignment, top, FontSize, 10, FontName, Monospaced); title(分析结果汇总);这段代码展示了处理LPFG实验数据的完整流程从数据加载、平滑去噪到自动峰值谷值检测再到关键参数中心波长、深度、带宽的提取。在实际研究中你可能会将不同外界刺激如折射率液浓度变化下的多组光谱进行对比分析谐振波长的漂移量与刺激量的关系从而标定传感器的灵敏度。Matlab强大的数据处理和可视化能力让这些分析工作变得高效而直观。4. 正向设计与逆向优化用Matlab充当光栅“设计师”无论是FBG还是LPFG在实际制备前我们都需要进行详细的设计给定目标光谱如特定的中心波长、带宽、边沿滚降我们需要确定光栅的结构参数如周期Λ、长度L、折射率调制剖面δn(z)。这分为两个方向正向设计和逆向优化。正向设计相对直接即给定一组光栅参数通过物理模型如传输矩阵法、耦合模理论计算出其光谱响应。我们在第二部分已经对均匀FBG做了简单的正向仿真。对于更复杂的光栅如切趾FBG折射率调制深度沿长度方向变化用于抑制旁瓣或啁啾FBG周期沿长度方向变化用于制造色散补偿器正向仿真模型会稍复杂但核心仍是求解耦合模方程。Matlab可以轻松实现这些模型的迭代计算和参数扫描。例如我们可以快速扫描光栅长度L对FBG反射谱的影响% 扫描FBG长度参数观察反射谱变化 clear; clc; % 固定其他参数 lambda 1540e-9 : 0.05e-9 : 1560e-9; lambda_B 1550e-9; n_eff 1.45; delta_n 1e-3; % 定义一组长度 L_list [0.005, 0.01, 0.02, 0.04]; % 单位米 figure; hold on; colors lines(length(L_list)); % 获取不同颜色 Lambda lambda_B / (2 * n_eff); kappa pi * delta_n / lambda_B; for i 1:length(L_list) L L_list(i); R zeros(size(lambda)); for j 1:length(lambda) delta 2*pi*n_eff*(1/lambda(j) - 1/lambda_B); s sqrt(kappa^2 - delta^2); if isreal(s) R(j) (kappa^2 * (sinh(s*L))^2) / (s^2 * (cosh(s*L))^2 delta^2 * (sinh(s*L))^2); else s sqrt(delta^2 - kappa^2); R(j) (kappa^2 * (sin(s*L))^2) / (delta^2 - kappa^2 * (cos(s*L))^2); end end plot(lambda*1e9, R*100, Color, colors(i,:), LineWidth, 1.5, ... DisplayName, sprintf(L %.0f mm, L*1e3)); end xlabel(波长 (nm)); ylabel(反射率 (%)); title(不同光栅长度下的FBG反射谱); legend(show); grid on;运行后可以看到随着光栅长度增加反射峰变窄边沿更陡但达到一定长度后峰值反射率接近100%继续增加长度主要影响的是带宽和旁瓣。这种参数扫描对于快速把握设计趋势至关重要。逆向优化则更具挑战性它是正向设计的反问题给定目标光谱寻找最优的光栅参数。这通常没有解析解需要借助优化算法。Matlab的优化工具箱如fmincon,lsqnonlin, 遗传算法ga在这里大显身手。其基本思路是定义一个代价函数Cost Function用来衡量当前参数计算出的光谱与目标光谱之间的差异如均方根误差RMSE然后利用优化算法自动调整参数最小化这个代价函数。假设我们想设计一个特定形状的FBG反射谱比如一个顶部平坦矩形的反射谱。我们可以将光栅沿长度方向分成许多小段每段的折射率调制深度作为优化变量。% 逆向设计示例优化切趾剖面以获得平坦顶反射谱 % 注意这是一个简化的概念性示例实际优化问题维度高需要更精细的设置。 clear; clc; % 目标在1550nm附近得到一个带宽约0.4nm反射率90%的平坦反射谱 lambda_target (1549.8:0.02:1550.2) * 1e-9; % 目标波长范围 R_target 0.9 * ones(size(lambda_target)); % 目标反射率平坦顶 % 将光栅离散为N段每段折射率调制深度为优化变量 N 50; % 段数 L_total 0.02; % 总长度 20mm dz L_total / N; z (0:dz:L_total-dz) dz/2; % 各段中心位置 % 初始猜测均匀调制 delta_n_init 1e-3 * ones(N, 1); % 定义正向模型函数简化使用分段均匀传输矩阵法 % 此处省略详细的传输矩阵乘法实现用一个占位函数表示 % function R_sim forward_model(delta_n, lambda, n_eff, L_total, dz) % ... 计算光谱 ... % end % 定义代价函数模拟光谱与目标光谱的均方误差 cost_func (x) sum((forward_model_simplified(x, lambda_target, n_eff, L_total, dz) - R_target).^2); % 使用优化算法这里用fmincon需要优化工具箱 % 设置边界条件折射率调制深度在合理范围内 lb 1e-5 * ones(N,1); % 下限 ub 2e-3 * ones(N,1); % 上限 options optimoptions(fmincon, Display, iter, MaxFunctionEvaluations, 5000); [delta_n_opt, fval] fmincon(cost_func, delta_n_init, [], [], [], [], lb, ub, [], options); fprintf(优化完成最终误差: %.4e\n, fval); % 绘制优化前后的折射率调制剖面和反射谱 figure; subplot(2,1,1); plot(z*1e3, delta_n_init*1e3, b--, LineWidth, 1.5, DisplayName, 初始剖面均匀); hold on; plot(z*1e3, delta_n_opt*1e3, r-, LineWidth, 1.5, DisplayName, 优化后剖面); xlabel(位置 z (mm)); ylabel(折射率调制深度 \delta n (x10^{-3})); title(FBG折射率调制剖面优化); legend; grid on; subplot(2,1,2); % 计算优化前后的光谱 lambda_plot (1549:0.01:1551) * 1e-9; R_init forward_model_simplified(delta_n_init, lambda_plot, n_eff, L_total, dz); R_opt forward_model_simplified(delta_n_opt, lambda_plot, n_eff, L_total, dz); plot(lambda_plot*1e9, R_init*100, b--, LineWidth, 1, DisplayName, 初始光谱均匀); hold on; plot(lambda_plot*1e9, R_opt*100, r-, LineWidth, 1.5, DisplayName, 优化后光谱); plot(lambda_target*1e9, R_target*100, k:, LineWidth, 1.5, DisplayName, 目标光谱); xlabel(波长 (nm)); ylabel(反射率 (%)); title(反射谱对比); legend; grid on; xlim([1549, 1551]);提示上面的forward_model_simplified函数需要你根据传输矩阵法具体实现。逆向优化是一个计算量较大的过程变量多N个目标函数非线性强。在实际应用中可能需要结合更专业的仿真软件如OptiGrating, FIMMWAVE等进行精确计算而用Matlab作为优化算法的驱动和数据处理平台。此外良好的初始猜测和合理的约束边界条件对优化成功至关重要。5. 从仿真到实测数据处理、标定与常见问题排查当你完成了光纤光栅的设计、制备并搭建好测试系统后Matlab的角色就从“设计师”转变为了“数据分析师”和“故障诊断师”。实测数据往往比仿真模型复杂得多会包含各种噪声、系统误差和非理想效应。1. 光谱数据处理与峰值提取实验测得的光谱数据通常以文本文件.txt, .csv或特定仪器格式保存。Matlab可以轻松读取这些数据。对于FBG核心是精确确定反射峰的中心波长。简单峰值查找findpeaks在噪声大或存在多个邻近峰时可能不准。更稳健的方法是进行曲线拟合。% 对FBG反射峰进行高斯拟合精确提取中心波长 % 假设已加载数据wl (nm), R (反射率线性值或dB值) % 这里使用模拟数据 wl (1549.5:0.001:1550.5); % nm高分辨率扫描 % 生成一个带噪声的高斯峰 center_true 1550.0; amplitude 0.95; width 0.05; % nm R_ideal amplitude * exp(-((wl - center_true)/width).^2); noise 0.02 * randn(size(wl)); R_noisy R_ideal noise; R_noisy max(R_noisy, 0); % 反射率不能为负 % 使用曲线拟合工具箱进行高斯拟合 ft fittype(a*exp(-((x-b)/c)^2), independent, x, dependent, y); opts fitoptions(Method, NonlinearLeastSquares); opts.StartPoint [max(R_noisy), mean(wl), 0.1]; % 初始猜测 [振幅, 中心, 宽度] opts.Lower [0, min(wl), 0]; opts.Upper [1.2, max(wl), inf]; [fitresult, gof] fit(wl, R_noisy, ft, opts); center_fitted fitresult.b; fprintf(真实中心波长: %.4f nm\n, center_true); fprintf(拟合中心波长: %.4f nm\n, center_fitted); fprintf(拟合误差: %.4f pm\n, abs(center_fitted - center_true)*1000); % 可视化 figure; plot(wl, R_noisy, b., MarkerSize, 8, DisplayName, 带噪数据); hold on; plot(fitresult, r-, LineWidth, 2, DisplayName, 高斯拟合); xlabel(波长 (nm)); ylabel(反射率); legend(show); title(sprintf(FBG反射峰高斯拟合 (中心波长 %.4f nm), center_fitted)); grid on;高斯拟合能有效抑制噪声影响提供比简单寻峰更精确、更稳定的中心波长值尤其适用于高精度传感应用。2. 传感器标定得到波长漂移量Δλ后需要将其转换为物理量应变、温度等。这需要通过标定实验确定灵敏度系数。例如进行温度标定时将FBG置于温控箱中记录不同温度下的中心波长然后用Matlab进行线性拟合。% 传感器标定温度灵敏度系数拟合 % 模拟标定实验数据 T_set [20, 30, 40, 50, 60, 70, 80]; % 设置温度 (°C) lambda_measured [1549.800, 1549.902, 1550.005, 1550.108, 1550.210, 1550.313, 1550.415]; % 对应测得的波长 (nm) % 加入微小随机误差模拟测量不确定性 lambda_measured lambda_measured 0.001*(rand(size(lambda_measured))-0.5); % 线性拟合Δλ K_T * ΔT λ0 % Δλ lambda - lambda0, ΔT T - T0 T0 T_set(1); lambda0 lambda_measured(1); delta_T T_set - T0; delta_lambda (lambda_measured - lambda0) * 1e3; % 转换为 pm p polyfit(delta_T, delta_lambda, 1); % 一次多项式拟合 K_T p(1); % 斜率即温度灵敏度系数单位 pm/°C lambda_fit polyval(p, delta_T); fprintf(参考温度 T0 %.1f °C, 参考波长 λ0 %.3f nm\n, T0, lambda0); fprintf(拟合得到的温度灵敏度系数 K_T %.3f pm/°C\n, K_T); fprintf(线性拟合决定系数 R^2 需计算...\n); % 计算R^2 SS_res sum((delta_lambda - lambda_fit).^2); SS_tot sum((delta_lambda - mean(delta_lambda)).^2); R2 1 - (SS_res / SS_tot); fprintf(线性拟合决定系数 R^2 %.4f\n, R2); % 可视化标定曲线 figure; plot(delta_T, delta_lambda, bo, MarkerSize, 8, LineWidth, 2, DisplayName, 实验数据); hold on; plot(delta_T, lambda_fit, r-, LineWidth, 1.5, DisplayName, sprintf(拟合直线: Δλ %.3f * ΔT, K_T)); xlabel(温度变化 ΔT (°C)); ylabel(波长漂移 Δλ (pm)); title(FBG温度灵敏度标定); legend(show); grid on; text(mean(delta_T), mean(delta_lambda), sprintf(K_T %.3f pm/°C\nR^2 %.4f, K_T, R2), ... VerticalAlignment, bottom, HorizontalAlignment, center, BackgroundColor, w);3. 常见问题与排查思路在实验和数据处理中你可能会遇到各种问题Matlab可以帮助你分析和诊断。光谱失真或出现多个峰可能是光栅不均匀、存在啁啾、或者测试系统中存在多模干涉。可以绘制光谱的导数图观察其变化细节。对于FBG均匀光栅的反射谱应大致对称导数过零点对应中心波长。不对称或存在多个过零点则提示结构不均匀。% 检查光谱对称性计算一阶导数 derivative diff(R_smooth) ./ diff(wl); wl_derivative wl(1:end-1) diff(wl)/2; % 导数对应的波长点中点 figure; yyaxis left; plot(wl, R_smooth, b-, DisplayName, 反射谱); ylabel(反射率); yyaxis right; plot(wl_derivative, derivative, r-, DisplayName, 一阶导数); ylabel(导数); xlabel(波长 (nm)); title(反射谱及其一阶导数检查对称性); legend(show); grid on;波长解调不稳定表现为重复测量时中心波长有微小跳动。除了检查光学系统稳定性光源、光谱仪外可以用Matlab计算一段时间内波长读数的标准差Standard Deviation和艾伦方差Allan Deviation以评估系统的短期噪声和长期漂移性能。交叉敏感问题FBG同时对温度和应变敏感。在实际应用中需要区分这两种效应。常见方法包括使用参考光栅温度补偿、双参数矩阵法、或特殊封装。在Matlab中可以建立二元一次方程组来求解应变和温度% 假设有两个FBGFBG1, FBG2灵敏度系数已知 % 灵敏度矩阵: [Δλ1; Δλ2] [K_e1, K_T1; K_e2, K_T2] * [ε; ΔT] K_e1 1.2; % pm/με K_T1 10.0; % pm/°C K_e2 1.19; K_T2 9.8; S [K_e1, K_T1; K_e2, K_T2]; % 灵敏度矩阵 % 实测波长漂移 delta_lambda1 120; % pm delta_lambda2 105; % pm delta_lambda [delta_lambda1; delta_lambda2]; % 求解应变和温度变化 if det(S) ~ 0 result inv(S) * delta_lambda; strain result(1); % με deltaT result(2); % °C fprintf(解算结果应变 %.2f με, 温度变化 %.2f °C\n, strain, deltaT); else fprintf(灵敏度矩阵奇异无法解算。\n); end通过Matlab进行系统化的数据处理、标定和诊断你能从杂乱的实验数据中提取出可靠、精确的传感信息并快速定位系统可能存在的问题极大地提升研发和测试效率。本文还有配套的精品资源点击获取
返回列表