4. 时域信号分析基础:均值、方差、峰值因子、概率密度函数

各位工程师朋友,咱们今天聊点实在的。振动信号拿到手,第一件事是什么?不是急着上FFT,而是先看看时域波形。说白了,时域分析就是给信号“望闻问切”。我做了十几年振动测试,见过太多人一上来就搞频域,结果连传感器饱和了都没发现——那数据全是废的。

这一节,咱们把四个最基础的时域指标讲透。它们就像工具箱里的螺丝刀,看着简单,但用好了能解决大问题。

4.1 均值(Mean)——信号的直流分量

均值,就是信号的平均值。数学上很简单:

μ = (1/N) * Σ x[n]   (n = 0, 1, ..., N-1)

但在工程里,它的含义很丰富。

核心理解:均值代表信号的静态分量(直流分量)。对于振动信号,如果均值不为零,说明传感器有零漂,或者结构存在静态变形。

我在现场遇到过这么个事:某次测桥梁振动,均值一直在0.5V左右飘。我一开始以为是传感器坏了,后来一查,是安装底座没拧紧,整个传感器在重力作用下歪了。去掉均值后,数据才恢复正常。

实际应用中的注意点:

  • 去均值(Detrend):做频谱分析前,一定要先去掉均值。否则频谱图上0Hz处会有一个大尖峰,把低频成分全盖住了。
  • 物理意义:加速度信号的均值对应重力加速度分量;位移信号的均值对应静态变形量。
  • 计算陷阱:如果信号长度N不够大,均值估计会有偏差。我建议至少采集10个以上振动周期。

我的习惯:每次开始测试前,先让传感器静止采集10秒,算一下均值。如果这个值跟理论值(比如加速度计静止时应该是0g)偏差超过1%,我就先排查传感器和采集系统。

4.2 方差(Variance)与标准差——信号的波动能量

方差描述信号偏离均值的程度。说白了,就是信号“抖”得有多厉害。

σ² = (1/N) * Σ (x[n] - μ)²
σ = sqrt(σ²)   // 标准差

标准差σ的量纲和原始信号一致,所以工程上更常用。比如加速度信号的标准差单位是m/s²,直接反映振动烈度。

指标 物理含义 工程应用
方差 σ² 信号波动的总能量(功率) 评估振动能量大小,对比不同工况
标准差 σ 信号波动的有效幅值 设定报警阈值,判断设备状态
均方根值 RMS 对于零均值信号,RMS = σ ISO 10816 振动烈度评价标准

你想想看,为什么ISO标准里用RMS而不是峰值来评价振动?因为RMS代表的是振动的“有效能量”,对设备疲劳损伤的贡献更直接。峰值可能只是偶然的冲击,但RMS是持续的能量输入。

曾经踩过的坑:有一次我帮客户分析压缩机振动,标准差一直在正常范围,但设备就是异响。后来仔细看时域波形,发现每隔几十个周期就有一个大冲击,但冲击持续时间极短,对标准差贡献很小。所以,标准差正常不代表没问题——它只反映“平均能量”,对瞬态冲击不敏感。

4.3 峰值因子(Crest Factor)——冲击特征的探测器

峰值因子,就是信号峰值与有效值(RMS)的比值:

Crest Factor = X_peak / X_rms

这个指标太有用了。我把它叫做“冲击探测器”。

典型值范围:

  • 纯正弦波:峰值因子 = √2 ≈ 1.414
  • 高斯随机振动:峰值因子 ≈ 3~4(99.7%的峰值在3σ以内)
  • 有冲击的信号:峰值因子 > 5,甚至到10以上

我在齿轮箱故障诊断中经常用这个指标。正常齿轮啮合,峰值因子一般在3~4。如果突然升到8以上,十有八九是齿面有点蚀或者断齿了。冲击越尖锐,峰值因子越大。

实用技巧:峰值因子对信号长度敏感。我建议用滑动窗口法计算——窗口长度取10~20个振动周期,每步进一个点算一次。这样既能捕捉到瞬态冲击,又不会因为窗口太长把冲击“平均掉”。

4.4 概率密度函数(PDF)——信号的统计画像

概率密度函数告诉你:信号取某个值的概率有多大。它是信号幅值分布的统计描述。

工程上常用直方图来估计PDF:

1. 把信号幅值范围分成M个区间(bin)
2. 统计每个区间内的样本点数
3. 除以总点数N和区间宽度Δx,得到概率密度
   p(x_k) = (n_k / N) / Δx

PDF的形状能告诉你很多信息:

PDF形状 对应的信号类型 工程含义
高斯分布(钟形) 随机振动、环境噪声 正常工况,线性系统响应
双峰分布 周期信号 + 随机噪声 存在明显的周期性振动成分
偏态分布(不对称) 非线性系统响应 可能存在间隙、摩擦、碰撞
尖峰分布(峭度大) 含冲击的信号 轴承故障、齿轮点蚀

我记得有一次做风电齿轮箱的故障分析,时域波形看着还行,频谱也看不出明显异常。但我把PDF画出来一看,明显偏态,而且右尾很长。后来拆开检查,发现行星轮轴承保持架已经裂了——每次滚珠经过裂纹就会产生一个微小的冲击,累积起来就造成了PDF的偏态。

PDF的工程用法:我经常把PDF和正态分布曲线叠在一起看。如果偏差大,就说明信号里有“非高斯成分”——这些成分往往对应着故障特征。另外,PDF的峭度(Kurtosis)也是一个很好的故障指标,正常信号峭度≈3,有冲击时峭度会明显增大。

