MATLAB实现基于STFT-XGB短时傅里叶变换STFT结合极端梯度提升XGB进行故障诊断分类预测的详细项目实例请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人或者访问对应标题的完整博客或者文档下载页面含完整的程序GUI设计和代码详解在现代工业运行环境中旋转机械、电机驱动装置、齿轮传动系统以及各类涡轮设备正在朝着高速化、智能化和复杂化的方向快速演进。伴随结构复杂度和运行工况多样性的提升各类运行部件的故障模式也愈发隐蔽和多样传统基于经验规则或单一时域/频域分析的诊断方法往往难以在早期准确识别故障特别是在强噪声、工况波动显著、信号非平稳特征突出的实际生产场景中。为了在生产系统中实现对关键设备状态的连续在线监测和可靠的智能诊断需要设计一种兼顾时频信息表达能力和非线性决策能力的复合式数据驱动方法。短时傅里叶变换Short-Time Fourier Transform, STFT是一种经典的时频分析工具通过在时间轴上引入有限长度的滑动窗函数将长时序信号切分为一系列局部片段对每个片段执行傅里叶变换从而得到既含时间信息又含频率信息的二维时频谱。对于机械振动信号、电机电流信号、声发射信号等典型非平稳信号时域波形往往难以清晰体现故障所对应的特征频率分量而标准傅里叶变换仅给出全局频谱无法体现故障在时间上的演化过程。通过STFT形成的时频图可以直观展示不同频率分量能量在时间上的分布使得局部冲击、周期性调制以及瞬态异常在视觉和数值特征上都更加显著非常适合作为后续机器学习或深度学习算法的特征输入。极端梯度提升Extreme Gradient Boosting, XGBoost简称XGB是一种以梯度提升树为核心的集成学习算法通过构建多棵弱学习器决策树并在目标函数中显式加入正则化项兼顾拟合能力和泛化能力。XGB在处理高维特征、非线性边界、多类别分类问题时表现出较强的鲁棒性和精度优势还提供了特征重要性度量、缺失值处理、并行计算等工程化特性使其在工业大规模数据应用中更易落地。在故障诊断场景中将由时频分析提取的统计特征或降维后的时频特征输入XGB模型可以有效刻画不同故障类型在特征空间中的差异实现准确的分类预测。基于STFT和XGB组合的故障诊断流程大致包括三个核心环节首先针对原始振动信号或电流信号进行预处理如去趋势、滤波、归一化等以提高信噪比然后对预处理后信号执行STFT将一维时间序列信息映射到二维时频域将所得时频谱通过统计特征提取如能量分布、中心频率、带宽、纹理特征等或图像降维方法如PCA等转化为结构化特征向量最后将特征向量与对应的健康/故障类别标签一起输入XGB分类器通过训练获得能够区分不同工况的判别模型再用于未知状态样本的类别预测。通过这种“时频表示 梯度提升决策”的结合方式一方面充分利用时频域信息增强故障特征显著性另一方面利用XGB对复杂非线性的表达能力和对特征噪声的抵抗能力在多工况、多故障类型场景下通常能取得优于传统阈值判据或单树模型的诊断性能。在工程实践中对STFT与XGB结合方法有强烈需求的典型场景包括风机齿轮箱的齿裂、点蚀与偏心故障诊断高铁轴承和车轮的早期损伤识别火电厂汽轮机的不平衡、松动、轴承磨损监测化工流程泵和压缩机的振动异常监测等。这些设备通常具有长时间连续运行、故障成本极高、检修窗口有限等特点因此对故障识别及时性、准确性和稳定性要求极高。通过部署基于STFT-XGB的在线诊断系统可以在设备运行过程中持续对采集的振动或电流信号进行时频分析和模式识别实现隐患的早发现、早预警。为了使该方法在工程环境中易于实现本项目以MATLAB R2025b为开发平台。MATLAB在信号处理和机器学习领域具有成熟的函数库和可视化能力能够方便地完成STFT计算、特征构造、模型训练与评估等任务。R2025b版本在UI构建、可视化对象、回归和分类接口等方面具有一些更新和限制本项目在设计代码时充分考虑了这些变化采用figure uicontrol方式构建交互界面避免使用不再推荐的UI组件同时在模型训练与参数设置时遵循该版本的API规范避免出现不兼容的参数组合。整体工程目标是提供一个从原始信号读取、STFT时频特征生成、XGB诊断模型构建到性能评估、可视化展示的端到端示范为后续在真实工业数据上的推广与二次开发奠定基础。在实现层面项目不仅关注分类精度还强调模型可解释性与工程可用性通过特征重要性分析、混淆矩阵、时频图对比等方式帮助维护人员理解故障模式和诊断依据从而增强对智能诊断系统的信任程度。最终期望形成一套可复用的STFT-XGB故障诊断项目模板涵盖数据预处理、特征工程、模型训练、模型调参与结果可视化等完整流程并提供详细注释和解释使后续扩展到其他机械系统、传感信号类型和更多故障类别时只需替换数据和少量参数即可快速迁移和应用。项目目标与意义目标一构建一套完整可复用的STFT-XGB故障诊断流程本项目首先的核心目标是构建一套在MATLAB环境中可直接运行、结构清晰、模块划分合理的STFT-XGB故障诊断流程框架让工程技术人员在面对不同设备、不同传感器采集信号时只需要进行适当的参数调整和数据路径配置即可在该框架上快速实现故障分类模型的训练与预测。具体而言流程需覆盖原始数据导入与预处理、STFT时频分析、时频特征提取与构造、XGB模型训练与交叉验证、模型评估与可视化等环节并以模块化函数或脚本的形式组织便于在工程项目中拆分和重组。该目标的实现能够显著降低基于时频分析和梯度提升法进行故障诊断的实施门槛使原本需要较强信号处理与机器学习理论背景的复杂技术方案通过标准化代码模板的方式快速落地。同时在整个流程中为每个关键参数选择提供合理的默认值和推荐范围如STFT窗长、步长、频率分辨率、中高频带宽划分方式、XGB树深度、学习率、子采样率等帮助工程人员尽量减少在初期调试阶段的试错成本。通过实现这一目标可以将抽象的“时频特征 梯度提升分类”思想转化为一个清晰、可执行的工程实践路径成为后续行业项目的基础骨架。目标二提高非平稳工况下故障识别的准确率与稳定性在复杂工况下如变速变载运行的机械系统、存在频繁启停和工况切换的生产线原始信号呈现强烈非平稳特性传统纯时域或纯频域特征往往难以充分描述故障的动态演化特征容易出现场景迁移后模型性能显著下降的情况。项目的第二个目标是利用STFT所提供的时频联合表示能力将瞬态冲击、间歇性振动、调制侧带等非平稳特征在时间和频率两个维度上同步刻画再通过XGB在高维特征空间中的非线性分割能力将正常工况与不同类型故障在特征空间中更清晰地区分从而提升整体诊断准确率和在不同工况下的稳定性。在该目标下将重点研究合适的时频分辨率与特征构造方式结合XGB对冗余特征的鲁棒性通过适度的特征筛选与正则化提升模型泛化能力并利用交叉验证和多随机划分实验评估模型在不同数据拆分方式下的稳定性表现使诊断结果在面对噪声扰动、采样时间变化以及工况偏移时仍保持较高的可靠性。目标三增强故障诊断过程的可解释性与可视化效果尽管基于梯度提升的集成模型在预测性能上具有明显优势但工业用户往往更加关注模型决策背后的依据和逻辑。项目的第三个目标是在保证分类性能的前提下提高故障诊断过程的可解释性使维护工程师能够通过直观的可视化和特征重要性分析理解不同故障模式在时频特征上的差异与关键判别维度。为此将在项目中加入多个层次的可视化设计一是通过STFT时频谱展示不同故障状态信号在时间和频率上的能量分布差异二是利用特征重要性排名分析XGB模型在判别过程中依赖程度较高的特征如某一频带能量、某一频率段的峰值或纹理统计参数等三是通过混淆矩阵展示不同故障类别之间的易混淆关系帮助识别需要进一步优化特征或采样方案的故障类型。通过这些可视化与解释机制能够增强用户对模型诊断结果的信任程度并为后续改进传感器布局、采样策略和特征工程提供有价值的参考依据。目标四验证STFT-XGB策略在典型机械系统上的通用性与扩展潜力项目的第四个目标是通过在模拟或真实的典型机械系统数据集上进行实验验证STFT-XGB组合策略在不同类型设备、不同故障模式、不同信号来源如振动加速度、速度、位移、电机电流、声学信号上的通用性和扩展潜力。在项目设计中将尽可能采用具有代表性的机械故障场景例如滚动轴承内圈/外圈/滚动体故障、齿轮断齿或磨损、电机转子不平衡等并通过统一流程生成时频特征并训练XGB分类器比较不同场景下的诊断性能差异和特征表现风险。若发现某些故障场景在某些频段或某些时频统计特征上具有明显的区分度将总结其共性和差异为未来扩展至新的设备类型提供指导。同时将在项目中保留接口和结构使得后续可以方便地引入其他时频分析方法如小波变换、S变换或更复杂的集成学习模型如基于随机森林、LightGBM等进行对比从而不断丰富和完善故障诊断方法体系。通过实现这一目标有助于将本项目形成的STFT-XGB诊断方案从单一示例扩展为具有普适性的工程方法论。项目挑战及解决方案挑战一STFT参数选择与时频分辨率之间的矛盾在使用STFT对机械振动或电流信号进行时频分析时窗函数长度、窗类型以及滑动步长的选择直接影响时频分辨率和特征表现力。较长的窗长度可以提供较好的频率分辨率使得相近频率成分更易区分但会导致时间分辨率降低瞬态冲击、短时故障难以在时间轴上精确定位而较短的窗长度则相反能够更清晰地捕捉短时事件却在频率分辨率上表现不佳容易造成频谱模糊和频率成分混叠。这种时间分辨率和频率分辨率之间的矛盾是STFT固有的局限在故障诊断场景中如果参数选择不当可能导致关键故障特征被平滑掉或与背景噪声难以区分从而影响后续XGB模型的判别能力。此外不同设备、不同转速和采样频率的场景对合适的窗长度和频率范围也存在明显差异缺少统一的固定参数。针对这一挑战项目在设计时采用多角度的解决方案。首先根据具体采样频率和设备主要工作频段给出一个合理的窗长度初始推荐值例如选取能够覆盖若干个机械转动周期的采样点数既保证在主要故障特征频率范围内具有足够频率分辨率又兼顾时间局部性需求。其次在工程实现中将窗长度、窗类型如汉明窗、汉宁窗、布莱克曼窗等以及滑动步长设计为可配置参数并通过参数扫描实验或交叉验证评估不同配置对最终分类准确率的影响选取在综合性能最优的参数组合。再次通过对STFT时频谱进行降维和统计特征提取时避免直接依赖时频图上极端精细的局部频率分离而是聚焦于频带能量比、整体能量分布形态等相对稳健的统计量从而降低对极高频率分辨率的依赖。最后针对不同应用场景保留接口使用户能够快速切换参数组合并通过可视化对比不同STFT设置下的时频图和分类结果以较低成本完成参数调优。这种灵活可调和基于性能反馈的参数选择机制在一定程度上缓解了STFT时间-频率分辨率的固有矛盾使时频分析结果更适应故障诊断任务需求。挑战二高维时频特征与XGB模型复杂度控制通过STFT得到的时频谱本质上是一幅二维图像如果直接将其每个时间-频率网格点的幅值作为特征输入XGB模型将产生维度极高的特征向量不仅造成模型训练计算开销巨大也容易引入大量冗余和噪声特征增加过拟合风险降低模型泛化能力。在样本数量有限、故障类别较多的场景中高维特征与有限样本之间的不匹配会使得XGB模型难以稳定收敛并出现训练误差很低而测试误差较高的现象。此外由于梯度提升树通过不断拟合残差来提升拟合能力如果特征空间中存在大量随机波动或非诊断相关成分模型可能会把这些噪声当作可利用的“信号”而进行适配进一步加剧过拟合。因此如何从高维时频谱中有效提取具有代表性的低维结构化特征并合理控制XGB模型的复杂度是本项目面临的第二大挑战。针对这一问题项目在设计特征工程与模型结构时采用多重约束策略。首先在时频特征构造阶段采用按频带和时间段进行分区统计的方法而非逐点展开整个时频矩阵。例如可以对每个样本的时频谱按照预先划分的频率区间和时间片段计算能量和、能量均值、能量标准差、归一化能量占比等特征从而大幅度降低特征维度同时保留主要频带的能量分布信息。其次可以在时频统计特征的基础上增加少量全局特征如整体能量、谱重心频率、带宽、最大峰值所在频段等以增加特征的判别能力而不过度扩张维数。在特征数量控制到合理规模后再将这些特征输入XGB模型。对于XGB部分则通过设置合适的树深度、子样本采样率、特征采样率和正则化参数控制模型复杂度。例如限制最大树深度和每棵树的叶节点数量避免每棵树拟合过细局部噪声通过row subsampling和feature subsampling机制使每棵树只使用部分样本和部分特征增强模型的鲁棒性和泛化能力。在MATLAB实现中还可以通过交叉验证评估不同参数配置下的泛化误差从而在复杂度与性能之间取得平衡。综合采用特征降维、统计特征构造和XGB正则化等策略可以有效缓解高维时频特征带来的模型复杂度挑战。挑战三MATLAB R2025b环境下的实现与兼容性问题项目选用MATLAB R2025b作为开发和运行环境该版本在用户界面组件、图形对象属性以及机器学习函数接口等方面与早期版本存在一定差异。例如部分基于App Designer的高级UI组件在某些部署环境中不建议使用需要采用更基础的figure uicontrol方式构建交互界面ConfusionMatrixChart对象在可视化时不能再作为Axes的子级使用而ColorbarVisible属性被移除取而代之的推荐用法是在figure或axes层面统一设置colormap并建议使用turbo等预设色图在回归和分类函数中部分参数组合不再兼容如fitrlinear对正则化参数和超参数优化的支持方式发生改变fitrnet对部分参数的命名与旧版不同等。尽管XGB本身通常通过独立程序或第三方工具箱调用但整个项目的可视化与辅助分析部分仍需严格遵守R2025b的API规范以避免运行时错误和兼容性问题。此外在工程应用中常常需要将诊断流程封装为UI工具或脚本供非算法工程师使用因此UI组件选型和事件响应机制的适配也成为一项实际挑战。为解决兼容性与实现问题本项目在设计之初便系统梳理了R2025b相关的更新点与限制并在代码编写时采用保守而稳定的实现方式。对于界面交互部分使用经典的figure配合uicontrol创建按钮、文本、下拉菜单等控制组件而不依赖此前版本中较新的高层UI布局对象确保代码在R2025b及后续版本中具有较好的稳定性和可移植性。在混淆矩阵和其他图形展示方面避免将ConfusionMatrixChart嵌套在已有Axes中而是在新建figure上直接创建该对象并通过colormap(figHandle, turbo)形式设置全局色图规避废弃属性带来的问题。对于机器学习函数的使用则重点关注本项目涉及的分类及可视化功能是否与XGB接口存在冲突尽量避免使用已经指出具有不兼容行为的参数组合如fitrlinear的某些正则化配置或fitrnet中不再支持的参数名等。同时在设计整体STFT-XGB流程时将与版本相关的操作集中到少量函数内便于日后随着MATLAB更新进行局部调整。通过这种预先规避问题和集中控制接口的方式可以显著降低因环境差异引起的运行问题使项目更适合作为长期可维护的工程模板。项目模型架构数据采集与预处理模块模型架构的第一层是数据采集与预处理模块负责将来自传感器的振动信号、电机电流信号或其他类型的时序信号转换为适合时频分析和机器学习建模的干净数据。该模块的核心任务包括数据导入、时间轴重建、去趋势、滤波、归一化以及样本分割等步骤。在工程实践中振动信号通常由加速度传感器以固定采样频率采集存储为mat文件、csv或二进制格式电机电流信号则可能来自工业采集卡或智能电机监测装置。数据导入后需要根据采样频率和采样点数建立准确的时间轴为后续STFT计算提供时间基准。预处理过程中的去趋势操作主要用于消除信号中存在的直流偏置和缓慢变化趋势常用的方法包括减去均值、去除线性趋势或利用高通滤波器。在机电系统中低频趋势可能由温度变化、结构变形或缓慢工况变化引起如果不加处理会在频域内产生较强的低频分量干扰对故障相关频段的分析。滤波操作则通常采用带通滤波器保留与设备零件转速、齿轮啮合频率、轴承特征频率等相关的频带将与故障无关的极低频和超高频噪声抑制掉提升信号质量。在MATLAB中可以使用设计好的数字滤波器或简单的Butterworth滤波器进行实现。归一化操作则用于将不同采样段的幅值缩放到类似的数值范围避免在特征统计时某些样本因整体幅值偏大而主导模型学习过程。样本分割部分则根据需要将长时序信号拆分为多个长度固定的片段每个片段视为一个样本以增强数据量并提升模型训练稳定性。STFT时频分析与时频图生成模块模型架构的第二层是STFT时频分析模块该模块将一维时间序列转换为二维时频谱提供时间和频率上的联合信息。STFT的基本原理是对信号进行短时分段对每个分段乘以局部窗函数如汉明窗再对窗内信号执行傅里叶变换从而得到该时间段内的频谱。在时间轴上滑动窗函数并对每个位置重复上述过程即可构成一个二维数组其行索引对应频率列索引对应时间数组元素的复数幅值或模值表示该时刻该频率成分的强度。通过对该矩阵取绝对值平方并进行适当的尺度变换如取对数可得到时频能量谱图这一图像在视觉上表现为随时间变化的频谱强度分布。在故障诊断应用中STFT时频图能够突出显示短时冲击事件、调制频带和特征频率的能量变化。例如滚动轴承故障通常表现为周期性冲击对应在时频图中为沿时间轴周期出现的高频能量增强条纹而啮合齿轮磨损或断齿则可能在齿轮啮合频率及其谐波附近表现为频带能量突变。为了获得清晰的时频图需要合理选择窗长度决定频率分辨率、重叠率决定时间分辨率和窗类型。通常可以根据设备的转速和采样频率选择窗长度使得窗内至少包含若干个主周期以保证频率分辨率同时通过适度重叠如50%或更多平衡时间分辨率。生成时频图后还可以采用对数压缩增强弱特征的可见性并通过颜色映射将能量高低转换为颜色深浅方便后续直观观察和特征提取。时频特征提取与特征构造模块第三层模块负责将高维的时频谱转换为适合作为机器学习输入的低维结构化特征。在直接使用时频图作为图像输入深度网络之外传统机器学习方法通常需要从时频域中提取统计或形态特征用数值向量表示时频图上关键信息。该模块的核心思路是围绕故障类型可能影响的频带和时间段构造特征例如针对转动机械的主轴转频、倍频、轴承特征频率所在频段计算其在整个时频图上的能量总和、能量均值、能量方差、最大值等或者将全频域按照若干个频带进行划分对每个频带在时间上的平均能量和能量波动程度进行统计。还可以在时间轴方向选择起始阶段、中间阶段和末段等多个时间窗口对同一频带的能量变化进行跟踪从而形成时序性统计特征。除能量类特征外还可以提取如谱重心频率加权能量平均、频率带宽、频谱峰值所在频率、频谱峭度等描述频谱形态的参数以捕捉故障引起的频谱结构变化。对于时频图图像本身也可以通过简单的降维操作如对频率维进行加权平均或计算能量投影将二维数据压缩为一维频率分布或时间分布再从中提取统计特征。通过这些步骤可以将原本成百上千维度的时频网格点信息凝聚为几十到上百维的特征向量在保留主要诊断信息的前提下降低维度与噪声影响。该模块设计时将特征选取策略参数化如频带划分方式、统计指标类型等便于针对不同设备类型和故障模式进行调整。XGB故障分类与预测模块第四层模块是XGB故障分类与预测部分其核心是构建一个基于梯度提升树的多类别分类模型利用前一模块输出的特征向量和类别标签进行训练。XGB的基本原理是在给定损失函数如多类别Logistic损失的背景下迭代地添加决策树作为基学习器每一轮训练一棵新树用于拟合先前模型的残差。在构建目标函数时不仅考虑训练误差还加入了对模型复杂度的正则化项如对叶节点权重的L2惩罚和对树结构的复杂度惩罚通过欠拟合与过拟合之间的平衡获得较好的泛化性能。每棵树在划分特征空间时考虑特征与目标之间的梯度信息使得整个模型能够有效捕捉特征与分类标签之间复杂的非线性关系。在故障诊断场景中XGB能够处理高维、非线性、存在冗余特征的场景对于不同故障模式在时频特征上的复杂边界具有较强的表达能力。本项目采用XGB作为分类器时将通过设置树数量、最大深度、学习率、子样本采样率等超参数进行模型配置利用训练集和验证集进行调参以获得最优性能。此外XGB还提供特征重要性评估功能可以基于信息增益或分裂次数统计评估各特征对分类决策的贡献大小帮助分析哪些时频特征对于识别特定故障更为关键。在MATLAB R2025b中通过外部接口或可用工具箱进行XGB训练时需要注意参数传递格式和数据类型并确保训练与预测阶段使用一致的特征处理流程以保持模型输入的一致性。该模块的输出包括训练好的XGB模型对象、对测试集样本的类别预测结果、预测概率以及特征重要性指标。模型评估与可视化模块第五层模块负责对STFT-XGB诊断模型的性能进行全面评估并以图形方式展示关键结果帮助工程人员理解模型表现和故障识别情况。评估指标包括整体分类准确率、每类故障的查准率precision、查全率recall、F1值等还可以计算宏平均和加权平均指标以衡量模型在类别分布不平衡情况下的表现。混淆矩阵是该模块的重要工具用于展示真实标签与预测标签的对应关系通过直观的矩阵形式识别哪些故障类型之间容易混淆从而为特征工程或模型调整提供方向。在MATLAB R2025b中可以使用ConfusionMatrixChart对象在独立figure上绘制混淆矩阵并通过colormap设置色彩映射使用turbo等高对比度色图使混淆程度一目了然。除了分类指标评估模块还将展示典型样本的STFT时频图与预测结果进行对照使工程人员能够直接观察时频特征模式与模型判别之间的关系。对于重要特征可以通过条形图或水平条形图展示XGB特征重要性排名指示哪些频带能量或统计特征对诊断贡献最大。为增强模型诊断过程的透明度还可以对部分决策路径进行简单分析例如展示某一决策树的部分节点分裂条件使用户了解在特定样本上模型做出某种预测的大致逻辑。评估模块的设计目标是将性能指标、可视化结果和解释信息有机结合从多角度验证STFT-XGB诊断模型的有效性并为后续优化提供依据。项目模型描述及代码示例模块一数据读取与预处理示例代码 clear; % 清空工作区变量确保脚本在干净环境下运行避免旧变量干扰结果 close all; % 关闭所有已打开的图形窗口防止新图与旧图叠加影响显示 clc; % 清空命令行窗口内容使后续输出更清晰易读 fs 12000; % 设置采样频率为12000 Hz符合常见滚动轴承和旋转机械振动监测场景 segmentDuration 0.2; % 每个样本片段的持续时间设为0.2秒在该长度内可包含多个转动周期 segmentLength round(fs * segmentDuration); % 将持续时间转换为采样点数用于信号分段 numSegmentsPerClass 50; % 为每种工况设置50个样本片段保证训练与测试数据量适中 t (0:segmentLength-1) / fs; % 根据采样点数与采样频率构建时间向量列向量用于模拟信号与后续分析 f_rotor 30; % 定义旋转频率为30 Hz用于模拟正常工况的主频成分 f_fault1 90; % 定义故障类型1的特征频率为90 Hz例如外圈故障对应的某特征频带 f_fault2 150; % 定义故障类型2的特征频率为150 Hz例如内圈故障或齿轮啮合相关频率 X []; % 初始化特征矩阵为空用于后续存放每个样本的时频特征 Y []; % 初始化标签向量为空用于存放对应的工况类别标签 rng(1); % 固定随机数种子保证噪声与样本生成过程可重复便于调试和结果复现 for k 1:numSegmentsPerClass % 使用for循环为每类工况生成指定数量的样本片段 noise 0.2*randn(segmentLength,1); % 生成高斯白噪声模拟环境噪声和传感器噪声干扰 sig_normal 0.5*sin(2*pi*f_rotor*t) noise; % 构造正常信号为主频正弦波叠加噪声幅值0.5代表正常振动水平 X [X; sig_normal]; % 将当前正常信号片段按行拼接到特征矩阵X中后续将对其提取时频特征 Y [Y; categorical(Normal)]; % 为该样本添加类别标签Normal使用categorical便于后续分类器处理 end % 结束正常工况样本生成循环 for k 1:numSegmentsPerClass % 循环生成故障类型1的样本片段 noise 0.2*randn(segmentLength,1); % 生成与正常工况相同强度的噪声保持噪声水平一致 fault_component 0.4*sin(2*pi*f_fault1*t); % 构造故障特征分量在f_fault1频率上增加正弦波代表故障特征 sig_fault1 0.5*sin(2*pi*f_rotor*t) fault_component noise; % 将正常主频成分、故障分量与噪声叠加得到故障信号 X [X; sig_fault1]; % 将故障类型1的信号片段加入特征矩阵用于后续统一处理 Y [Y; categorical(Fault1)]; % 为该样本添加类别标签Fault1以区分不同故障模式 end % 结束故障类型1样本生成循环 for k 1:numSegmentsPerClass % 循环生成故障类型2的样本片段 noise 0.2*randn(segmentLength,1); % 生成噪声保持与其他工况噪声一致便于公平比较 fault_component 0.4*sin(2*pi*f_fault2*t); % 在f_fault2频率引入故障分量模拟另一种故障特征频率 sig_fault2 0.5*sin(2*pi*f_rotor*t) fault_component noise; % 构造故障类型2信号为主频加故障频率再加噪声 X [X; sig_fault2]; % 将故障类型2的样本片段加入特征矩阵形成完整数据集的一部分 Y [Y; categorical(Fault2)]; % 标签向量增加类别Fault2用于多类别分类 end % 结束故障类型2样本生成循环 X detrend(X,constant); % 对每个样本信号去除常数趋势消除直流偏置提升频谱分析准确性 X X ./ max(abs(X),[],2); % 对每个样本按其绝对最大值进行归一化将幅度缩放到[-1,1]范围内 模块二STFT计算与时频图示例代码 winLength 256; % 设置STFT窗长度为256点在12kHz采样下对应约21.3ms时间分辨率 win hamming(winLength,periodic); % 使用汉明窗作为短时窗函数减小频谱泄漏提高频率分辨率 overlapLength round(0.5*winLength); % 设置窗重叠长度为窗长的50%平衡时间分辨率与计算效率 nfft 512; % 设置FFT点数为512提供较细的频率刻度并兼顾运算速度 sampleIndex 1; % 选择第1个样本用于时频图演示便于验证STFT参数设置效果 sig_example X(sampleIndex,:); % 从特征矩阵中取出对应样本的时域信号序列用作STFT输入 [stftMag, fAxis, tAxis] stft(sig_example, fs, Window, win, OverlapLength, overlapLength, FFTLength, nfft); % 调用stft函数计算短时傅里叶变换返回复数谱、频率轴和时间轴 S abs(stftMag).^2; % 对STFT结果取幅值平方得到功率谱密度作为时频能量的基础表示 S_dB 10*log10(S eps); % 将功率谱转换为分贝单位并加上极小值eps防止对数运算出现负无穷 figure; % 新建图形窗口用于展示时频图 imagesc(tAxis, fAxis, S_dB); % 使用imagesc绘制时频能量图将时间和频率映射到横纵轴并用颜色表示能量 axis xy; % 反转纵轴方向使频率从低到高排列符合习惯阅读方式 xlabel(Time (s)); % 添加横轴标签为时间单位秒便于解释图中时间位置 ylabel(Frequency (Hz)); % 添加纵轴标签为频率单位赫兹直观呈现频率刻度 title(Example STFT Spectrogram of Sample 1); % 设置图形标题说明当前显示的是第一个样本的STFT时频图 colormap(gcf, turbo); % 为当前图形窗口设置turbo色图提高时频能量差异的视觉对比度 colorbar; % 添加颜色条显示分贝值与颜色的对应关系便于定量分析 模块三基于STFT的时频特征构造示例代码 freqBands [0 100; 100 300; 300 600; 600 1000]; % 定义多个频带区间用于在各频带内统计能量特征 numBands size(freqBands,1); % 计算频带个数便于后续循环同时构造多频带特征 numSamples size(X,1); % 获取样本总数以便对每个样本进行STFT和特征提取 featureMatrix zeros(numSamples, numBands*3); % 预分配特征矩阵假定每个频带提取3个统计特征平均能量、最大能量和标准差 for i 1:numSamples % 遍历数据集中所有样本逐个计算时频特征 sig X(i,:); % 取出第i个样本的时间序列用于STFT分析 [stftMag_i, fAxis_i, ~] stft(sig, fs, Window, win, OverlapLength, overlapLength, FFTLength, nfft); % 针对当前样本执行STFT计算获得样本专属的频率轴和时频谱 S_i abs(stftMag_i).^2; % 计算当前样本的功率谱密度矩阵用于频带能量计算 featVec []; % 初始化当前样本的特征向量为空后续逐频带拼接统计特征 for b 1:numBands % 遍历每个频带区间提取对应频带的能量特征 fLow freqBands(b,1); % 读出当前频带的下限频率用于频带筛选 fHigh freqBands(b,2); % 读出当前频带的上限频率用于频带筛选 idxBand fAxis_i fLow fAxis_i fHigh; % 根据频率轴构造逻辑索引选出位于该频带的频率点 S_band S_i(idxBand,:); % 利用逻辑索引获取该频带在所有时间点上的功率谱子矩阵 bandEnergyTime sum(S_band,1); % 对频率维求和得到随时间变化的频带总能量序列 meanEnergy mean(bandEnergyTime); % 计算该频带能量序列的平均值作为频带平均能量特征 maxEnergy max(bandEnergyTime); % 计算该频带能量序列的最大值捕捉极端能量冲击特征 stdEnergy std(bandEnergyTime); % 计算该频带能量序列的标准差衡量能量波动程度 featVec [featVec, meanEnergy, maxEnergy, stdEnergy]; % 将当前频带的三个特征拼接到样本特征向量末尾 end % 完成当前样本各频带特征统计 featureMatrix(i,:) featVec; % 将当前样本的完整特征向量写入特征矩阵对应行位置 end % 完成所有样本的时频统计特征提取 featureMatrix normalize(featureMatrix, 1); % 对特征矩阵按列进行归一化处理将每个特征缩放到零均值和单位方差附近 模块四训练集与测试集划分示例代码 cv cvpartition(Y, HoldOut, 0.3); % 使用cvpartition按类别分层随机划分数据集预留30%样本作为测试集 idxTrain training(cv); % 获取训练集样本的逻辑索引标记哪些样本分配到训练集 idxTest test(cv); % 获取测试集样本的逻辑索引标记哪些样本分配到测试集 XTrain featureMatrix(idxTrain,:); % 从特征矩阵中选取训练集样本的行构成训练特征 YTrain Y(idxTrain); % 从标签向量中选取训练集样本的标签形成训练标签 XTest featureMatrix(idxTest,:); % 从特征矩阵中选取测试集样本的行构成测试特征 YTest Y(idxTest); % 从标签向量中选取测试集样本的标签形成测试标签 figure; % 新建图形窗口用于展示类别分布 histogram(YTrain); % 绘制训练集类别标签的直方图检查各类样本数量是否均衡 xlabel(Class); % 设置横轴标签为类别用于标注X轴所代表的意义 ylabel(Count); % 设置纵轴标签为数量表明每个类别的样本数 title(Training Set Class Distribution); % 设置图形标题说明该图展示训练集中的类别分布情况 模块五XGB模型训练与预测示例代码 在MATLAB R2025b中可通过外部脚本调用已安装的XGBoost库或基于系统命令运行XGBoost训练过程。下述示例采用将特征与标签导出为csv文件使用外部命令行XGBoost训练模型然后再读取预测结果的方式展示XGB接入流程。此处示例代码演示接口思路和关键步骤。 trainData [double(XTrain), double(grp2idx(YTrain))]; % 将训练特征与标签索引拼接为矩阵并转换为double类型便于写入文件 testData double(XTest); % 将测试特征转换为double类型矩阵为外部XGBoost预测输入做准备 trainFile xgb_train_data.csv; % 定义训练数据文件名用于XGBoost命令行读取训练数据 testFile xgb_test_data.csv; % 定义测试数据文件名用于XGBoost命令行读取测试特征 writematrix(trainData, trainFile); % 将训练矩阵写入csv文件每行包含一个样本的特征和最后一列标签 writematrix(testData, testFile); % 将测试特征矩阵写入csv文件不包含标签列仅供预测使用 paramFile xgb_params.conf; % 定义XGBoost参数配置文件名用于描述模型训练的超参数设置 fid fopen(paramFile,w); % 打开配置文件进行写入如果文件不存在则创建新文件 fprintf(fid,objectivemulti:softprob\n); % 指定多分类问题的目标函数输出每类概率适合故障类别预测 fprintf(fid,num_class%d\n, numel(categories(YTrain))); % 设置类别数量与训练标签的类别数一致保证模型输出维度正确 fprintf(fid,eta0.1\n); % 设置学习率为0.1平衡收敛速度与过拟合风险 fprintf(fid,max_depth4\n); % 设置每棵决策树的最大深度为4控制模型复杂度防止过拟合 fprintf(fid,subsample0.8\n); % 设置子采样率为0.8使每棵树仅使用部分样本以增强泛化能力 fprintf(fid,colsample_bytree0.8\n); % 设置特征子采样率为0.8使每棵树仅使用部分特征以降低特征相关性 fprintf(fid,num_round80\n); % 设置迭代轮数为80表示训练80棵树以逐步提升模型拟合能力 fclose(fid); % 关闭配置文件确保所有参数行已写入磁盘 modelFile xgb_model.bin; % 定义训练得到的模型文件名以二进制形式保存XGBoost模型 predFile xgb_pred.txt; % 定义预测输出文件名存放测试样本的类别概率或类别预测结果 trainCmd sprintf(xgboost %s data%s model_out%s, paramFile, trainFile, modelFile); % 构造命令行字符串调用xgboost可执行文件训练模型 system(trainCmd); % 使用system函数在操作系统命令行执行训练命令生成模型文件 predCmd sprintf(xgboost %s taskpred model_in%s test:data%s pred:%s, paramFile, modelFile, testFile, predFile); % 构造命令行字符串调用xgboost进行测试集预测 system(predCmd); % 使用system函数执行预测命令生成包含预测结果的文本文件 predProbs readmatrix(predFile); % 从预测结果文件中读取数值矩阵每行对应一个样本的各类别概率 [~, predIdx] max(predProbs, [], 2); % 对每行概率取最大值所在列作为预测类别索引 classList categories(YTrain); % 获取训练标签的类别列表以保证索引与实际类别名称对应 YPred categorical(classList(predIdx)); % 将预测索引映射为类别名称并转换为categorical类型便于与真实标签比较 模块六模型评估与混淆矩阵可视化示例代码 accuracy mean(YPred YTest); % 计算预测标签与真实标签相等的比例得到整体分类准确率 disp([Overall accuracy: , num2str(accuracy)]); % 在命令窗口打印准确率数值以便快速查看模型性能 confMat confusionmat(YTest, YPred); % 计算混淆矩阵统计每个真实类别被预测为各类别的样本数量 figure; % 新建图形窗口用于展示混淆矩阵图表 cmChart confusionchart(confMat, categories(YTest)); % 创建ConfusionMatrixChart对象根据混淆矩阵和类别标签绘制混淆矩阵图 cmChart.Title STFT-XGB Fault Diagnosis Confusion Matrix; % 设置混淆矩阵图表的标题说明图表内容与模型来源 cmChart.RowSummary row-normalized; % 设置按行归一化显示便于比较每个真实类别的分类比例 cmChart.ColumnSummary column-normalized; % 设置按列归一化显示便于分析每个预测类别的组成来源 colormap(gcf, turbo); % 将当前图形窗口的色图设置为turbo提高矩阵中数值高低的色彩对比效果 numFeatures size(featureMatrix,2); % 获取特征维度数量用于构造特征重要性示例 featureImportance rand(numFeatures,1); % 随机生成一组特征重要性值作为占位示例实际工程中应从XGBoost模型读取 featureImportance featureImportance / sum(featureImportance); % 将特征重要性归一化使其总和为1便于相对比较 [sortedImp, idxImp] sort(featureImportance,descend); % 对特征重要性从大到小排序并记录排序后的索引 topK min(10, numFeatures); % 选择前10个最重要特征作为展示上限如果特征总数少于10则选择全部 figure; % 新建图形窗口用于绘制特征重要性条形图 bar(sortedImp(1:topK)); % 绘制前topK个特征的重要性条形图条形高度代表相对重要性大小 xlabel(Feature Index (sorted)); % 设置横轴标签表示排序后的特征索引 ylabel(Normalized Importance); % 设置纵轴标签表示归一化的特征重要性值 title(Top Feature Importances from XGB (示例)); % 设置图形标题说明当前展示的是XGB特征重要性示例更多详细内容请访问http://信号处理MATLAB实现基于STFT-XGB短时傅里叶变换STFT结合极端梯度提升XGB进行故障诊断分类预测的详细项目实例含完整的程序GUI设计和代码详解_LSTM时间序列预测 Python代码实现资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90241707https://download.csdn.net/download/xiaoxingkongyuxi/90241707http:// https://download.csdn.net/download/xiaoxingkongyuxi/90241707