3、信号处理基础(一):时域分析(均值、方差、峰值、峭度)、频域分析(傅里叶变换FFT)、Python实现与可视化。
各位好,我是老张。在风机故障诊断这个行当里摸爬滚打了十几年,今天咱们来聊聊最基础、也最核心的东西——信号处理。
你可能会问,为什么一上来就讲这个?
说白了,风机转不转,转得好不好,全藏在它的振动信号里。就像中医把脉,你得先学会听脉象,才能判断五脏六腑出了什么问题。信号处理,就是咱们给风机“把脉”的那双手。
这一节,咱们先搞定时域和频域这两个最基础的分析手段。别觉得简单,我见过不少老工程师,干了好几年,对峭度、FFT的理解还是模模糊糊的。咱们今天一次性把它理清楚。
核心逻辑: 时域看“表象”,频域看“本质”。时域告诉你信号有多强、有多“跳”,频域告诉你这些跳动是由哪些频率成分组成的。
3.1 时域分析:最直观的“听诊器”
时域分析,就是直接看信号随时间怎么变化。横轴是时间,纵轴是幅值。简单吧?但简单的东西往往最有用。
我记得刚入行那会儿,跟着师傅去现场处理一台引风机的异常振动。师傅拿了个听诊棒,贴在轴承座上听了十几秒,就说:“二级齿轮坏了。”我当时一脸懵。后来才知道,师傅耳朵里听到的“咯噔咯噔”声,在时域波形上就是周期性的冲击。这就是时域分析的雏形。
3.1.1 均值(Mean)
均值,就是信号的平均水平。公式很简单:
μ = (1/N) * Σ x_i
其中N是采样点数,x_i是每个采样点的幅值。
在风机诊断里,均值能告诉你什么?
- 直流分量:如果均值不为零,说明传感器可能有零漂,或者信号里有直流偏置。
- 趋势判断:长期监测中,均值缓慢上升,可能意味着轴承磨损加剧,间隙变大。
我的经验: 处理均值之前,一定要先做去直流处理。否则后续的FFT会在0Hz处出现一个巨大的尖峰,把其他频率成分都淹没了。我曾经因为这个坑,浪费了整整一个下午排查问题。
3.1.2 方差(Variance)与标准差(Standard Deviation)
方差衡量信号偏离均值的程度。标准差就是方差的平方根,单位跟原始信号一致,更直观。
σ² = (1/N) * Σ (x_i - μ)²
σ = sqrt(σ²)
方差大,说明信号“跳动”厉害。在风机上,这意味着振动能量大,可能有问题。
举个例子:一台正常运转的风机,振动标准差可能在0.1-0.3之间。如果某天突然跳到0.8以上,不用想,肯定出事了。可能是叶片结垢、不平衡,或者轴承开始失效。
3.1.3 峰值(Peak Value)
峰值就是信号的最大绝对值。公式:
Peak = max(|x_i|)
峰值对冲击信号特别敏感。齿轮断齿、轴承滚动体剥落,都会产生瞬间的巨大冲击,峰值会突然飙升。
注意: 峰值容易受噪声干扰。一个偶然的电磁干扰脉冲,就能让峰值变得很大。所以单独看峰值不可靠,要结合其他指标一起看。我一般会同时看峰值和有效值(RMS),如果峰值/RMS比值突然变大,那大概率是冲击性故障。
3.1.4 峭度(Kurtosis)
峭度,这是个好东西。它衡量信号分布的“尖锐”程度。公式:
K = (1/N) * Σ ((x_i - μ) / σ)⁴
正常信号的峭度接近3(高斯分布)。如果峭度远大于3,说明信号里有明显的冲击成分。
我为什么说它好?因为峭度对早期故障特别敏感。轴承刚开始出现点蚀时,振动能量还没明显增加,但峭度已经悄悄变大了。我曾经用峭度提前两周预警了一台风机轴承的早期故障,避免了非计划停机。
| 指标 | 物理含义 | 故障敏感性 | 局限性 |
|---|---|---|---|
| 均值 | 信号平均水平 | 低 | 易受零漂影响 |
| 方差/标准差 | 信号波动程度 | 中 | 对早期故障不敏感 |
| 峰值 | 最大冲击幅值 | 高 | 易受噪声干扰 |
| 峭度 | 信号分布尖锐度 | 很高 | 对连续冲击不敏感 |
3.2 频域分析:看穿信号的“X光机”
时域分析虽然直观,但有个致命弱点——它把不同频率的成分混在一起了。你想想看,一个50Hz的振动和一个100Hz的振动叠加在一起,时域波形就是一团乱麻,根本分不清谁是谁。
这时候,频域分析就派上用场了。它能把信号拆解成不同频率的正弦波,让你一眼看出哪个频率的能量最大。
3.2.1 傅里叶变换(Fourier Transform)
傅里叶变换的核心思想:任何周期信号都可以分解成一系列正弦波的和。公式长这样:
X(f) = ∫ x(t) * e^(-j2πft) dt
别被公式吓到。你只需要记住:傅里叶变换把时间信号变成了频率信号。
3.2.2 快速傅里叶变换(FFT)
FFT是傅里叶变换的快速算法。没有FFT,咱们今天处理信号得等到天荒地老。
FFT有几个关键参数,搞不懂它们,你画出来的频谱图就是错的:
- 采样频率(Fs):每秒采多少个点。根据奈奎斯特定理,Fs必须大于信号最高频率的2倍。
- 采样点数(N):一次处理多少个点。N越大,频率分辨率越高。
- 频率分辨率(Δf):Δf = Fs / N。决定了你能区分多近的两个频率。
避坑指南: 我曾经犯过一个低级错误——采样频率设得太低,导致高频成分混叠到了低频区。当时看到频谱里莫名其妙多了个50Hz的尖峰,查了半天才发现是100Hz的混叠。从那以后,我每次做FFT之前,都会先确认Fs ≥ 2.56倍的最高分析频率。
3.3 Python实现与可视化
光说不练假把式。咱们用Python把上面这些指标算一遍,再画几张图看看。
3.3.1 生成模拟信号
先模拟一个风机振动信号:包含一个50Hz的基频、一个150Hz的谐波,再加上一些随机噪声和冲击成分。
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
Fs = 1000 # 采样频率 1000Hz
T = 1 # 采样时长 1秒
N = Fs * T # 采样点数
t = np.linspace(0, T, N, endpoint=False)
# 生成信号:50Hz基频 + 150Hz谐波 + 噪声 + 冲击
x = 1.0 * np.sin(2 * np.pi * 50 * t) + \
0.5 * np.sin(2 * np.pi * 150 * t) + \
0.3 * np.random.randn(N)
# 加入冲击(模拟轴承故障)
impulse_idx = np.arange(0, N, 100) # 每0.1秒一个冲击
x[impulse_idx] += 2.0
3.3.2 时域指标计算
# 均值
mean_val = np.mean(x)
print(f"均值: {mean_val:.4f}")
# 方差
var_val = np.var(x)
print(f"方差: {var_val:.4f}")
# 标准差
std_val = np.std(x)
print(f"标准差: {std_val:.4f}")
# 峰值
peak_val = np.max(np.abs(x))
print(f"峰值: {peak_val:.4f}")
# 峭度
kurt_val = np.mean((x - mean_val) ** 4) / (std_val ** 4)
print(f"峭度: {kurt_val:.4f}")
3.3.3 FFT与频谱绘制
# FFT
X = np.fft.fft(x)
freq = np.fft.fftfreq(N, 1/Fs)
# 只取正频率部分
half_N = N // 2
X_mag = np.abs(X[:half_N]) * 2 / N
freq_pos = freq[:half_N]
# 绘制时域和频域图
plt.figure(figsize=(12, 5))
# 时域图
plt.subplot(1, 2, 1)
plt.plot(t[:500], x[:500]) # 只显示前0.5秒
plt.xlabel('时间 (s)')
plt.ylabel('幅值')
plt.title('时域波形')
plt.grid(True)
# 频域图
plt.subplot(1, 2, 2)
plt.plot(freq_pos, X_mag)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('频谱')
plt.xlim(0, 300) # 只显示0-300Hz
plt.grid(True)
plt.tight_layout()
plt.show()
运行这段代码,你会看到:时域波形里,50Hz的正弦波上叠加了高频噪声和周期性的冲击尖峰。频谱图上,50Hz和150Hz处有两个明显的峰值,这就是信号的“频率成分”。
关键点: 时域里你看到的是“乱”,频域里你看到的是“序”。50Hz是风机的转频,150Hz是它的3倍频。如果频谱里出现了非整数倍的频率成分,比如75Hz、125Hz,那就要警惕了——可能是轴承故障的特征频率。
3.4 小结
这一节咱们把时域和频域的基础打了一遍。时域的均值、方差、峰值、峭度,就像四个不同的“听诊器”,从不同角度听风机的“心跳”。频域的FFT,则像一台X光机,把风机的内部结构照得清清楚楚。
我个人习惯,做故障诊断时,先看时域指标做快速筛查,再用频域分析做精确定位。两者结合,基本能覆盖90%以上的常见故障。
嗯,今天就到这儿。下一节咱们继续深入,聊聊频域里那些更高级的分析方法——包络谱、倒频谱,还有时频分析。这些东西,才是真正能让你在故障诊断中“开挂”的利器。