第二章 信号处理入门:时域与频域、FFT变换原理、采样定理与混叠、窗函数的选择
各位同行,大家好。我是老张,干设备故障诊断这行快二十年了。今天咱们聊聊信号处理的基础。说实话,很多刚入行的朋友觉得这块太理论,但我要说——不懂信号处理,你做的振动分析就是瞎猜。
咱们搞风机寿命预测,说白了就是跟振动信号打交道。信号怎么来的?传感器采集的。但原始信号就像一团乱麻,你得学会怎么梳理它。嗯,今天我就把压箱底的经验掏出来,跟大家聊聊时域频域、FFT、采样定理和窗函数。
核心观点:信号处理不是数学游戏,而是从噪声中提取故障特征的艺术。我见过太多人拿着漂亮的频谱图却看不出问题,也见过老法师凭一条时域波形就判断出轴承坏了——区别就在于对信号本质的理解。
2.1 时域与频域:两个角度看世界
先说说时域。时域信号就是传感器直接采集到的波形,横轴是时间,纵轴是振幅。说白了,就是振动随时间怎么变化。我刚开始做现场诊断时,就靠看时域波形判断有没有冲击——比如轴承坏了,波形上会出现周期性的尖峰。
但时域有个问题:你看不出频率成分。比如一个风机,既有转频(比如25Hz),又有齿轮啮合频率(比如500Hz),时域上它们混在一起,你根本分不清谁是谁。
这时候就需要频域了。频域把信号分解成不同频率的正弦波,横轴是频率,纵轴是幅值。你想想看,一个复杂的振动信号,在频域里可能就是几根清晰的谱线。我习惯把频域比作「信号的身份证」——每个故障都有自己独特的频率特征。
| 域 | 横轴 | 纵轴 | 能看出什么 |
|---|---|---|---|
| 时域 | 时间 (s) | 振幅 (mm/s 或 g) | 冲击、周期性、趋势 |
| 频域 | 频率 (Hz) | 幅值 (mm/s 或 g) | 频率成分、故障特征 |
我的经验:做风机寿命预测,我建议时域和频域结合着看。时域看趋势变化,频域找故障特征。比如轴承早期故障,时域可能还看不出明显冲击,但频域里已经能看到边频带了。
2.2 FFT变换原理:从时域到频域的桥梁
FFT,全称快速傅里叶变换。说白了,就是把时域信号变成频域信号的数学工具。你可能会问:为什么要用FFT?因为直接算傅里叶变换太慢了,FFT把计算量从N²降到了Nlog₂N,这才让实时分析成为可能。
我记得刚入行时,用一台老式分析仪做FFT,一次变换要等好几秒。现在计算机算1024点的FFT,一眨眼就完成了。技术发展真快啊。
FFT的核心思想是什么?任何周期信号都可以分解成一系列正弦波的和。你想想看,一个方波,其实就是无数个奇次谐波的正弦波叠加起来的。这个思想太妙了。
# Python实现FFT的简单示例
import numpy as np
import matplotlib.pyplot as plt
# 生成一个模拟信号:50Hz + 120Hz + 噪声
fs = 1000 # 采样频率
t = np.arange(0, 1, 1/fs)
signal = 0.7*np.sin(2*np.pi*50*t) + 1.2*np.sin(2*np.pi*120*t) + 0.5*np.random.randn(len(t))
# 做FFT
N = len(signal)
fft_vals = np.fft.fft(signal)
freqs = np.fft.fftfreq(N, 1/fs)
# 只取正频率部分
positive_freqs = freqs[:N//2]
positive_fft = np.abs(fft_vals[:N//2]) * 2 / N
# 找到峰值频率
peak_idx = np.argmax(positive_fft)
print(f"主频: {positive_freqs[peak_idx]:.2f} Hz")
注意:FFT的结果是复数,幅值需要取绝对值。而且别忘了乘以2/N来归一化,否则幅值不对。我曾经有个学生,做FFT后直接取实部,结果频谱图完全看不懂——这就是没理解FFT的本质。
2.3 采样定理与混叠:别让假信号骗了你
采样定理,也叫奈奎斯特定理。简单说:采样频率必须大于信号最高频率的两倍。为什么?因为采样频率不够,高频信号会伪装成低频信号混进来——这就是混叠。
我给大家讲个真实案例。有一次我在现场测一台风机,转速3000转/分(转频50Hz),我用了100Hz的采样频率。结果频谱图上出现了奇怪的40Hz成分。我查了半天,最后发现是传感器安装共振产生的100Hz信号,因为采样频率不够,100Hz被「折叠」成了100-100=0Hz?不对,实际上是100Hz信号在100Hz采样下,看起来像直流分量。嗯,这个例子有点复杂,但道理是一样的——采样频率不够,信号会「伪装」。
怎么避免混叠?两个办法:
- 提高采样频率:一般建议采样频率是最高分析频率的2.56倍(工程上常用2.56倍,留点余量)
- 加抗混叠滤波器:在采样前用低通滤波器滤掉高于奈奎斯特频率的成分
| 信号最高频率 | 理论最小采样频率 | 工程推荐采样频率 |
|---|---|---|
| 100 Hz | 200 Hz | 256 Hz |
| 500 Hz | 1000 Hz | 1280 Hz |
| 1000 Hz | 2000 Hz | 2560 Hz |
避坑指南:我曾经在测试齿轮箱时,没注意传感器的高频响应,结果采集到的信号里混入了高频噪声,频谱图上一片混乱。后来加了抗混叠滤波器,问题才解决。记住:采样前滤波比采样后处理重要得多。
2.4 窗函数的选择:给信号「加窗」的艺术
为什么要加窗?因为FFT假设信号是周期无限的,但实际采集的信号是有限长的。直接截断会产生频谱泄漏——就是能量从主瓣泄漏到旁瓣,导致频率分辨率下降。
窗函数的作用就是减少这种泄漏。不同的窗函数有不同的特性:
- 矩形窗:频率分辨率最高,但泄漏最严重。适合瞬态信号或周期信号。
- 汉宁窗:最常用的窗函数,泄漏小,频率分辨率适中。我90%的情况都用它。
- 海明窗:类似汉宁窗,但旁瓣更低。
- 布莱克曼窗:旁瓣衰减最大,但主瓣最宽,频率分辨率最差。
我个人习惯:做风机振动分析,首选汉宁窗。为什么?因为风机信号通常是平稳的连续振动,汉宁窗能很好地平衡泄漏和分辨率。如果是做冲击测试(比如轴承故障),我会考虑用矩形窗,因为要保留冲击的瞬态特征。
# 不同窗函数的Python实现
import numpy as np
N = 1024 # 窗长度
# 矩形窗
rect_window = np.ones(N)
# 汉宁窗
hanning_window = 0.5 - 0.5 * np.cos(2 * np.pi * np.arange(N) / (N-1))
# 海明窗
hamming_window = 0.54 - 0.46 * np.cos(2 * np.pi * np.arange(N) / (N-1))
# 布莱克曼窗
blackman_window = 0.42 - 0.5 * np.cos(2 * np.pi * np.arange(N) / (N-1)) + \
0.08 * np.cos(4 * np.pi * np.arange(N) / (N-1))
print("窗函数已生成,可以直接用于信号加窗")
我的建议:如果你不确定用什么窗,先用汉宁窗。它就像信号处理界的「万金油」——不是最好的,但很少出错。等你经验丰富了,再根据具体场景选择其他窗函数。
好了,信号处理入门就聊到这儿。这些基础概念,说白了就是搞振动分析的「内功心法」。内功练好了,后面学什么招式都快。记住:采样频率决定你能看到多高的频率,窗函数决定你看得清不清楚,FFT帮你从时域看到频域——这三者配合好了,风机寿命预测就有了可靠的数据基础。
公众号:蓝海资料掘金营,微信deep3321