4.5 知识体系总览

下面这张图把四个指标的关系和工程应用串起来了。我建议你把它存下来,做测试时对照着看。

时域信号分析四指标知识体系 时域信号 x[n] 均值 μ 方差 σ² / 标准差 σ 峰值因子 CF 概率密度函数 PDF 物理含义 直流分量 静态偏移 波动能量 振动烈度 冲击特征 峰值/有效值比 幅值分布 统计画像 工程应用 • 传感器零漂检测 • 静态变形测量 • 去均值预处理 • ISO 10816 评价 • 振动能量对比 • 报警阈值设定 • 齿轮/轴承故障 • 冲击检测 • 滑动窗口监测 • 非线性检测 • 故障类型识别 • 峭度分析 四指标联合使用 = 完整的时域信号特征描述 均值→直流;方差→能量;峰值因子→冲击;PDF→分布形态 图4-1 时域信号分析四指标知识体系

4.6 实战:用Python快速计算这些指标

下面给一段我常用的代码。每次拿到新数据,我都会跑一遍这个脚本,心里就有数了。

import numpy as np
import matplotlib.pyplot as plt

def time_domain_analysis(signal, fs):
    """
    时域信号基础分析
    signal: 一维数组,振动信号
    fs: 采样频率 (Hz)
    """
    N = len(signal)
    t = np.arange(N) / fs
    
    # 1. 均值
    mean_val = np.mean(signal)
    
    # 2. 标准差
    std_val = np.std(signal)
    
    # 3. 峰值因子
    peak_val = np.max(np.abs(signal))
    crest_factor = peak_val / std_val
    
    # 4. 概率密度函数(直方图估计)
    num_bins = 50
    counts, bin_edges = np.histogram(signal, bins=num_bins, density=True)
    bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2
    
    # 打印结果
    print(f"均值: {mean_val:.4f}")
    print(f"标准差: {std_val:.4f}")
    print(f"峰值: {peak_val:.4f}")
    print(f"峰值因子: {crest_factor:.4f}")
    
    # 绘图
    fig, axes = plt.subplots(2, 2, figsize=(12, 8))
    
    # 时域波形
    axes[0,0].plot(t, signal)
    axes[0,0].axhline(y=mean_val, color='r', linestyle='--', label=f'均值={mean_val:.3f}')
    axes[0,0].set_title('时域波形')
    axes[0,0].set_xlabel('时间 (s)')
    axes[0,0].legend()
    
    # 直方图 + PDF
    axes[0,1].hist(signal, bins=num_bins, density=True, alpha=0.7, label='实测PDF')
    axes[0,1].plot(bin_centers, counts, 'r-', linewidth=2)
    axes[0,1].set_title('概率密度函数')
    axes[0,1].set_xlabel('幅值')
    axes[0,1].set_ylabel('概率密度')
    
    # 峰值因子滑动窗口
    window_len = int(fs * 0.1)  # 0.1秒窗口
    cf_slide = []
    for i in range(window_len, N):
        window = signal[i-window_len:i]
        cf_slide.append(np.max(np.abs(window)) / np.std(window))
    axes[1,0].plot(t[window_len:], cf_slide)
    axes[1,0].axhline(y=crest_factor, color='r', linestyle='--', label=f'全局CF={crest_factor:.2f}')
    axes[1,0].set_title('峰值因子滑动窗口')
    axes[1,0].set_xlabel('时间 (s)')
    axes[1,0].legend()
    
    # 统计摘要
    axes[1,1].axis('off')
    summary = f"""
    时域分析摘要
    ─────────────
    采样点数: {N}
    采样频率: {fs} Hz
    时长: {N/fs:.2f} s
    
    均值: {mean_val:.4f}
    标准差: {std_val:.4f}
    峰值: {peak_val:.4f}
    峰值因子: {crest_factor:.4f}
    """
    axes[1,1].text(0.1, 0.5, summary, fontsize=12, fontfamily='monospace',
                   verticalalignment='center')
    
    plt.tight_layout()
    plt.show()
    
    return {
        'mean': mean_val,
        'std': std_val,
        'peak': peak_val,
        'crest_factor': crest_factor,
        'bin_centers': bin_centers,
        'pdf': counts
    }

使用建议:这段代码我用了快十年了。每次换项目、换设备,第一件事就是跑这个脚本。它不会告诉你故障在哪,但能告诉你“信号正不正常”。如果均值、标准差、峰值因子和PDF形状都在预期范围内,再往下做频域分析才有意义。

4.7 避坑指南

最后,把我这些年踩过的坑总结一下:

  1. 不要只看均值:均值正常不代表信号没问题。我曾经遇到一个案例,均值几乎为零,但标准差是正常值的5倍——设备已经严重磨损了。
  2. 峰值因子不是万能的:对于连续冲击(比如每分钟几百次的轴承故障),峰值因子可能并不高。这时候要看PDF的峭度或者做包络分析。
  3. PDF的bin数量要合适:bin太少,PDF太粗糙,看不出分布特征;bin太多,每个bin里样本太少,统计不稳定。我一般取sqrt(N)或者50~100个bin。
  4. 采样频率要够:如果采样频率太低,峰值会被低估,峰值因子也会偏小。我建议至少保证每个振动周期有20个采样点。
  5. 去均值要谨慎:对于非平稳信号(比如启动过程),全局去均值可能会引入误差。这时候用滑动窗口去均值更合理。