3、信号处理基础(一):时域分析(均值、方差、峰值、峭度)、频域分析(傅里叶变换FFT)、Python实现与可视化。

各位好,我是老张。在风机故障诊断这个行当里摸爬滚打了十几年,今天咱们来聊聊最基础、也最核心的东西——信号处理。

你可能会问,为什么一上来就讲这个?

说白了,风机转不转,转得好不好,全藏在它的振动信号里。就像中医把脉,你得先学会听脉象,才能判断五脏六腑出了什么问题。信号处理,就是咱们给风机“把脉”的那双手。

这一节,咱们先搞定时域和频域这两个最基础的分析手段。别觉得简单,我见过不少老工程师,干了好几年,对峭度、FFT的理解还是模模糊糊的。咱们今天一次性把它理清楚。

核心逻辑: 时域看“表象”,频域看“本质”。时域告诉你信号有多强、有多“跳”,频域告诉你这些跳动是由哪些频率成分组成的。

信号处理基础知识体系 振动信号 时域分析 频域分析 均值/方差 峰值 峭度 傅里叶变换 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%以上的常见故障。

嗯,今天就到这儿。下一节咱们继续深入,聊聊频域里那些更高级的分析方法——包络谱、倒频谱,还有时频分析。这些东西,才是真正能让你在故障诊断中“开挂”的利器。


专注资料整理