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 频谱图绘制与特征频率识别

频谱图画出来了,怎么读?这是很多新手头疼的问题。

我一般按以下步骤来:

  1. 看整体趋势:频谱是平缓还是陡峭?有没有明显的尖峰?
  2. 找主要频率成分:幅值最大的几个频率点是什么?
  3. 对比特征频率:把这些频率和理论计算的特征频率对比
  4. 看边频带:主峰旁边有没有小峰?这往往是调制现象

举个例子,在风机齿轮箱故障诊断中,我们经常关注:

故障类型 特征频率 频谱特征
齿轮断齿 啮合频率及其谐波 边频带明显,幅值增大
轴承外圈故障 外圈通过频率(BPFO) 有转频边带
不平衡 转频(1X) 1X幅值突出,谐波少
不对中 2X转频 2X幅值大,常有高次谐波

嗯,这里要注意:特征频率不是一成不变的。实际运行中,转速会有波动,负载会变化,特征频率也会跟着漂移。所以我在项目中,一般会留一个±1%的容差范围。

实战技巧:我习惯在频谱图上用竖线标出理论特征频率的位置,然后看实际频谱有没有对应的尖峰。如果匹配上了,基本就能锁定故障类型。

4.5 本章知识体系

为了让你更直观地理解本章的知识结构,我画了一张图:

振动信号基础与FFT变换知识体系 时域信号 时间-幅值关系 傅里叶变换 时域→频域转换 频域信号 频率-幅值关系 Python实现FFT numpy.fft.fft() 幅值归一化 频谱图绘制 matplotlib绘图 频率轴设置 特征频率识别 轴承/齿轮故障 边频带分析 核心目标:从振动信号中提取故障特征频率 时域→频域→特征识别→故障诊断

这张图把本章的核心逻辑串起来了。你看,从时域信号出发,经过傅里叶变换到频域,然后用Python实现FFT,绘制频谱图,最后识别特征频率。每一步都有它的意义。

我的建议:学完这章后,找一段真实的振动数据练练手。网上有很多公开的风机振动数据集。自己动手做一遍FFT,画几张频谱图,比看十遍书都管用。

好了,关于振动信号基础和FFT变换,今天就聊到这儿。记住一句话:FFT是故障诊断的「眼睛」,用好它,你就能看到时域里看不到的东西。


公众号:蓝海资料掘金营,微信deep3321