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 知识体系总览
下面这张图把四个指标的关系和工程应用串起来了。我建议你把它存下来,做测试时对照着看。
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 避坑指南
最后,把我这些年踩过的坑总结一下:
- 不要只看均值:均值正常不代表信号没问题。我曾经遇到一个案例,均值几乎为零,但标准差是正常值的5倍——设备已经严重磨损了。
- 峰值因子不是万能的:对于连续冲击(比如每分钟几百次的轴承故障),峰值因子可能并不高。这时候要看PDF的峭度或者做包络分析。
- PDF的bin数量要合适:bin太少,PDF太粗糙,看不出分布特征;bin太多,每个bin里样本太少,统计不稳定。我一般取sqrt(N)或者50~100个bin。
- 采样频率要够:如果采样频率太低,峰值会被低估,峰值因子也会偏小。我建议至少保证每个振动周期有20个采样点。
- 去均值要谨慎:对于非平稳信号(比如启动过程),全局去均值可能会引入误差。这时候用滑动窗口去均值更合理。