4、振动信号基础与FFT变换:时域与频域概念、傅里叶变换原理、Python实现FFT(numpy.fft)、频谱图绘制与特征频率识别
各位同学好,我是老张。在风电行业摸爬滚打了十几年,今天咱们来聊聊振动信号分析里最核心的一个工具——FFT。
说实话,我刚入行那会儿,对FFT也是一头雾水。看着频谱图上那些尖峰,完全不知道它们在说什么。后来踩了不少坑,才慢慢摸出门道。今天我把这些经验整理出来,希望能帮你少走弯路。
4.1 时域与频域:两个角度看世界
先问个问题:你平时看到的振动信号长什么样?
对,就是一条随时间变化的曲线,横轴是时间,纵轴是振幅。这就是时域信号。比如下面这张图,就是一个典型的轴承振动时域波形。
时域信号的特点:
- 直观反映振动幅值随时间的变化
- 能看出信号的整体趋势和异常冲击
- 但很难直接看出频率成分
那频域呢?说白了,就是把信号拆解成不同频率的正弦波,看看每个频率成分的幅值有多大。横轴变成频率(Hz),纵轴变成幅值。
我举个例子你就明白了。想象一下,你听到一段音乐。时域信号就是声波随时间的变化,而频域信号就是告诉你:这段音乐里有钢琴的440Hz、小提琴的660Hz……每个频率有多响。
在风机故障诊断中,我们为什么需要频域?因为不同的故障会激发不同频率的振动。比如:
- 轴承外圈故障:会产生特定的通过频率
- 齿轮断齿:会产生啮合频率及其边频
- 不平衡:主要表现为转频(1X)
你看,只看时域波形,你很难区分这些。但到了频域,一目了然。
4.2 傅里叶变换原理:从时域到频域的桥梁
傅里叶变换,说白了就是一个数学工具,能把时域信号转换到频域。它的核心思想是:任何周期信号都可以分解成一系列不同频率、不同幅值、不同相位的正弦波之和。
公式我就不写了,网上到处都是。我想说的是它的物理意义。
我记得有一次,现场一个风机振动异常,时域波形看起来乱糟糟的,根本看不出问题。我做了FFT之后,发现有个频率成分正好是轴承外圈故障频率。拆开一看,果然外圈有剥落。这就是FFT的价值——把隐藏的信息挖出来。
我的经验:刚开始学FFT时,别纠结于数学推导。先理解它「能干什么」,再慢慢理解「为什么能」。实际项目中,会用比会推导更重要。
4.3 Python实现FFT:用numpy.fft实战
好了,理论说完了,咱们直接上代码。Python里做FFT,最常用的就是numpy.fft模块。
先看一个最简单的例子:生成一个包含50Hz和120Hz的正弦波混合信号,然后做FFT。
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
fs = 1000 # 采样频率 1000Hz
t = np.arange(0, 1, 1/fs) # 时间向量,1秒
# 生成信号:50Hz + 120Hz 正弦波
f1, f2 = 50, 120
signal = np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# 做FFT
fft_vals = np.fft.fft(signal)
freqs = np.fft.fftfreq(len(signal), 1/fs)
# 只取正频率部分
half_len = len(signal) // 2
fft_mag = np.abs(fft_vals[:half_len]) * 2 / len(signal)
freqs_pos = freqs[:half_len]
# 绘制频谱图
plt.figure(figsize=(10, 4))
plt.plot(freqs_pos, fft_mag)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('信号频谱图')
plt.grid(True)
plt.show()
这段代码里,有几个关键点要注意:
np.fft.fft():做FFT变换,返回复数数组np.fft.fftfreq():计算每个FFT点对应的频率值np.abs():取幅值(复数的模)* 2 / len(signal):幅值归一化,还原真实幅值
我曾经踩过的坑:刚开始做FFT时,我忘了做幅值归一化,结果频谱图上的幅值完全不对。后来查资料才知道,FFT输出的幅值需要除以信号长度才能得到真实幅值。另外,只取正频率部分时,幅值要乘以2(因为能量分布在正负频率上)。
4.4 频谱图绘制与特征频率识别
频谱图画出来了,怎么读?这是很多新手头疼的问题。
我一般按以下步骤来:
- 看整体趋势:频谱是平缓还是陡峭?有没有明显的尖峰?
- 找主要频率成分:幅值最大的几个频率点是什么?
- 对比特征频率:把这些频率和理论计算的特征频率对比
- 看边频带:主峰旁边有没有小峰?这往往是调制现象
举个例子,在风机齿轮箱故障诊断中,我们经常关注:
| 故障类型 | 特征频率 | 频谱特征 |
|---|---|---|
| 齿轮断齿 | 啮合频率及其谐波 | 边频带明显,幅值增大 |
| 轴承外圈故障 | 外圈通过频率(BPFO) | 有转频边带 |
| 不平衡 | 转频(1X) | 1X幅值突出,谐波少 |
| 不对中 | 2X转频 | 2X幅值大,常有高次谐波 |
嗯,这里要注意:特征频率不是一成不变的。实际运行中,转速会有波动,负载会变化,特征频率也会跟着漂移。所以我在项目中,一般会留一个±1%的容差范围。
实战技巧:我习惯在频谱图上用竖线标出理论特征频率的位置,然后看实际频谱有没有对应的尖峰。如果匹配上了,基本就能锁定故障类型。
4.5 本章知识体系
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心逻辑串起来了。你看,从时域信号出发,经过傅里叶变换到频域,然后用Python实现FFT,绘制频谱图,最后识别特征频率。每一步都有它的意义。
我的建议:学完这章后,找一段真实的振动数据练练手。网上有很多公开的风机振动数据集。自己动手做一遍FFT,画几张频谱图,比看十遍书都管用。
好了,关于振动信号基础和FFT变换,今天就聊到这儿。记住一句话:FFT是故障诊断的「眼睛」,用好它,你就能看到时域里看不到的东西。
公众号:蓝海资料掘金营,微信deep3321