第四章:时域分析——时域统计特征与波形分析实战
各位工程师朋友,大家好。今天我们来聊聊时域分析。说实话,很多刚入行的朋友一上来就喜欢玩频谱、搞包络,觉得时域太简单。但我个人的经验是:时域分析是故障诊断的第一道防线,也是最不容易骗人的一道防线。你想想看,信号从传感器出来,最原始的样子就是时域波形,这里面藏着的信息,往往比经过各种变换后的结果更直接。
4.1 时域统计特征——这些数字在说什么?
我们先从最基础的几个统计量说起。这些指标看似简单,但每个都有它的脾气。
4.1.1 均值(Mean)
均值就是信号的平均值。对于振动信号来说,均值反映的是信号的直流分量。正常情况下,加速度传感器的均值应该接近0。如果均值明显偏离0,说明传感器可能有零漂,或者信号调理电路出了问题。
4.1.2 方差与标准差(Variance & Standard Deviation)
方差描述的是信号偏离均值的程度。标准差是方差的平方根,物理意义更直观——它代表了振动的能量大小。轴承出现早期故障时,标准差通常会缓慢增大。
4.1.3 峰值(Peak Value)
峰值就是信号的最大绝对值。这个指标对冲击类故障特别敏感。比如轴承内圈出现剥落,每次滚珠滚过缺陷位置,就会产生一个很大的冲击,峰值会瞬间跳变。
4.1.4 峭度(Kurtosis)
峭度是衡量信号分布“尖峭程度”的指标。正常轴承的振动信号接近正态分布,峭度值在3左右。当出现早期故障时,信号中会出现稀疏的大幅值冲击,峭度值会明显大于3。
我个人的习惯是:峭度值超过4就要警惕,超过6基本可以确定有故障了。但要注意,峭度对早期故障敏感,到了故障晚期,冲击变得密集,峭度反而可能下降。所以它更适合做早期预警。
4.2 无量纲指标——摆脱工况影响的利器
为什么要用无量纲指标?说白了,就是让诊断结果不受转速、负载变化的影响。你想想看,同一台风机,空载和满载时振动幅值能差好几倍,但无量纲指标却能保持相对稳定。
| 指标名称 | 计算公式 | 正常范围 | 故障特征 |
|---|---|---|---|
| 波形因子 | RMS / 整流平均值 | 1.1 ~ 1.5 | 冲击故障时增大 |
| 峰值因子 | 峰值 / RMS | 3 ~ 5 | 早期故障时明显增大 |
| 脉冲因子 | 峰值 / 整流平均值 | 4 ~ 8 | 对单次冲击敏感 |
| 裕度因子 | 峰值 / 方根幅值 | 4 ~ 8 | 磨损类故障时增大 |
4.3 时域波形分析——用眼睛看信号
统计指标是数字,但波形是图像。有时候,看一眼波形比算一堆数字更管用。
4.3.1 正常波形长什么样?
正常轴承的时域波形,看起来就像一团乱麻——随机、平稳、没有明显的周期性冲击。振幅基本稳定,没有突然的大幅波动。
4.3.2 故障波形怎么看?
我总结了一个“三步观察法”:
- 看对称性:波形上下是否对称?如果不对称,可能有摩擦或松动。
- 看周期性:有没有重复出现的冲击?如果有,计算冲击间隔,可以反推故障频率。
- 看调制:振幅有没有忽大忽小的现象?这往往是故障特征频率被转频调制的表现。
4.4 实战:用Python计算时域特征
光说不练假把式。下面我给出一个完整的代码示例,可以直接用在你的数据上。
import numpy as np
import matplotlib.pyplot as plt
def time_domain_features(signal, fs):
"""
计算时域统计特征
signal: 振动信号数组
fs: 采样频率
"""
# 基本统计量
mean_val = np.mean(signal)
std_val = np.std(signal)
peak_val = np.max(np.abs(signal))
rms_val = np.sqrt(np.mean(signal**2))
# 峭度
n = len(signal)
kurtosis_val = (np.mean((signal - mean_val)**4) /
(np.mean((signal - mean_val)**2)**2))
# 无量纲指标
crest_factor = peak_val / rms_val # 峰值因子
shape_factor = rms_val / np.mean(np.abs(signal)) # 波形因子
impulse_factor = peak_val / np.mean(np.abs(signal)) # 脉冲因子
return {
'均值': mean_val,
'标准差': std_val,
'峰值': peak_val,
'有效值': rms_val,
'峭度': kurtosis_val,
'峰值因子': crest_factor,
'波形因子': shape_factor,
'脉冲因子': impulse_factor
}
# 使用示例
fs = 25600 # 采样频率
t = np.arange(0, 1, 1/fs)
# 模拟正常信号 + 冲击
normal_signal = np.random.randn(len(t)) * 0.1
impulse = np.zeros_like(t)
impulse[::1000] = 2.0 # 每1000个点加一个冲击
fault_signal = normal_signal + impulse
features = time_domain_features(fault_signal, fs)
for key, value in features.items():
print(f"{key}: {value:.4f}")
# 绘制时域波形
plt.figure(figsize=(12, 4))
plt.plot(t[:5000], fault_signal[:5000])
plt.title('时域波形(含冲击)')
plt.xlabel('时间 (s)')
plt.ylabel('幅值')
plt.grid(True)
plt.show()
4.5 知识体系总览
下面这张图,是我自己总结的时域分析知识框架。你可以把它当作一张地图,随时回来对照。
最后说一句:时域分析看似基础,但真正用好的人不多。我见过太多人拿着频谱图分析半天,结果问题在时域波形上一眼就能看出来。所以,别小看这些“简单”的指标,它们是你诊断工具箱里最趁手的家伙。