

一句话介绍: 这套程序把正常、故障和磨损 3 类振动数据统一整理成样本,先计算每个样本的 Hilbert 包络,再从包络信号中提取 16 个时域统计特征和 13 个频域统计特征,最终形成一个可直接用于故障识别、分类或机器学习的 29 维特征矩阵。
原始振动信号通常是一长串采样点。
例如当前工程中,每个样本都有:1024 个时域采样值
如果直接把 1024 点全部送进传统分类算法:
数据维数较高;不同故障之间的差异不够直观;很难直接解释“振幅变大了还是频带发生变化”。
这套程序把每个 1024 点样本压缩成:29 个具有统计意义的特征
整体流程是:
原始振动样本 → Hilbert 包络 → 16 个时域特征 → FFT 幅值谱 → 13 个频域特征 → 29 维特征向量
最终相当于把一条复杂波形转换成一组更适合比较和分类的数字描述。
1. 当前工程有哪些核心文件?
工程只有 4 个核心文件:
文件 | 作用 |
|---|---|
| 主程序,整理数据并批量提取 29 维特征 |
| 计算 16 个时域统计特征 |
| 计算 13 个频域统计特征 |
| 保存正常、故障、磨损 3 类原始样本 |
程序没有复杂的模型训练过程,重点就是:把原始信号转换成特征矩阵。
2. 为什么程序先做 Hilbert 包络?
主程序没有直接对原始信号 x(j,:) 提特征,而是先计算:
X = |Hilbert(x)|
解析信号可以写成:
z(t) = x(t) + j·H[x(t)]
其中 H[x(t)] 是 Hilbert 变换。
包络为:
A(t) = |z(t)| = √[x²(t) + H²(x(t))]
简单来说:
Hilbert 包络把快速正负振荡转换成一个始终非负的幅值变化曲线。
对于调制、冲击和机械振动信号,包络能够突出“振动强弱怎样随时间变化”,因此后面的 29 个特征实际描述的是:
Hilbert 包络的时域与频域统计特性。
3. 16 个时域特征主要在描述什么?
time_statistical_compute.m 一共输出:
10 个基础统计量 + 6 个无量纲指标
为了避免把文档写成 16 行公式表,可以把它们分成 4 类理解。
包括:均值、均方根值、方根幅值、绝对平均值
其中均方根值可以写成:
RMS = √[(1/N)Σxᵢ²]
它反映信号整体波动强度,是机械状态分析中非常常用的幅值指标。
包括:三阶中心矩、峭度、方差
它们主要描述:信号分布是否对称;是否存在尖峰;样本围绕平均水平的离散程度。
其中高峭度通常意味着信号中更容易出现明显尖峰或冲击。
包括:最大值、最小值、峰峰值
峰峰值为:
P-P = x_max - x_min
它直接反映这一段信号从最低到最高一共跨越多大的幅值范围。
程序继续由前面的统计量构造:
波形指标、峰值指标、脉冲指标、裕度指标、偏斜度指标、峭度指标
例如:
波形指标 = RMS / 绝对平均值
峰值指标 = 最大值 / RMS
脉冲指标 = 最大值 / 绝对平均值
裕度指标 = 最大值 / 方根幅值
这类比值弱化了绝对幅值单位的影响,更适合比较不同状态下波形形态的变化。
. 4为什么同时需要“有量纲”和“无量纲”特征?
假设两个信号形状几乎一样,只是第二个整体幅值放大了两倍。
RMS、峰峰值等有量纲指标会明显变化;
部分比值型无量纲指标可能变化较小。
因此两类特征关注的角度不同:
有量纲特征 → 振动到底有多强
无量纲特征 → 波形形状和冲击特征怎样变化
把两类信息放在一起,比只使用单一 RMS 更容易描述不同机械状态。
5. 频域特征是怎样得到的?
每个样本的 Hilbert 包络完成时域统计以后,程序继续执行:
包络信号 → 1024 点 FFT → 幅值谱 y → 13 个频域统计量
FFT 可以概括为:
X(k) = Σ(n=0→N-1) x(n)·exp(-j2πkn/N)
程序使用:
y = 2|FFT(X)/N|
作为后续频域统计的输入。
这里不再关心某一个采样点的瞬时幅值,而是分析:
能量主要集中在哪些频率位置,以及整个频谱是集中还是分散。
6. 13 个频域特征可以分成哪几类?
fre_statistical_compute.m 一共输出 13 个统计量,同样可以压缩成 3 类理解。
前 4 个特征主要基于频谱幅值 y:
频谱均值、频谱方差型指标、频谱偏度型指标、频谱峭度型指标
它们描述:整个频谱幅值是比较集中、比较平缓,还是存在少数突出的峰值。
程序计算频率中心:
f_c = Σ(fᵢyᵢ) / Σyᵢ
并进一步计算:
频率标准差型指标;均方根频率;二阶 / 四阶频率矩组合指标;频率稳定性相关比值。
这些特征关注的核心是:
频谱整体“重心”位于哪里,以及主频带有没有向高频或低频移动。
最后几个特征利用:
(f - f_c)³、(f - f_c)⁴
等频率中心矩构造偏度、峭度和离散度相关指标。
因此 13 个频域特征并不是简单取“最大频率”,而是在统计意义上描述整个频谱的:
位置 + 宽度 + 偏斜 + 尖锐程度。
7. 最终 29 维特征是怎样拼出来的?
对于第 j 个样本:
Time_j = 16 维时域特征
Fre_j = 13 维频域特征
最终:
Feature_j = [Time_j, Fre_j]
所以:16 + 13 = 29
每一行:一个振动样本;每一列:一种统计特征。
这正是传统机器学习最常见的输入形式。
8这个特征矩阵怎样对应 3 种状态?
程序当前没有额外生成标签变量,但样本顺序已经固定。
所以如果后续做分类,可以按:
第 1~375 行 → 正常、第 376~750 行 → 故障、第 751~1125 行 → 磨损
构造类别标签。
例如后续可以把:1125 × 29 特征矩阵 + 1125 个类别标签
送入:SVM;KNN;随机森林;BP 神经网络;其他故障分类器。
当前工程本身只负责做到“特征提取”,并没有继续训练分类模型。
9. 为什么不直接把 1024 个原始点送入分类器?
直接使用原始波形当然可以,但传统机器学习中会遇到两个明显问题。
原始输入:1024 维
当前统计特征:29 维
数据规模明显压缩。
如果分类器说:第 683 个采样点比较重要,通常很难直接解释。
但如果某种状态表现为:
RMS 增大;峰值指标增大;峭度变化;频率中心移动;
就更容易和振动机理建立联系。
因此这套程序的价值不仅是降维,也是:
把原始波形转成具有统计和故障诊断含义的描述量。
10. 为什么时域和频域要同时使用?
只使用时域特征,可以知道:
波动有多大;有没有冲击;峰值是否增加。
但两个故障信号可能具有相近 RMS,却集中在不同频带。
只使用频域特征,又可能忽略某些明显的瞬态幅值变化。
所以程序把:16 个时域特征 + 13 个频域特征直接拼接。
这样既描述:“振动有多强、波形有多尖”
也描述:“能量主要在哪里、频谱怎样分布”。
这比单独只提一个域的特征更加全面。
11. 这种方法理论上为什么适合故障特征提取?
1024 点原始信号被转换为 29 维特征,能够降低后续分类和可视化的输入复杂度。
机械故障产生的周期冲击常常会调制高频振动。
先取包络,再分析其时域和频域统计量,有利于突出振动幅值随时间变化的规律。
时域更关注幅值、离散程度和冲击;频域更关注频谱重心、带宽和分布。
两类信息组合后,能够从不同角度描述同一个样本。
一旦确定输入样本,每个特征都可以直接计算,不需要先训练复杂模型。
因此这种方法非常适合作为:
传统故障诊断中的前端特征工程。
12. 程序最终能得到什么?
运行 feature_extraction.m 后,MATLAB 工作区会得到:
time:约 1125 × 16 的时域特征;
fre:约 1125 × 13 的频域特征;
feature:约 1125 × 29 的完整特征矩阵。
因此程序最核心的最终输出就是:
1125 个样本 × 29 个特征
后续可以直接保存 feature,或者与类别标签组合后用于机器学习分类。
13. 它适合用在哪里?
可以把振动波形转换成 RMS、峰值、峭度、频率中心等特征,再用于状态识别。
对于样本数不大、需要较强可解释性的分类任务,29 维人工统计特征比直接使用长波形更容易进入传统分类模型。
工程把 16 个时域指标和 13 个频域指标集中在两个函数中,非常适合理解不同统计量到底描述信号的什么性质。
当前数据已经包含 3 类、每类 375 个样本,可以进一步研究哪些特征对不同状态区分最明显。
14. 怎么运行?
主程序是:feature_extraction.m
保持 data、time_statistical_compute.m 和 fre_statistical_compute.m 与主程序位于同一 MATLAB 路径,直接运行即可。
程序会自动:
读取 3 类数据 → 拼接 1125 个样本 → Hilbert 包络 → 16 个时域特征 → 1024 点 FFT → 13 个频域特征 → 生成 29 维 feature
如果后续用于分类,建议再根据样本顺序建立 3 类标签,并在训练模型前根据需要对 29 个特征做标准化。
16. 一句话看懂这个项目
这是一个 MATLAB 振动信号 29 维统计特征提取程序:data.mat 包含正常、故障、磨损 3 类数据,每类 375 个样本、每个样本 1024 点;主程序先对每条信号计算 Hilbert 包络,再提取均值、RMS、峭度、峰峰值、波形指标等 16 个时域特征,并对包络进行 1024 点 FFT,继续提取频谱幅值分布、频率中心、均方根频率和频谱高阶矩等 13 个频域特征,最终形成约 1125×29 的特征矩阵,可作为后续机械故障分类的输入。