4、频域分析基础:傅里叶变换(FFT)原理、频谱图解读、功率谱密度(PSD)
做信号处理这些年,我越来越觉得——时域是表象,频域才是本质。
你盯着一条波形看半天,可能啥也看不出来。但把它扔到频域里一瞧,哪个频率有异常、哪个谐波超标,一目了然。说白了,傅里叶变换就是给你一副「频率眼镜」,让你能看见信号里藏着的东西。
4.1 傅里叶变换:从时域到频域的桥梁
傅里叶变换的核心思想很简单:任何信号都可以分解成不同频率的正弦波之和。
数学上长这样:
X(f) = ∫ x(t) · e^(-j2πft) dt
别被公式吓到。你只要记住:输入是时间波形,输出是频率分布。
但在工业现场,我们拿到的信号都是离散采样点,不是连续函数。所以实际用的是离散傅里叶变换(DFT):
X[k] = Σ x[n] · e^(-j2πkn/N), n=0..N-1
直接算 DFT 太慢了,复杂度 O(N²)。所以工程上都用快速傅里叶变换(FFT),复杂度降到 O(N log₂N)。
核心要点:FFT 不是一种新的变换,只是 DFT 的高效算法实现。采样点数 N 最好是 2 的幂次(1024、2048、4096...),这样 FFT 效率最高。
我个人习惯,做振动分析时至少采 2048 点。点数太少,频率分辨率不够,相邻两个频率峰分不开。
4.2 频谱图解读:怎么看懂那些「山峰」
FFT 算完后,你得到的是复数序列 X[k]。通常我们只看幅值谱:
|X[k]| = sqrt(Re² + Im²)
画出来就是一张频谱图——横轴是频率,纵轴是幅值。每个峰代表一个频率分量。
解读时我一般按这几步走:
- 找基频——最低的那个主峰,通常是工频(50Hz)或转频
- 看谐波——基频整数倍位置有没有峰?有的话说明信号畸变了
- 查边频——主峰旁边有没有小峰?那是调制信号,常见于齿轮故障
- 盯噪声底——整个频谱的底噪水平高不高?高了说明干扰大
我的经验:有一次现场电机振动超标,时域波形看着挺正常。我习惯性做了个频谱,结果在 2 倍频处冒出一个大峰——是转子条断裂的典型特征。要是只看时域,这故障根本发现不了。
4.3 功率谱密度(PSD):信号的能量分布地图
幅值谱告诉你「每个频率有多强」,但有个问题——它依赖采样长度和分辨率。换个参数,幅值就变了。
PSD 解决了这个问题。它描述的是信号功率在频率上的分布密度,单位是 W/Hz 或 (m/s²)²/Hz。
计算 PSD 最常用的方法是Welch 法:
- 把信号分成多段(每段可重叠 50%)
- 每段加窗(汉宁窗最常用)
- 对每段做 FFT,取幅值平方
- 对所有段的结果取平均
这样做的好处是:方差小、曲线平滑、可重复性好。
注意:PSD 和幅值谱不是一回事。幅值谱的纵轴是「幅值」,PSD 的纵轴是「功率密度」。两者单位不同,不能混用。我曾经见过有人把 PSD 当幅值谱用,结果阈值设错了,漏报了一堆故障。
4.4 频域分析知识体系
下面这张图,是我自己梳理的频域分析知识框架。每次做项目前我都会过一遍,确保思路不乱:
4.5 关键参数与选型指南
做频域分析时,有几个参数你必须心里有数。我整理了一张表,方便你对照:
| 参数 | 含义 | 计算公式 | 我的建议 |
|---|---|---|---|
| 采样率 fₛ | 每秒采集的点数 | — | 至少 2.56 倍最高分析频率 |
| 频率分辨率 Δf | 频谱中相邻两条谱线的间隔 | Δf = fₛ / N | 振动分析取 Δf ≤ 1 Hz |
| 最高分析频率 fₘₐₓ | 频谱能显示的最大频率 | fₘₐₓ = fₛ / 2.56 | 按信号带宽的 3~5 倍选 |
| 采样点数 N | 一次 FFT 使用的数据长度 | — | 1024、2048、4096,2 的幂次 |
| 窗函数 | 减少频谱泄漏 | — | 一般信号用汉宁窗,冲击信号用矩形窗 |
避坑指南:我曾经在一个项目里,采样率设得太低,结果 200Hz 的故障信号被混叠成了 50Hz 的工频信号。排查了三天才发现是采样率的问题。记住——采样率必须满足奈奎斯特定理,而且最好留 20% 以上的余量。
4.6 频谱泄漏与窗函数
做 FFT 时有个烦人的问题——频谱泄漏。
原因很简单:FFT 假设信号是周期重复的。如果你的采样长度不是信号周期的整数倍,截断处就会产生突变,能量「泄漏」到旁边的频率上。
解决办法是加窗。窗函数让信号两端平滑地衰减到零,减少截断突变。
常用窗函数对比:
| 窗函数 | 主瓣宽度 | 旁瓣衰减 | 适用场景 |
|---|---|---|---|
| 矩形窗 | 最窄 | -13 dB | 冲击信号、瞬态信号 |
| 汉宁窗 | 较宽 | -32 dB | 一般连续信号(首选) |
| 海明窗 | 较宽 | -43 dB | 频率相近的分量分离 |
| 布莱克曼窗 | 最宽 | -58 dB | 要求极低旁瓣的场景 |
我的习惯:做设备状态监测时,我默认用汉宁窗。它旁瓣衰减够用,主瓣宽度也能接受。只有在分析齿轮啮合频率这种冲击信号时,我才换成矩形窗。
4.7 实战:用 Python 做 FFT 频谱分析
光说不练假把式。下面这段代码,是我做振动分析时的常用模板:
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
fs = 2048 # 采样率 (Hz)
N = 2048 # 采样点数
t = np.arange(N) / fs
# 生成模拟信号:50Hz 基波 + 150Hz 三次谐波 + 噪声
x = 1.0 * np.sin(2*np.pi*50*t) + 0.3 * np.sin(2*np.pi*150*t)
x += 0.1 * np.random.randn(N)
# 加汉宁窗
window = np.hanning(N)
xw = x * window
# FFT 计算
X = np.fft.fft(xw, N)
X_mag = np.abs(X[:N//2]) * 2 / N # 单边幅值谱
# 频率轴
freq = np.arange(N//2) * fs / N
# 绘制频谱
plt.figure(figsize=(10, 4))
plt.plot(freq, X_mag)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('振动信号频谱')
plt.grid(True, alpha=0.3)
plt.xlim(0, 500)
plt.show()
这段代码跑完后,你会看到 50Hz 处有个大峰,150Hz 处有个小峰。如果现场设备出现这种频谱,说明电机供电质量有问题,或者转子存在不对中。
4.8 异常信号在频域中的典型特征
做异常识别,你得知道「敌人长什么样」。我总结了几个常见故障的频域特征:
- 转子不平衡:1 倍转频处出现高峰,幅值稳定
- 转子不对中:2 倍转频处出现高峰,常伴有 1 倍频
- 齿轮断齿:啮合频率两侧出现边频带,间距等于转频
- 轴承故障:高频段出现冲击序列,频谱呈「草垛」状
- 松动:出现大量谐波,且幅值不稳定
记住:频域分析不是万能的。对于非平稳信号(比如启动过程中的振动),FFT 会丢失时间信息。这时候需要用到短时傅里叶变换(STFT)或小波变换——那是后面章节的内容了。
嗯,频域分析这块,说到底就是把时间信号掰开了揉碎了,看它到底由哪些频率成分组成。你掌握了 FFT、频谱图、PSD 这三板斧,大部分工业信号的异常识别都能搞定。