FFT 在振动监测上的实战:窗函数、平均、谱泄漏
FFT 不是"调用一下函数"。窗函数选错,谱泄漏让低频被高频淹没;不做平均,单次 FFT 噪声 ±10 dB。在振动监测上,这些细节决定能不能看出故障。
FFT 的输入与输出
输入:N 个时间序列样本,采样率 fs 输出:N/2 个频域复数,频率分辨率 Δf = fs/N
例:采样率 10 kHz,样本数 4096,频率分辨率 2.44 Hz。
谱泄漏
FFT 假设输入是周期信号,且 N 个样本正好覆盖整数个周期。实际信号几乎不可能整周期截断,导致泄漏:某频率的能量"泄漏"到邻近频率。
例:100 Hz 的纯正弦,输入 N = 4096、fs = 10 kHz:
- 整周期(10 个完整周期):FFT 在 100 Hz 处单峰,其他频率为 0
- 非整周期(10.3 个周期):100 Hz 处仍有峰,但邻近频率也有非零值——这就是泄漏
窗函数
为减少泄漏,对输入做"加窗"——把样本两端逐渐衰减为 0,强制周期性。
常用窗函数
| 窗 | 主瓣宽 | 旁瓣抑制 | 频率分辨率 | 幅值精度 | 适用 |
|---|---|---|---|---|---|
| Rect(矩形) | 最窄 | -13 dB | 最高 | 差 | 整周期截断的纯正弦 |
| Hann | 较窄 | -31 dB | 中 | 中 | 通用频谱分析 |
| Hamming | 较窄 | -42 dB | 中 | 中 | 接近 Hann |
| Blackman | 较宽 | -57 dB | 低 | 好 | 需要抑制旁瓣 |
| Flattop | 宽 | -70 dB | 低 | 极好 | 幅值校准 |
振动监测的推荐
- 故障诊断(看哪个频段上升):Hann 窗,平衡分辨率与泄漏
- 幅值校准(如共振峰):Flattop,幅值精度最高
- 整周期分析(如转频 1× 谐波):可以做整周期采样(按转速同步),用 Rect 窗
实战中 90% 的振动 FFT 用 Hann 窗。
平均
单次 FFT 的统计方差大(噪声 ±5~10 dB)。做"功率谱平均":
- 连续采集 M 段样本,每段做 FFT,求模的平方
- M 段模平方的平均 = 功率谱密度(PSD)估计
- 平均后方差降到 1/√M
线性平均 vs 指数平均
- 线性平均:M 段等权平均,适合稳态机器状态
- 指数平均:新数据权重高,老数据权重低,适合状态变化的过程
平均次数的选择
- 故障诊断:M = 10~50 段,谱图稳定
- 共振分析:M = 100+ 段,精度高
- 实时监测:M = 5~10 段,时延小
频率分辨率
Δf = fs/N,提高分辨率有两个方法:
- 增加 N:样本数多,但计算量大、时延大
- 降低 fs:采样率低,分辨率高,但要避免混叠(Nyquist:fs > 2 × 信号最高频率)
零填充
为提高"显示"分辨率,可以做零填充(在样本后补 0):
- 原 N = 4096,补零到 N = 16384
- FFT 输出 8192 个频率点,"看起来"分辨率 4 倍
但零填充不增加真实信息——它只是把原 FFT 频点之间的曲线插值出来。零填充后的谱峰位置与原 FFT 一致,不能用于识别更接近的频率。
实战代码(Python)
```python import numpy as np from scipy import signal
def vibration_fft(data, fs, nperseg=4096, overlap=0.5, window='hann'): """振动信号的功率谱密度""" f, P = signal.welch( data, fs=fs, window=window, nperseg=nperseg, noverlap=int(nperseg * overlap), scaling='density' ) return f, 10 * np.log10(P) # dB
例:100 Hz 与 1000 Hz 混合信号
fs = 10000 t = np.arange(0, 1, 1/fs) x = 1.0 * np.sin(2 * np.pi * 100 * t) + 0.3 * np.sin(2 * np.pi * 1000 * t) x += 0.1 * np.random.randn(len(t))
f, Pxx = vibration_fft(x, fs) print(f"100 Hz 处功率: {Pxx[np.argmin(np.abs(f - 100))]:.1f} dB") print(f"1000 Hz 处功率: {Pxx[np.argmin(np.abs(f - 1000))]:.1f} dB") ```
常见错
错一:不用窗函数
直接 FFT,谱泄漏让小信号被大信号"拖走"。正确做法:默认用 Hann 窗。
错二:单次 FFT 不平均
单次 FFT 谱图噪声大,故障频段可能被噪声淹没。正确做法:做 10 段以上平均。
错三:分辨率太高
追求 0.1 Hz 分辨率,要 N = 100000 样本,计算量大、时延大。实际故障诊断 1 Hz 分辨率够用。
错四:忽略频率范围
机器故障多在 10~1000 Hz,采样率 10 kHz 足够。用 50 kHz 采样既不增加信息,又浪费存储。
结语
FFT 在振动监测上的实战,窗函数 + 平均 + 合理采样率是三个基本要素。默认 Hann 窗 + 10 段平均 + 10 kHz 采样,是大多数机器故障诊断的合理配置。不调这些就调 FFT 函数,会得到噪声而非诊断。