4. 时域分析:均值、方差、均方根值、峰值因子、峭度等统计特征计算与解读
各位同学,欢迎来到时域分析这一讲。
很多人一上来就搞频域分析,搞小波变换,觉得那才叫高端。但我得说一句大实话:时域统计特征,是故障诊断的“第一道防线”。你连时域的基本特征都看不懂,后面的分析很容易跑偏。
我个人习惯,拿到一段振动信号,第一件事不是画频谱,而是先算几个时域统计量。就像医生看病,先量体温、测血压,心里有个底,再去做CT。
4.1 时域统计特征到底在说什么?
说白了,时域分析就是直接对原始振动信号做数学“体检”。
振动信号本质上是一个随时间变化的电压值(或者加速度值)。我们采集到的是一串数字:x₁, x₂, x₃, ..., xₙ。这些数字的分布规律,就藏着轴承的健康状态。
我给大家画个图,看看这些特征之间的关系:
4.2 有量纲特征:均值、方差、均方根值
4.2.1 均值(Mean)
均值就是信号的平均值。公式很简单:
μ = (1/N) * Σ xᵢ
但我要提醒你:均值对故障诊断的意义其实不大。为什么?因为振动信号通常是交流耦合的,均值基本为零。如果均值明显偏离零,那说明传感器有直流偏置,或者信号采集出了问题。
我在项目里遇到过一回,一个学生拿着数据来找我,说均值有0.5V,怀疑轴承有严重故障。我一看,原来是采集卡的地线没接好。嗯,这种坑我踩过,你们别踩。
4.2.2 方差与标准差(Variance & Standard Deviation)
方差描述的是信号偏离均值的程度:
σ² = (1/N) * Σ (xᵢ - μ)²
σ = √σ²
标准差σ和振动信号的能量直接相关。轴承磨损越严重,振动幅度越大,标准差也就越大。
但有个问题——标准差受转速和负载影响很大。同一轴承,转速从1000rpm升到3000rpm,标准差可能翻倍。所以单纯看标准差,容易误判。
4.2.3 均方根值(RMS)
RMS是时域分析里最常用的特征之一:
RMS = √[(1/N) * Σ xᵢ²]
对于零均值信号,RMS和标准差是等价的。RMS直接反映了振动信号的有效能量。
| 轴承状态 | RMS加速度值(m/s²) |
|---|---|
| 良好 | < 0.5 |
| 轻微磨损 | 0.5 ~ 1.5 |
| 中度故障 | 1.5 ~ 3.0 |
| 严重故障 | > 3.0 |
注:以上数值仅供参考,不同设备差异较大,建议建立基线值。
4.3 无量纲特征:峰值因子、峭度
为什么要用无量纲特征?说白了,就是消除工况变化的影响。你想想看,转速变了,RMS会变,但峰值因子和峭度相对稳定。这就很妙了。
4.3.1 峰值因子(Crest Factor)
峰值因子 = 峰值 / RMS
峰值因子反映的是信号中是否存在明显的冲击成分。正常轴承的峰值因子一般在3~5之间。如果出现早期剥落,会产生冲击脉冲,峰值因子会突然升高到8甚至10以上。
我记得有一次,一个风电场的齿轮箱轴承,RMS值只有1.2,看起来还行。但峰值因子到了9.8。我建议他们立即停机检查,结果发现内圈已经出现了一个小剥落坑。再晚一周,可能就碎了。
4.3.2 峭度(Kurtosis)
峭度 = (1/N) * Σ [(xᵢ - μ)⁴] / σ⁴
峭度描述的是信号分布的“尖峭程度”。正态分布的峭度是3。如果峭度大于3,说明信号中有更多的极端值(冲击成分)。
我个人的经验:
- 峭度 ≈ 3:信号接近正态分布,轴承状态良好
- 峭度 > 3.5:可能存在早期故障,需要警惕
- 峭度 > 5:大概率有冲击性故障,建议立即深入分析
- 峭度 > 8:严重故障,可能已经出现裂纹或断裂
4.4 Python实战:一行代码算所有特征
理论讲完了,咱们来点实际的。下面这个函数,是我自己项目里一直在用的,可以直接计算常用的时域统计特征:
import numpy as np
def time_domain_features(signal):
"""
计算时域统计特征
signal: 一维数组,振动信号
"""
features = {}
# 有量纲特征
features['mean'] = np.mean(signal) # 均值
features['var'] = np.var(signal) # 方差
features['std'] = np.std(signal) # 标准差
features['rms'] = np.sqrt(np.mean(signal**2)) # 均方根值
# 无量纲特征
peak = np.max(np.abs(signal)) # 峰值
features['peak'] = peak
features['crest_factor'] = peak / features['rms'] # 峰值因子
features['kurtosis'] = np.mean((signal - features['mean'])**4) / (features['std']**4) # 峭度
features['skewness'] = np.mean((signal - features['mean'])**3) / (features['std']**3) # 偏度
features['shape_factor'] = features['rms'] / np.mean(np.abs(signal)) # 波形因子
features['impulse_factor'] = peak / np.mean(np.abs(signal)) # 脉冲因子
return features
# 使用示例
# 假设 data 是你的振动信号数组
# result = time_domain_features(data)
# for key, value in result.items():
# print(f"{key}: {value:.4f}")
| 特征 | 正常轴承 | 外圈故障 | 内圈故障 | 滚动体故障 |
|---|---|---|---|---|
| RMS | 0.32 | 0.89 | 1.12 | 0.76 |
| 峰值因子 | 4.1 | 7.8 | 9.2 | 6.5 |
| 峭度 | 2.9 | 5.6 | 8.3 | 4.7 |
| 脉冲因子 | 5.2 | 11.3 | 14.1 | 9.8 |
数据来源:某型深沟球轴承,转速1800rpm,径向负载500N
4.5 时域分析的局限性
说了这么多时域分析的好处,我也得泼盆冷水。
时域统计特征虽然计算简单、物理意义明确,但它有一个致命弱点:无法区分故障类型。你只能知道“有故障”,但不知道是外圈、内圈还是滚动体。这就好比医生知道病人发烧了,但不知道是感冒还是肺炎。
所以,时域分析通常作为初步筛查手段。如果时域特征异常,再进入频域分析、包络分析等更精细的方法。
我个人习惯的流程是:
- 先算RMS和峭度,快速判断有无异常
- 如果异常,看峰值因子和脉冲因子,判断冲击严重程度
- 如果确认有故障,进入频域分析定位故障位置
公众号:蓝海资料掘金营,微信deep3321