3. 时域信号分析(一):均值、方差、均方根值、峰值、峰峰值、波形因子、峰值因子、脉冲因子、裕度因子
各位同学,欢迎来到时域信号分析的第一讲。
做风机振动诊断这么多年,我有个很深的体会:时域信号是故障信息的“原石”。频域分析固然强大,但很多早期故障的蛛丝马迹,其实就藏在最原始的时域波形里。说白了,你连时域的基本统计量都拿捏不准,后面做再花哨的频谱分析也是空中楼阁。
今天咱们就扎扎实实地把时域里最常用的几个特征量讲透。我会结合自己踩过的坑,把每个指标背后的物理意义和工程直觉讲清楚。
核心观点:时域特征量不是冷冰冰的数学公式,它们是振动信号在不同维度上的“投影”。每个指标都像一把尺子,量的是故障的不同侧面。
3.1 有量纲参数:信号能量的“硬指标”
有量纲参数,就是那些带着物理单位的量。它们直接反映了振动信号的幅值大小和能量强弱。我习惯把它们叫做“硬指标”,因为数值大小和故障严重程度往往有直接的对应关系。
3.1.1 均值(Mean)
均值就是信号的平均值。对于振动信号来说,均值反映的是信号的直流分量。
计算公式:
μ = (1/N) * Σ x[i] (i = 1, 2, ..., N)
在风机振动分析中,均值通常用来判断传感器是否有偏置误差。我记得有一次在现场,发现某个测点的均值异常偏大,排查了半天,结果是传感器安装底座没拧紧,信号里混入了直流偏置。嗯,这种坑踩过一次就忘不了。
实战技巧:做特征提取前,我建议先检查均值。如果均值明显偏离零(比如超过信号RMS的10%),先做去直流处理,否则后续的方差、RMS都会失真。
3.1.2 方差(Variance)与标准差(Standard Deviation)
方差衡量的是信号围绕均值的波动程度。说白了,就是信号“抖”得有多厉害。
计算公式:
σ² = (1/N) * Σ (x[i] - μ)²
σ = sqrt(σ²)
标准差σ和振动信号的有效值(RMS)在数值上非常接近——前提是均值为零。我在做轴承故障诊断时,经常用标准差来快速评估振动烈度的变化趋势。如果标准差突然跳升,十有八九是出了状况。
3.1.3 均方根值(RMS)
RMS是时域分析里最重要的指标之一,没有夸张。它代表了信号的有效能量。
计算公式:
RMS = sqrt( (1/N) * Σ x[i]² )
为什么RMS这么重要?因为对于平稳振动信号,RMS直接对应着机械振动的烈度。ISO 10816标准里对各类旋转机械的振动评级,用的就是RMS值。
我个人习惯把RMS当作“第一道防线”。每次拿到新的振动数据,先看RMS。如果RMS在正常范围内,大概率没什么大问题;如果RMS超标了,再深入分析频谱和包络。
注意:RMS对早期故障(比如轴承点蚀初期)并不敏感。因为早期故障产生的冲击能量很小,淹没在背景噪声里,RMS几乎看不出变化。这时候就需要请出后面要讲的无量纲参数了。
3.1.4 峰值(Peak)与峰峰值(Peak-to-Peak)
峰值就是信号的最大绝对值,峰峰值是最大值与最小值的差。
计算公式:
Peak = max(|x[i]|)
Peak-to-Peak = max(x[i]) - min(x[i])
峰峰值在低速旋转机械的振动分析中特别有用。我曾经处理过一台大型风机,转速只有200多转,RMS值一直很平稳,但峰峰值却时不时出现尖刺。后来拆机检查,发现是叶片上粘了一块异物,每转一圈就刮擦一次机壳。RMS没反应,但峰峰值暴露了问题。
3.2 无量纲参数:故障诊断的“放大镜”
无量纲参数,顾名思义,就是没有物理单位的比值。它们的妙处在于:对工况变化不敏感,但对故障类型很敏感。你想想看,同一台风机,负载从50%变到100%,RMS可能翻倍,但波形因子几乎不变。这就是无量纲参数的魅力。
3.2.1 波形因子(Form Factor)
波形因子 = RMS / 整流平均值(整流平均值就是绝对值的均值)。
计算公式:
Form Factor = RMS / ( (1/N) * Σ |x[i]| )
对于标准正弦波,波形因子是1.11。实际振动信号越接近正弦波,波形因子越接近1.11;如果信号里冲击成分多,波形因子会变大。
我在做齿轮箱故障诊断时,经常用波形因子来初步判断啮合状态。如果波形因子突然增大,说明齿轮可能出现了局部损伤,产生了冲击调制。
3.2.2 峰值因子(Crest Factor)
峰值因子 = 峰值 / RMS。这是最常用的无量纲指标之一。
计算公式:
Crest Factor = Peak / RMS
峰值因子的物理意义很直观:信号里有没有“尖刺”。正常轴承的振动信号,峰值因子一般在3~5之间。如果轴承出现早期点蚀,冲击脉冲会让峰值瞬间变大,而RMS变化不大,于是峰值因子就会飙升到6甚至10以上。
我的经验:峰值因子是早期轴承故障的“哨兵”。我曾经用这个指标提前两周预警了一台离心风机的轴承故障,避免了非计划停机。但要注意,随着故障发展,冲击变多、变密集,RMS也会跟着涨上去,峰值因子反而可能回落。所以峰值因子更适合检测早期故障,不适合评估故障严重程度。
3.2.3 脉冲因子(Impulse Factor)
脉冲因子 = 峰值 / 整流平均值。
计算公式:
Impulse Factor = Peak / ( (1/N) * Σ |x[i]| )
脉冲因子和峰值因子有点像,但分母用的是整流平均值而不是RMS。整流平均值对冲击的敏感度比RMS更低,所以脉冲因子对冲击成分的放大效果更明显。
说白了,脉冲因子比峰值因子更“激进”。在检测微弱冲击时,脉冲因子往往比峰值因子先出现异常。我个人的习惯是:两个指标一起看,如果脉冲因子先报警,峰值因子后报警,基本可以确认是冲击性故障。
3.2.4 裕度因子(Margin Factor)
裕度因子 = 峰值 / 方根幅值。
这里要先解释一下方根幅值:
方根幅值 = ( (1/N) * Σ sqrt(|x[i]|) )²
裕度因子计算公式:
Margin Factor = Peak / 方根幅值
裕度因子是所有无量纲参数里对冲击最敏感的指标。方根幅值对小幅值信号做了“放大”处理(开平方根),所以对微弱冲击的响应更灵敏。
我记得有一次做风电齿轮箱的故障诊断,峰值因子和脉冲因子都还在正常范围,但裕度因子已经明显偏高。我坚持建议客户拆检,结果发现行星轮上有一个不到1mm的早期疲劳裂纹。从那以后,裕度因子就成了我工具箱里的“压箱底”指标。
3.3 实战代码:一键计算所有时域特征
光说不练假把式。下面给出一段Python代码,可以直接计算上面讲的所有时域特征量。代码里我加了详细的注释,方便你理解每一步在干什么。
import numpy as np
def time_domain_features(signal):
"""
计算时域信号的全部特征量
signal: 一维numpy数组,振动信号
返回: 字典,包含所有特征量
"""
# 基本统计量
mean_val = np.mean(signal) # 均值
var_val = np.var(signal) # 方差
std_val = np.std(signal) # 标准差
# 均方根值
rms_val = np.sqrt(np.mean(signal**2))
# 峰值与峰峰值
peak_val = np.max(np.abs(signal)) # 峰值
peak_to_peak = np.max(signal) - np.min(signal) # 峰峰值
# 整流平均值
rect_avg = np.mean(np.abs(signal))
# 方根幅值
sqrt_amplitude = np.mean(np.sqrt(np.abs(signal)))**2
# 无量纲参数
form_factor = rms_val / rect_avg # 波形因子
crest_factor = peak_val / rms_val # 峰值因子
impulse_factor = peak_val / rect_avg # 脉冲因子
margin_factor = peak_val / sqrt_amplitude # 裕度因子
# 打包返回
features = {
'mean': mean_val,
'variance': var_val,
'std': std_val,
'rms': rms_val,
'peak': peak_val,
'peak_to_peak': peak_to_peak,
'form_factor': form_factor,
'crest_factor': crest_factor,
'impulse_factor': impulse_factor,
'margin_factor': margin_factor
}
return features
# 示例:生成一段模拟的轴承故障信号
fs = 10000 # 采样率 10kHz
t = np.arange(0, 1, 1/fs)
# 正常信号:正弦波 + 噪声
normal_signal = 0.5 * np.sin(2 * np.pi * 50 * t) + 0.1 * np.random.randn(len(t))
# 故障信号:正常信号 + 周期性冲击
fault_signal = normal_signal.copy()
impulse_times = np.arange(0, 1, 0.01) # 每0.01秒一个冲击
for it in impulse_times:
idx = int(it * fs)
if idx < len(fault_signal):
fault_signal[idx:idx+20] += 2.0 * np.exp(-np.arange(20)/5) # 衰减冲击
# 计算特征
normal_features = time_domain_features(normal_signal)
fault_features = time_domain_features(fault_signal)
# 对比输出
print("特征量对比:正常 vs 故障")
print("-" * 50)
for key in normal_features.keys():
print(f"{key:15s}: 正常={normal_features[key]:.4f}, 故障={fault_features[key]:.4f}")
运行这段代码,你会看到正常信号和故障信号在各个特征量上的差异。我建议你多换几组参数试试,感受一下不同故障程度对各个指标的影响。
3.4 特征量选择指南
讲了这么多,你可能会问:实际项目中到底该用哪个?我的建议是:
| 应用场景 | 推荐指标 | 理由 |
|---|---|---|
| 振动烈度评估(合规性) | RMS | ISO标准要求,物理意义明确 |
| 早期轴承故障检测 | 裕度因子、脉冲因子 | 对微弱冲击最敏感 |
| 齿轮局部损伤 | 峰值因子、波形因子 | 能反映调制和冲击特征 |
| 低速重载设备 | 峰峰值 | RMS不敏感,峰峰值更有效 |
| 趋势监测(长期) | RMS + 峰值因子 | 一个看能量,一个看冲击,互补 |
我的建议:不要只盯着一个指标。我通常的做法是:先用RMS做快速筛查,如果RMS正常但心里不踏实,再算一遍无量纲参数。多个指标交叉验证,误报率会低很多。
好了,时域信号分析的第一部分就到这里。这些基础特征量虽然简单,但用好了威力无穷。下一讲我们会继续深入时域分析,聊聊自相关函数、互相关函数和概率密度估计这些更有趣的内容。
公众号:蓝海资料掘金营,微信deep3321