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