项目介绍 MATLAB实现基于STFT-SVM短时傅里叶变换(STFT)结合支持向量机(SVM)进行故障诊断分类预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的
MATLAB实现基于STFT-SVM短时傅里叶变换STFT结合支持向量机SVM进行故障诊断分类预测的详细项目实例请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人或者访问对应标题的完整博客或者文档下载页面含完整的程序GUI设计和代码详解工业装备、电力系统、交通运输装备以及各类旋转机械在长期运行过程中都会受到载荷波动、环境扰动、材料老化等多种因素影响从而逐渐产生不同形式的故障例如滚动轴承的内外圈剥落、斜齿轮磨损、电机转子不平衡、风机叶片裂纹等。传统运维模式往往依靠定期检修与人工巡检依赖经验判断和肉眼观察很难做到对早期微弱故障的及时识别容易出现“带病运行”或“过度检修”。随着工业自动化和智能制造的发展基于数据驱动的故障诊断逐渐成为保障设备安全、稳定、高效运行的关键技术之一在智能运维、预测性维护和状态监测中占有重要地位。在众多信号分析方法中时域指标和纯频域指标长期作为机械故障诊断的基础手段但对于转速变化、工况切换和负载波动等引起的非平稳振动信号纯粹依赖时域均值、均方根、峰值因子或单一频域幅值谱容易遗漏故障早期特征。非平稳信号具有典型的时间局部性及频率时变特性例如在短时间内出现的冲击、撞击或周期性调制结构这类信息在传统整段傅里叶变换中会被平均抹平导致特征模糊诊断性能下降。短时傅里叶变换Short-Time Fourier Transform, STFT通过在时间轴上引入滑动窗口将长时程信号切分为一系列短时片段对每个时间片进行傅里叶变换从而在时间–频率平面上刻画信号能量随时间和频率变化的分布情况具体表现为时频谱或时频图。通过合理的窗函数长度、重叠率和采样频率设置STFT能够比较全面地捕捉到故障信号中时间局部性很强的冲击和调制成分在非平稳工况下相较于传统频谱分析具有更大的优势。另一方面故障诊断最终需要将提取到的特征映射到具体的故障类型或健康状态标签。支持向量机Support Vector Machine, SVM是一种广泛应用于模式识别和分类任务的监督学习模型具有良好的泛化能力和鲁棒性尤其适合样本数量有限、特征维度较高、类别边界相对复杂的工程场景。SVM通过在特征空间中构造最大间隔的超平面将不同类别样本尽量分开并可通过核函数将原始特征映射到高维空间以处理非线性可分问题。线性核、多项式核、高斯径向基核等不同核函数配置使得SVM在处理机械振动、声学信号、温度序列等多源数据时具备灵活调整决策边界的能力。由于机械设备的健康状态往往受多种因素同时影响且故障类别之间边界并不简单直线分割SVM在故障诊断中表现出较强的稳定性和工程适用性。短时傅里叶变换生成的时频谱往往维度较高例如对一个几秒的振动信号进行高分辨率STFT分析得到的是时间–频率二维矩阵其中每一个元素对应特定时间窗和特定频带的能量信息。如何从这个高维时频矩阵中构造能反映故障本质差异且易于分类器处理的特征是构建高性能故障诊断系统的重要环节。常见做法包括提取各典型故障频带上的平均能量、峰值能量、能量重心计算时频能量沿时间轴或频率轴的统计量或者对时频谱进行降维处理如选取若干关键频带或使用主成分分析以平衡信息量与计算复杂度。将这些特征输入SVM分类器经过训练后就可以根据新的时频特征向量预测当前样本所属的健康状态或故障类型实现自动化故障诊断。MATLAB在信号处理、机器学习和可视化方面提供了完整的工具链尤其适合构建基于STFT和SVM的故障诊断原型系统。利用Signal Processing Toolbox可以方便地实现STFT计算、窗函数设计、频谱分析以及信号预处理操作Statistics and Machine Learning Toolbox提供fitcsvm、crossval、predict等函数便于建立分类模型、进行参数调节和性能评估。R2025b版本对部分函数行为和图形属性进行了规范更新虽然在本项目中主要使用的STFT与SVM相关函数仍保持兼容但在绘图时需要注意colormap的调用方式、colorbar的属性更新方式以及分类结果可视化时ConfusionMatrixChart对象的使用方式等。本项目在设计和编写代码时将紧贴R2025b的行为规范提升代码可移植性和鲁棒性。通过构建基于STFT–SVM的故障诊断项目一方面可以完整展示从原始振动信号采集、预处理、特征提取到分类预测的完整流程另一方面也为后续引入更复杂的特征如时频熵、多尺度能量指数、集成学习方法甚至深度学习模型奠定基础。在工程实践中这一方案既能作为独立的诊断模块部署在数据采集系统或边缘计算设备中实现在线故障监测又可以作为研究实验平台用于探索不同参数配置对诊断性能的影响。项目关注点包括时频分析参数对特征稳定性的影响、SVM核函数与超参数对分类边界的塑造效果、不同故障程度样本的识别难度等内容并给出相应的MATLAB实现。通过这些设计内容可为机械运维工程人员、算法开发工程人员及相关研究人员提供一个可运行、可扩展、可复现的STFT–SVM故障诊断实现实例。项目目标与意义故障信号时频特征的高效提取与可视化本项目首先希望在时频分析层面构建一套稳定、可解释、操作简洁的特征提取流程使得非平稳振动信号的关键特征能够在时间–频率平面中清晰呈现。通过STFT对原始振动信号进行分段分析能够获得每个时间片上的频段能量分布形成时频谱矩阵直观反映故障特征随时间演化的规律。该目标的重要性在于许多旋转机械故障在早期阶段表现为短暂而不稳定的冲击与调制由于信号能量较弱、出现时刻不固定仅采用整段频谱很难观察到明显的特征峰值。通过合理选择窗函数类型、窗长、重叠率与FFT点数可以在时间分辨率与频率分辨率之间取得较好折中使故障相关能量在特定频带与时间片段中显著突出从而为后续分类提供扎实基础。与此同时时频谱的可视化图像可以为工程技术人员提供直观参考便于在模型开发阶段通过图像观察诊断结果与物理机理是否一致并辅助定位窗口参数设置是否合理。该目标还关注高频噪声抑制、背景能量基线消除、不同故障类型的时频模式差异分析以便在特征构造阶段聚焦故障敏感频段避免冗余数据造成无效计算负担。支持向量机分类模型构建与优化本项目的重要目标之一是利用SVM实现多故障类别的有效区分并在样本数量有限、分布不完全均衡的条件下实现较高的分类精度与良好泛化能力。通过将STFT提取的特征映射到一个适当的特征空间SVM可以构建最大间隔的分类超平面以较强的鲁棒性应对噪声与局部异常数据。目标包括选择合适的核函数如线性核、高斯核通过网格搜寻或经验调节方式配置惩罚参数与核宽度并利用交叉验证估计模型在未知数据上的表现从而避免过拟合或欠拟合。相比一些复杂的深度模型SVM参数较少、训练成本较低适合部署在资源有限的工业设备和边缘计算平台中。本项目还将关注特征标准化、类别权重调整与多类SVM结构设置如一对一、一对多策略以便处理不同故障类别样本数量不一致的问题。通过系统的模型构建与优化使STFT–SVM诊断方案在多种工况下具有稳定的分类决策能力并可为后续性能对比与模型替换提供基准。完整的MATLAB实现流程与工程可复现性项目目标之一是构建一个从数据导入、预处理、特征提取、模型训练、预测验证到性能评估的完整MATLAB实现示例强调代码可运行、结构清晰、参数可修改便于工程技术人员在不同设备和不同场景下进行二次开发与扩展。实现过程中将遵循R2025b版本的函数和属性规范避免使用已经不推荐或行为变动较大的接口同时在代码中通过详细注释说明每一行命令的目的与作用便于快速理解和定位问题。项目希望实现合理的模块划分例如数据读取函数、STFT特征构造函数、SVM训练与预测脚本等使整个流程逻辑清楚、可维护性高。在工程应用中常需要根据实际传感器类型、采样频率及工况切换方式对参数进行快速调整此目标通过给出参数变量化的写法和清晰注释使使用者能在不改变主流程结构的前提下方便地替换数据源、调整窗长、改变频带范围或重新训练分类器以适应不同设备与任务需求。支持后续扩展的故障诊断技术验证平台本项目还希望构建一个便于扩展的故障诊断技术验证平台在完成STFT–SVM基础方案的同时为后期引入更丰富特征和更复杂模型留出空间。例如可在STFT特征基础上增加包络谱、希尔伯特变换特征或与小波变换、经验模态分解等方法组合以提升对非线性和非平稳信号的描述能力也可在分类器部分尝试集成学习模型如随机森林、梯度提升树等或与浅层神经网络进行比较分析。通过此平台可方便地对不同特征组合、不同分类器配置、不同样本采集方案进行实验评估形成一套可重复验证的实验框架。同时该平台也可用于研究数据量、噪声水平、故障严重程度等因素对诊断性能的影响为合理设计数据采集策略和运维策略提供参考。此目标的意义在于不仅输出一个当前可用的诊断方案更提供一个持续迭代和研究的技术载体推动机械设备智能诊断方法的持续优化和实际落地。项目挑战及解决方案非平稳与噪声环境下的时频参数选择与特征稳定性机械振动信号在实际工况中常呈现明显的非平稳特征转速变化、载荷突变、启停过程等都会导致频率成分与能量分布随时间快速变化。STFT作为固定窗长的时频分析方法时间分辨率与频率分辨率之间存在互斥关系窗长较短时能更好地定位冲击发生时刻但频率分辨率降低窗长较长时频率分辨率较高却难以分辨短时突变。一旦窗长选择不合适故障相关频带能量会被扩散或局部平均导致特征不够突出。同时现场采集的信号中通常存在环境噪声、电磁干扰及结构共振等复杂成分这些因素会在时频谱上形成背景能量和伪特征影响特征提取的稳定性。针对这一挑战项目采用多层次的解决思路第一在STFT参数设置上通过定义采样频率、目标频率分辨率和目标时间分辨率之间的关系给出一组工程上可行的初始窗长并通过观察典型样本的时频谱微调窗长与重叠率使故障特征峰能够清晰可辨。第二在窗函数选择方面优先选择Hamming或Hann窗等具有较好旁瓣抑制性能的窗函数以降低频谱泄漏对特征的干扰。第三在特征构造阶段不直接使用整幅时频谱而是针对已知故障频带和谐波结构提取局部频带的能量统计量并对时间轴进行平均或局部聚合以减弱噪声引起的随机波动。第四通过对多组样本重复提取时频特征并分析特征在同一故障类别内部的方差和稳定性选择对噪声更为鲁棒的特征组合。这样在非平稳和噪声环境下STFT特征仍然能够保持较好的重现性与诊断敏感性。特征维度较高与样本数量有限条件下的模型泛化能力STFT产生的时频矩阵维度较高如果直接将全部时频点作为特征输入SVM不仅会带来巨大的计算开销还容易造成“维度灾难”使模型在训练数据上表现很好却在测试数据上泛化能力不足。此外实际工程中常见情况是正常样本数量相对充足而某些故障类别样本较少尤其是严重故障或极端工况样本采集数量有限样本分布不平衡使得分类器更倾向于预测为样本数较多的类别从而降低对少数类故障的识别率。为解决这一挑战项目在特征构造和模型训练层面做出多个策略设计。首先在时频特征构造阶段采用频带聚合与统计量提取的方式将高维时频谱压缩为一组代表性较强的一维特征例如在若干关键频带上计算平均能量、最大能量、能量标准差或能量重心显著降低特征维度。其次针对不同特征之间可能存在相关性的问题可在后续扩展中引入主成分分析等降维方法保留主要方差信息进一步提高特征的紧凑性。再次在SVM模型训练过程中通过对样本进行分层划分训练集与测试集确保各类别在训练与验证中均有一定比例以便更合理地评估泛化性能。同时可按类别权重调整惩罚参数使少数类样本在损失函数中获得较大权重减轻类别不平衡影响。通过以上设计使得在样本数量不充足、时频特征维度较高的情况下SVM仍能建立具有良好泛化能力的分类边界提高对罕见故障的识别率。MATLAB R2025b版本规范与可视化展示限制带来的实现细节问题MATLAB R2025b对部分函数接口和图形对象属性进行了调整虽然不会直接影响STFT与SVM的核心算法但在可视化与模型评估环节需要特别注意。例如ColorbarVisible属性已被移除调用colorbar或设置相关属性时需采用新的方式colormap函数不再支持将ConfusionMatrixChart对象作为第一个输入参数必须将figure或axes作为目标对象ConfusionMatrixChart自身也不能被设置为某些图形对象的子级。在故障诊断项目中混淆矩阵常用于展示各类样本的分类正确率与误分类模式如果调用方式不符合R2025b规范就可能出现运行错误或图形无法正常显示。此外部分统计学习函数在参数优化时也有一些限制如fitrlinear相关参数规范变化虽与本项目中的fitcsvm并不完全相同但提示在使用高层API时要避免组合无效的参数名尤其是在进行交叉验证或超参数优化时需要遵守特定约束。为应对这些实现细节上的挑战项目在绘制时频图与混淆矩阵时将明确采用figure与axes句柄控制图形属性并按照R2025b要求调用colormap(fig, turbo)形式混淆矩阵使用confusionchart函数时以单独的figure承载并避免将其嵌套于不兼容的图形结构中。SVM模型训练与评估过程中尽量采用fitcsvm、crossval、predict等成熟接口不引入与R2025b有潜在冲突的高级优化选项保持脚本的版本兼容性。在代码注释中也明确说明相关版本行为注意点以便在未来版本升级或环境迁移时快速查找与修正。通过对这些实现细节的预先规避整个项目能够在R2025b环境下顺畅运行提升实用性和稳定性。项目模型架构原始振动信号采集与预处理模块模型架构的起点在于原始振动信号的获取与预处理这一模块负责将设备运行状态下采集到的时间序列数据转换为适合时频分析与模式识别的基础数据。信号采集可以来自加速度传感器、位移传感器或速度传感器也可以是电流、电压等电量信号只要能够反映设备机械状态或电磁状态。采样频率fs需要根据设备的最高感兴趣频率进行设计通常遵循奈奎斯特采样定律即采样频率至少为最高特征频率的两倍但在工程实践中往往选择更高的采样频率以便获得更丰富的高频信息。信号采集后首先进行去趋势处理与直流分量消除避免低频漂移对频谱分析的影响同时可采用带通滤波器抑制环境超低频和高频噪声使信号能量集中在机械结构的主要响应频段。对于存在明显异常波动或干扰脉冲的记录也可以通过阈值检测与窗口剔除进行初步清洗。预处理模块还可包括归一化处理使不同工况或不同传感器的信号振幅在统一尺度上进行比较从而避免特征提取阶段因量纲差异造成不必要的偏差。在MATLAB中可以使用detrend进行去趋势使用设计的IIR或FIR带通滤波器完成滤波操作整个模块以函数形式封装输入原始信号与采样频率输出滤波与归一化后的洁净信号。该模块的合理性直接影响后续STFT结果的清晰度和特征的可靠性因此在架构中占据基础且关键的位置。短时傅里叶变换与时频特征构造模块在信号预处理完成后模型进入时频分析阶段通过STFT将一维时间序列映射为二维时间–频率表示。STFT的理论基础是将信号乘以一个时间局部窗函数然后对窗口内的信号执行离散傅里叶变换通过随着时间滑动窗函数获得一系列局部频谱从而形成时频矩阵。数学上可表示为对每个时间t和频率f计算信号与窗函数的乘积并进行傅里叶变换。窗函数常见有Hamming、Hann、Blackman等窗长的选择体现时间与频率分辨率的折中。STFT的输出通常是一组复数频谱实际应用中关注其幅值或功率谱作为能量分布的度量。在项目模型架构中该模块不仅仅执行STFT计算还负责从时频矩阵中提取有效特征。具体而言在时频平面上将频率轴划分为若干频带例如根据设备转速确定基频与若干倍频附近的带宽在每个频带上计算能量平均值、最大值、能量中心频率等指标并可沿时间轴进行平均或统计从而将二维矩阵压缩为一个一维特征向量。此外根据不同故障类型的特性还可以在特定时间窗内统计某些频带的瞬时峰值与持续时间构造更具区分度的特征组合。此模块采用函数形式输入预处理后的信号与STFT参数窗长、重叠率、FFT点数输出一组结构化的特征向量及对应标签为后续机器学习模块提供统一接口。通过在架构中设定清晰的参数接口可以方便地调整时频分析的细节以适应不同设备或不同故障模式。支持向量机分类与训练模块在特征构造完成后模型架构进入分类器构建阶段。SVM的核心思想是通过寻找一个在特征空间中最大化类间间隔的超平面将不同类别样本分离开来。在二类问题中SVM目标是找到一个权重向量和偏置使得间隔最大并同时满足分类约束。在软间隔SVM中允许一定误分类通过惩罚参数C控制间隔与误分类的权衡在多类问题中则通过一对多或一对一的组合策略将多个二类SVM模型组合成多类分类器。为处理特征的非线性可分情况可以通过核函数将原始特征映射到高维空间在该空间中寻找线性可分超平面。常用核函数包括线性核、多项式核和高斯径向基核等其中高斯核适合处理边界复杂但样本量有限的情况。本项目模型架构中SVM训练模块接收特征矩阵X和标签向量Y使用fitcsvm函数建立分类模型并通过交叉验证测评精度与泛化能力。在参数调节方面可以对核函数类型、核尺度和惩罚参数进行搜索以找到在验证集上表现较优的组合。训练完成后模型对象保存在工作区或外部文件供预测模块调用。该模块也可容纳模型保存与加载功能使得在实际部署中不必每次重新训练而是直接导入已训练好的模型进行在线预测。通过将SVM分类模块与特征构造模块解耦整个架构具备良好的可扩展性便于替换或并行测试其他分类器。模型评估与可视化分析模块任何故障诊断模型在投入应用前都需要进行系统的性能评估。模型评估模块在架构中承担了计算分类准确率、召回率、F1指标等统计量的任务同时借助图形可视化帮助理解模型行为。常用的评估工具包括混淆矩阵、ROC曲线、类别精度条形图等。混淆矩阵展示真实标签与预测标签的交叉统计结果可以直观观察哪些故障类别易混淆是否存在某类样本长期被误判为正常或其他类别的问题。Accuracy反映总体正确率但在类别不平衡条件下需要结合每类的Recall和Precision综合考量。项目架构中评估模块接收预测结果和真实标签使用内置函数计算各项指标并通过confusionchart绘制混淆矩阵。考虑R2025b版本限制绘制混淆矩阵时采用单独figure并使用colormap(fig, turbo)设置色彩映射避免对ConfusionMatrixChart对象错误调用colormap。除分类指标外该模块还可绘制部分样本的时频谱和分类结果对比图例如对某个样本展示其时频图和SVM决策输出用于分析为何该样本被判为某类状态。评估模块的存在使得整个架构形成闭环通过指标和可视化反馈反向指导特征提取参数和模型配置的调整是保障诊断系统可靠性的关键环节。整体流程控制与参数管理模块整个STFT–SVM故障诊断系统需要一个统一的流程控制与参数管理模块将数据读取、预处理、特征提取、模型训练、预测评估等环节串联起来并管理各种关键参数配置。该模块可以采用脚本或主函数的形式通过结构体或配置脚本集中定义采样频率、信号时长、窗长、重叠率、FFT点数、特征频带范围、SVM核函数类型、惩罚系数等参数并在各子模块调用时传递。通过参数集中管理可以方便地对不同试验方案进行对比例如在测试不同窗长设置对诊断性能的影响时只需修改配置区域而无需改动各子模块内部代码。此外流程控制模块负责划分训练集和测试集执行多次随机划分试验以评估模型稳定性并还可在需要时加入结果保存功能将特征矩阵、模型对象、评估指标输出到外部文件以支持后续离线分析。在工程应用场景中流程控制模块还可以扩展为周期性执行任务的调度脚本例如每隔固定时间读取最新采集的设备数据运行预处理与预测流程将诊断结果上传至监控系统。通过清晰的流程控制与参数统一管理本项目模型架构不仅便于实验与调试也为未来部署与二次开发提供了清晰框架。项目模型描述及代码示例数据准备与预处理示例 t 0:1/12000:1-1/12000; % 生成从0到1秒的时间序列采样频率为12000Hz对应常见振动采集设置 x_normal 0.2sin(2pi100t) 0.1sin(2pi300t); % 构造正常状态下的振动信号包含100Hz和300Hz两种稳定谐波分量幅值较小表示振动较平稳 x_fault 0.2sin(2pi100t) 0.1sin(2pi300t) 0.4sin(2pi500t).* (t0.3 t0.6); % 构造故障状态信号在正常成分基础上叠加500Hz频率分量并限制在0.3s到0.6s出现模拟带故障时短时高频冲击 x_normal x_normal 0.05randn(size(t)); % 为正常信号加入均值为0标准差为0.05的高斯噪声模拟传感器噪声与环境干扰 x_fault x_fault 0.05randn(size(t)); % 为故障信号同样加入噪声使两个状态都包含随机扰动更接近实际采集数据 x_normal detrend(x_normal); % 对正常信号进行去趋势处理消除低频漂移与直流成分对频谱分析的影响 x_fault detrend(x_fault); % 对故障信号进行去趋势处理使信号以零均值为中心有利于后续分析与比较 x_normal x_normal / max(abs(x_normal)); % 将正常信号通过最大幅值归一化到[-1,1]范围便于不同工况信号在统一尺度上处理 x_fault x_fault / max(abs(x_fault)); % 对故障信号进行同样的归一化操作减少振幅差异带来的特征偏移 fs 12000; % 定义采样频率变量fs为12000Hz后续各函数需要该参数进行频率轴刻度和STFT计算 figure; % 新建一个图形窗口用于绘制时间波形对比图 plot(t, x_normal); % 在图形窗口中绘制正常信号的时间波形横轴为时间纵轴为振幅 hold on; % 保持当前图形允许在同一坐标轴上叠加绘制另一条曲线 plot(t, x_fault); % 在同一坐标系中绘制故障信号的时间波形便于对比两个状态的差异 legend({Normal,Fault}); % 添加图例标注蓝色曲线为正常状态橙色曲线为故障状态 xlabel(Time / s); % 设置横轴标签为时间秒提升图形可读性 ylabel(Amplitude); % 设置纵轴标签为振幅表明曲线表示信号强度 title(Time-domain signals for normal and fault states); % 为图形添加标题说明展示的是正常与故障状态的时域信号对比 STFT时频分析与特征提取示例 win_length 512; % 设置短时傅里叶变换的窗长度为512点在采样频率12000Hz下对应约42.7毫秒窗宽 win hamming(win_length); % 生成长度为512的Hamming窗具有较好旁瓣抑制效果减少频谱泄漏 overlap round(0.75*win_length); % 设置窗之间的重叠长度为窗长的75%提高时间采样密度平滑时频图 nfft 1024; % 设置FFT点数为1024通过零填充提高频率分辨率使频率刻度更精细 [stft_normal,f_stft,t_stft] stft(x_normal,fs,Window,win,OverlapLength,overlap,FFTLength,nfft); % 对正常信号执行STFT得到复数时频矩阵以及对应的频率向量和时间向量 [stft_fault,~,~] stft(x_fault,fs,Window,win,OverlapLength,overlap,FFTLength,nfft); % 对故障信号执行STFT使用相同参数返回的频率与时间向量一致可忽略再接收 S_normal abs(stft_normal).^2; % 对正常信号的STFT复数矩阵求模平方得到功率谱密度形式的时频能量分布 S_fault abs(stft_fault).^2; % 对故障信号的STFT复数矩阵求模平方得到对应的时频能量分布矩阵 figure; % 新建图形窗口用于展示正常信号的时频图 imagesc(t_stft,f_stft,S_normal); % 使用imagesc绘制正常信号的时频能量图横轴时间纵轴频率颜色表示能量大小 axis xy; % 翻转纵轴方向使频率从下到上递增符合常规时频图习惯 xlabel(Time / s); % 设置时间轴标签帮助辨识不同时间段的能量分布 ylabel(Frequency / Hz); % 设置频率轴标签显示具体频率刻度 title(STFT Spectrogram - Normal state); % 标注图形标题为正常状态时频谱图 colorbar; % 显示颜色条用于说明颜色与能量数值之间的对应关系 colormap(gcf, turbo); % 将当前图形窗口的颜色映射设置为turbo提供高对比度色彩以增强能量分布对比度 figure; % 新建另一个图形窗口用于展示故障信号的时频图 imagesc(t_stft,f_stft,S_fault); % 绘制故障信号的时频能量图参数与正常信号保持一致以便对比 axis xy; % 设置纵轴方向为从下到上递增使时频图布局统一 xlabel(Time / s); % 标注时间轴有助于观察故障高频成分出现的时间区间 ylabel(Frequency / Hz); % 标注频率轴便于定位故障相关频率带 title(STFT Spectrogram - Fault state); % 设置标题为故障状态时频谱图直观区分两图含义 colorbar; % 显示颜色条便于判断能量大小差异 colormap(gcf, turbo); % 使用turbo颜色映射增强图像视觉效果突出高能量区域 freq_bands [80 120; 280 320; 480 520]; % 定义三个频带分别围绕100Hz、300Hz和500Hz模拟对应基频与故障特征频段 num_bands size(freq_bands,1); % 计算频带数量此处为3个频带用于后续循环处理 features_normal zeros(num_bands,1); % 初始化正常信号特征向量长度为频带数量每个元素表示对应频带能量统计量 features_fault zeros(num_bands,1); % 初始化故障信号特征向量用于存放各频带能量统计量 for k 1:num_bands % 遍历每一个频带依次计算该频带内的平均能量 fmin freq_bands(k,1); % 取出第k个频带的下限频率 fmax freq_bands(k,2); % 取出第k个频带的上限频率 idx f_stftfmin f_stftfmax; % 根据频率向量构建逻辑索引选中该频带对应的频率点 band_energy_normal mean(S_normal(idx,:),all); % 在正常信号的时频能量矩阵中提取该频带行计算所有时间和频率点的平均能量 band_energy_fault mean(S_fault(idx,:),all); % 在故障信号的时频能量矩阵中提取相同频带计算平均能量 features_normal(k) band_energy_normal; % 将该频带的平均能量存入正常特征向量中对应位置 features_fault(k) band_energy_fault; % 将该频带的平均能量存入故障特征向量中对应位置 end % 结束频带循环完成三个频带特征的提取 构造样本集与标签示例 num_samples_per_class 50; % 设置每类样本数量为50模拟一定数量的监测样本供训练与测试 feature_dim num_bands; % 特征维度等于频带数量此处为3维特征向量 X zeros(num_samples_per_class2, feature_dim); % 初始化特征矩阵X行数为样本总数100列数为特征维度3 Y zeros(num_samples_per_class2,1); % 初始化标签向量Y长度为100对应每个样本的类别标记 for n 1:num_samples_per_class % 循环生成正常类别的多个样本通过添加随机扰动模拟工况变化 noise_scale 0.02randn; % 为本次样本生成一个随机噪声缩放因子用于稍微改变噪声强度 x_n x_normal noise_scalerandn(size(x_normal)); % 在原始正常信号基础上添加变化的噪声得到略有差异的正常信号样本 x_n detrend(x_n); % 对生成的样本进行去趋势处理保持信号平稳性 x_n x_n / max(abs(x_n)); % 对样本进行归一化使幅值范围一致有利于特征比较 [stft_n,~,~] stft(x_n,fs,Window,win,OverlapLength,overlap,FFTLength,nfft); % 对该样本执行STFT生成对应的时频矩阵 S_n abs(stft_n).^2; % 计算时频能量分布用于频带能量特征提取 feat zeros(feature_dim,1); % 初始化当前样本的特征向量用于存放三个频带的平均能量 for k 1:num_bands % 对三个频带循环提取能量特征 fmin freq_bands(k,1); % 当前频带下限频率 fmax freq_bands(k,2); % 当前频带上限频率 idx f_stftfmin f_stftfmax; % 选中该频带对应的频率索引 feat(k) mean(S_n(idx,:),all); % 计算该频带内所有时频点的平均能量作为特征分量 end % 完成当前样本的频带特征提取 X(n,:) feat.; % 将得到的特征向量转置为行向量存入特征矩阵的第n行 Y(n) 0; % 将该样本的标签设为0表示正常类别 end % 完成所有正常样本生成 for n 1:num_samples_per_class % 循环生成故障类别样本采用类似方式增加随机性 noise_scale 0.02randn; % 为故障样本设置一个随机噪声缩放因子增强样本之间的差异 x_f x_fault noise_scalerandn(size(x_fault)); % 在原始故障信号基础上叠加额外噪声生成略有差异的故障样本 x_f detrend(x_f); % 去除趋势与直流分量保持信号稳定性 x_f x_f / max(abs(x_f)); % 对故障样本归一化统一幅值范围 [stft_f,~,~] stft(x_f,fs,Window,win,OverlapLength,overlap,FFTLength,nfft); % 对该故障样本执行STFT生成对应时频矩阵 S_f abs(stft_f).^2; % 计算故障样本的时频能量分布用于特征提取 feat zeros(feature_dim,1); % 初始化该故障样本的特征向量 for k 1:num_bands % 遍历频带提取能量特征 fmin freq_bands(k,1); % 频带下限频率 fmax freq_bands(k,2); % 频带上限频率 idx f_stftfmin f_stftfmax; % 选取对应频带频率索引 feat(k) mean(S_f(idx,:),all); % 计算该频带内平均能量作为特征分量 end % 完成当前故障样本特征提取 X(num_samples_per_classn,:) feat.; % 将该故障样本特征放入特征矩阵后50行位置 Y(num_samples_per_classn) 1; % 设置该样本标签为1表示故障类别 end % 完成所有故障样本生成 X normalize(X); % 对全体样本特征按列进行标准化将每列特征转换为零均值单位方差有助于SVM训练稳定收敛 训练集与测试集划分示例 rng(1); % 固定随机数种子保证划分训练集和测试集时结果可重复便于调试与对比 num_total size(X,1); % 获取样本总数此处应为100 idx_all randperm(num_total); % 随机打乱样本索引顺序避免序列性造成偏差 train_ratio 0.7; % 设置训练集比例为70%测试集为30% num_train round(train_ratio*num_total); % 根据比例计算训练集样本数此处约为70 idx_train idx_all(1:num_train); % 选取打乱索引中前70个作为训练集样本编号 idx_test idx_all(num_train1:end); % 剩余30个样本编号作为测试集索引 X_train X(idx_train,:); % 提取训练集特征矩阵对应选定的样本行 Y_train Y(idx_train); % 提取训练集标签向量与训练特征一一对应 X_test X(idx_test,:); % 提取测试集特征矩阵用于评估模型在未见数据上的性能 Y_test Y(idx_test); % 提取测试集标签向量用于与预测结果比较计算准确率 SVM模型训练与交叉验证示例 svm_template templateSVM(KernelFunction,rbf,KernelScale,auto,BoxConstraint,1); % 构建SVM模板使用高斯核函数核尺度由数据自动估计惩罚参数C设为1作为初始配置 cv cvpartition(Y_train,KFold,5); % 使用5折交叉验证方式对训练集进行划分便于评估模型稳定性 acc_cv zeros(cv.NumTestSets,1); % 初始化交叉验证准确率数组用于存储每折验证结果 for i 1:cv.NumTestSets % 遍历每一个交叉验证子集在不同划分下训练与评估模型 idx_tr training(cv,i); % 获取第i折中训练样本的逻辑索引 idx_val test(cv,i); % 获取第i折中验证样本的逻辑索引 X_tr_i X_train(idx_tr,:); % 提取该折的训练特征子集 Y_tr_i Y_train(idx_tr); % 提取该折的训练标签子集 X_val_i X_train(idx_val,:); % 提取该折的验证特征子集 Y_val_i Y_train(idx_val); % 提取该折的验证标签子集 model_i fitcsvm(X_tr_i,Y_tr_i,KernelFunction,rbf,KernelScale,auto,BoxConstraint,1); % 在该折训练集上训练SVM模型采用高斯核和相同超参数设置 Y_val_pred predict(model_i,X_val_i); % 使用训练好的模型对该折验证集特征进行预测得到预测标签 acc_cv(i) mean(Y_val_pred Y_val_i); % 计算该折验证集上的分类准确率并存入数组 end % 完成所有折的交叉验证训练与评估 mean_cv_acc mean(acc_cv); % 计算5折交叉验证准确率的平均值作为模型在训练集上的泛化性能估计 model_final fitcsvm(X_train,Y_train,KernelFunction,rbf,KernelScale,auto,BoxConstraint,1); % 使用全部训练集样本重新训练最终SVM模型保留最优参数配置用于后续在测试集上评估 故障类别预测与混淆矩阵展示示例 Y_pred_test predict(model_final,X_test); % 使用训练好的最终SVM模型对测试集特征进行分类预测得到预测类别向量 acc_test mean(Y_pred_test Y_test); % 计算测试集上的整体分类准确率用于评估模型在未见数据上的表现 figure; % 新建图形窗口用于展示测试集混淆矩阵 cm confusionchart(Y_test,Y_pred_test); % 使用真实标签与预测标签生成混淆矩阵对象展示不同类别之间的分类统计 cm.Title Confusion Matrix of STFT-SVM on Test Set; % 设置混淆矩阵图标题标明是STFT-SVM模型在测试集上的表现 cm.RowSummary row-normalized; % 将混淆矩阵按行归一化显示每个真实类别的预测比例便于观察分类召回情况 cm.ColumnSummary column-normalized; % 按列归一化列摘要显示每个预测类别对应真实分布便于分析误报情况 fig_cm gcf; % 获取当前图形句柄用于后续设置颜色映射 colormap(fig_cm, turbo); % 将混淆矩阵图的颜色映射设置为turbo增强分类结果中高值与低值的视觉对比度 单个样本时频图与分类结果联动展示示例 sample_index idx_test(1); % 选择测试集中第一个样本在整体样本中的原始索引用于展示该样本时频图与分类结果 x_sample []; % 初始化变量用于存放该样本的原始时域信号 if Y(sample_index) 0 % 判断该样本的真实标签如果为0表示正常类别 x_sample x_normal; % 将正常信号作为该样本的时域波形进行展示 else % 如果该样本真实标签为故障类别 x_sample x_fault; % 将故障信号作为该样本的时域波形展示 end % 完成样本原始信号选择 [stft_sample,f_s,t_s] stft(x_sample,fs,Window,win,OverlapLength,overlap,FFTLength,nfft); % 对选择的样本信号执行STFT获取其时频矩阵和对应的时间频率轴 S_sample abs(stft_sample).^2; % 计算该样本的时频能量分布用于绘制其时频谱图 figure; % 新建图形窗口用于同时展示时域波形与时频图 subplot(2,1,1); % 将窗口划分为2行1列子图本子图位于第一行显示时域信号 plot(t, x_sample); % 绘制该样本的时域波形横轴为时间纵轴为振幅 xlabel(Time / s); % 设置时域图的横轴标签 ylabel(Amplitude); % 设置时域图的纵轴标签 if Y(sample_index) 0 % 判断真实标签以设置相应的标题文字 title(Time-domain signal of selected sample (True: Normal)); % 若真实状态为正常则在标题中注明为正常样本 else % 若真实标签为故障状态 title(Time-domain signal of selected sample (True: Fault)); % 标题注明为故障样本 end % 完成时域图标题设置 subplot(2,1,2); % 切换到第二行子图用于绘制时频图 imagesc(t_s,f_s,S_sample); % 绘制该样本的时频能量图展示频率随时间变化的能量分布 axis xy; % 保持频率轴从下到上递增符合常规时频图习惯 xlabel(Time / s); % 设置时频图的时间轴标签 ylabel(Frequency / Hz); % 设置时频图的频率轴标签 title(STFT Spectrogram of selected sample); % 为时频图添加标题说明展示的是所选样本的时频谱 colorbar; % 显示颜色条用于解释颜色与能量数值的关系 colormap(gcf, turbo); % 为该时频图使用turbo颜色映射增强能量分布对比度更多详细内容请访问http://【机械故障诊断】MATLAB实现基于STFT-SVM短时傅里叶变换STFT结合支持向量机SVM进行故障诊断分类预测的详细项目实例含完整的程序GUI设计和代码详解_BO-CNN模型实现与贝叶斯优化资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90241708https://download.csdn.net/download/xiaoxingkongyuxi/90241708https://download.csdn.net/download/xiaoxingkongyuxi/90241708