想象你是一位设备医生,要把电子听诊器贴在工厂的离心泵上,给这台老家伙做一次振动体检。传感器像一个尽职的记录员,以固定的节奏“咔嗒咔嗒”地采下振动波形——这就是“采拍”。但采拍只是第一步,就像录下一段心音不等于听懂了病情。接下来,我们要给录音加上抗混叠滤波器,挡住超出听诊能力的超高频杂音;再剪一段合适长度的录音,用窗函数让两端平滑;然后交给 FFT 这位“频率翻译官”,把它翻译成“频率-强度”清单;再把清单的幅值平方,得到能量分布;为了更可信,我们会像医生多听几遍一样,把录音切成多段分别分析再平均(Welch 平均)。最后,对着频谱图,像看体检报告一样找出异常尖峰,定位故障频率。这一整套流程,就是频谱分析的实战。
掌握频谱分析,意味着你能从一段原始波形中提取出可解释的频域特征,这是振动诊断、音频处理、通信监测等领域 AI 模型的特征工程基础,也是读懂传感器数据的关键能力。
可视化演示
展示频谱分析完整流程(采样→抗混叠→加窗→FFT→功率谱)、加窗处理与FFT频谱效果、以及Welch平均法降低谱估计方差。切换模式探索频谱分析核心环节。
本节配有交互动效(进入视口后自动加载,约 3KB)。
频谱分析完整实践流程 采样→抗混叠滤波→加窗→FFT→功率谱密度估计,五步将时域信号转换到频域 采样率需≥2倍最高频率(奈奎斯特),抗混叠滤波器去除高于fs/2的成分防止频谱混叠 pipeline = sample → anti_alias → window → FFT → PSD 标准化流程确保频谱分析结果可靠
采样与混叠
在给离心泵做体检时,你手中的电子听诊器并不是连续录音,而是每隔一小段固定时间“咔嗒”一声,记录一个瞬时振动值。这个“咔嗒”频率就是采样率。如果泵体刚好有一个非常刺耳的高频尖啸,而你每秒只采样几十次,那些尖啸就会伪装成低频的“嗡嗡”声——在频域里,我们叫它混叠。
任何数字系统都无法记录无限快的振动。要让采样后的疏密点能唯一还原原始波形,采样率必须高于信号中最高频率的两倍,这就是采样定理。最高可无混叠表示的频率称为奈奎斯特频率,它刚好是采样率的一半。
抗混叠滤波器是采样前的低通滤波器,它把高于奈奎斯特频率的成分提前削弱,防止它们折叠到低频区。实际系统中,滤波器会有过渡带,所以工程上常把采样率定为最高分析频率的 2.56 倍或更高。这一步做不好,后面加窗和平均都救不回来。
就像听诊前先告诉录音师“我只关心 1000 Hz 以下的病情”,然后让设备把超出范围的尖叫声在源头滤掉。哪怕后面频谱图再漂亮,如果采样环节产生了“幻听”,所有诊断都可能指错方向。
- 采样率 \(f_s\)表示每秒采样的次数,例如每秒 1000 个样本,单位是 Hz。
- 最高频率 \(f_{\max}\)信号频谱中存在的最高频率成分,它决定采样的难度。
- 奈奎斯特条件采样率必须严格大于两倍最高频率,才能避免混叠并重建原始波形。
截断与泄漏
没有人能无限期地贴在泵上听诊,你总会录下有限长的一段。就像从一卷录音带上剪下一段,剪刀落下之处就是波形突然断开的边界。这种硬截断会在频域里产生一种“涂抹”效果,把本应尖锐的谱线摊开,并向两侧泄漏出能量。
解决方法是给这段录音的两端加上一个平滑的衰减,让中间权重最大,两端渐弱。这个权重函数就是窗函数。不同的窗函数,相当于不同形状的音量推子。最常用的汉宁窗(Hann 窗)形状像半个余弦山丘,它在端点趋近于 0,在中心接近 1。
加窗并不是为了让波形变小,而是为了抑制 FFT 的频谱泄漏。代价是主瓣变宽,也就是频率分辨率略有下降。矩形窗(不加窗)主瓣窄但旁瓣高,汉宁窗主瓣稍宽但旁瓣衰减快,适合大多数振动信号。窗函数的选择,是一个经典权衡。
窗函数使录音在边界处逐渐消失,就像调音师在乐曲结束时把推子缓缓拉下,而不是突然拔掉电源。这样频谱图才干净,真正的故障频率才能从背景里站出来。
- 样本索引 \(n\)窗函数作用于第 \(n\) 个采样点,范围从 0 到 N-1。
- 窗长 \(N\)加窗的数据段长度,N 越大,频率分辨率越高。
- 余弦项这一项让权重在两端接近 0、中间接近 1,形成平滑山丘。
- 整体系数0.5 保证窗函数在中心的增益接近 1,在端点接近 0。
FFT变换
有了干净的一段波形,接下来要把它送给“频率翻译官”。FFT(快速傅里叶变换)就是这位神速的翻译官,它把 N 个时域样本翻译成 N 个频域分量,每个分量对应一个频率的幅度和相位。
FFT 的背后是离散傅里叶变换(DFT),它用 N 个复指数函数去和原始信号做相关。实际 FFT 并不是新变换,只是利用对称性把 DFT 的计算量从 O(N²) 降到 O(N log N),让实时分析成为可能。
翻译出来的 X[k] 是一个复数,它的模就是该频率的幅值,相位角就是该频率的初相位。同时,频率坐标是 k × Δf,其中 Δf = fs / N。如果信号里有一个 127 Hz 的振动,那么它会在 k ≈ f / Δf 处出现一个峰。
翻译官把复杂的振动波形拆成了清单,但这个清单还不是最终报告——幅值需要平方式变成能量,才更有物理意义。
- 输入序列 \(x[n]\)时域中第 \(n\) 个采样值,来自传感器。
- 旋转因子复指数是一个以 \(2\pi k n / N\) 为相位的单位旋转,用来匹配对应频率。
- 求和对所有 N 个样本累加,相当于用该频率的模板去和信号做相关。
- 输出 \(X[k]\)第 \(k\) 个频点的复数幅值,它的模为该频率的幅值。
功率谱估计
FFT 给出的幅值清单,类似每个音符的“响亮程度”。但在很多场景里,我们更关心信号的能量在频域里如何分布,就像你更关心一首歌的能量是集中在低音还是高音,而不只是单一音符响不响。
把 DFT 结果的幅值平方并除以 N,就得到周期图功率谱估计。它表示每个频率分量携带的功率。对于实信号,频谱关于奈奎斯特频率对称,分析时通常只看单边谱,并把非直流分量的功率乘以 2,以保持总功率不变。
周期图方差很大,一次估计的噪声毛刺很多,就像一位紧张的实习生只听一遍就下结论。因此工程上很少直接用整段数据的周期图,而是把它作为 Welch 平均的基础。
把幅值平方,就是把“响度”转成“能量”,这是从波形到功率谱的关键一步。接下来我们要用平均让它更稳定。
- 幅值谱 \(|X[k]|\)取 DFT 结果的模,得到该频率分量的大小。
- 平方把幅值平方,得到该频点的功率。
- 除以 N 归一化使总功率与时域信号能量一致。
- 单边谱修正实信号在正负频率对称,分析时取正频部分并乘 2。
Welch平均
一位有经验的医生不会只听一遍心音就开药,他会多听几个小节,把几次听诊的印象综合起来。Welch 方法正是这个思路:把长录音切成多段,每段加窗后各自做 FFT 和功率谱,再对所有段的功率谱取平均。
Welch 平均能显著降低功率谱的方差,让真实的谱峰从随机噪声中凸显出来。但分段的代价是每段长度变短,频率分辨率下降。用 50% 重叠可以在平均次数和记录长度之间取得平衡。
每一段功率谱称为子周期图,平均次数 M 越大,方差越小,但频率分辨率越粗。实际中,总记录长度固定时,需要权衡 nperseg 和重叠率,这是频谱分析实践中最需要经验的环节。
Welch 平均就像让多位医生独立听诊后再会诊,把个人的噪声抵消掉,留下公认的病灶信号。
- 段序号 \(i\)将总记录分成 M 段,每段长度相同。
- 第 \(i\) 段功率谱对每段加窗并计算周期图。
- 平均将所有段的功率谱相加并除以段数,估计期望功率谱。
- 方差降低M 越大,估计方差越小,但每段越短,频率分辨率越差。
频谱图解读
最终拿到的功率谱图,是体检报告。横轴是频率,纵轴是功率或功率谱密度。看报告的第一件事是找突出的谱峰——它们对应着周期性振动的来源。
对于旋转机械,先计算转频:fr = RPM / 60。例如 3000 转/分的泵,转频为 50 Hz。轴不平衡会在 1 倍转频处激起大峰;不对中常在 2 倍转频出现峰;轴承外圈故障则常在某一个非整数倍频处出现峰。
读图时要特别注意谱峰两侧的小峰——边带。边带间隔等于调制频率,常见于齿轮啮合或轴承磨损。还会看到谐波(整数倍频),它们代表波形畸变而非独立故障。学会区分基频、谐波、边带,才能避免误诊。
就像医生不会看到一次高烧就说是肺炎,频谱分析师看到峰,也要先问:这是基频?谐波?还是边带?再用设备结构知识做最后判断。
- 转速 RPM每分钟转数,是设备铭牌上的常用参数。
- 转频 \(f_r\)每秒转数,单位 Hz。
- 特征频率轴承或齿轮故障频率通常是转频的某个非整数倍或由几何尺寸计算。
工程实践规范
一次完整的频谱分析,像一份标准作业程序。先明确检查目标:要测轴承故障,关心频带可能是 2 kHz;要做齿轮诊断,可能要 10 kHz。目标决定了后续全部参数。
然后按顺序确定采样率(至少 2.56 倍最高分析频率)、采样时长(决定频率分辨率 Δf = fs / N = 1 / T)、窗函数(根据主瓣与旁瓣要求)、Welch 分段长度和重叠率。最后做幅值校准,标注单位和物理量。
常见陷阱包括:忘记抗混叠滤波、窗函数选错、平均次数过高导致分辨率不足、以及没有进行幅值校准。实践中应先用已知频率的测试信号验证全链路,再对真实设备采样。
把每个环节的参数像齿轮一样咬合起来,你才能从“采拍”稳步走到“看图”,让频谱图真正成为故障诊断和 AI 特征工程的可靠依据。
- 采样率 \(f_s\)决定频谱覆盖范围,最高分析频率为 \(f_s/2\)。
- 样本数 \(N\)FFT 处理的点数,通常是 2 的幂。
- 频率分辨率 \(\Delta f\)相邻两根谱线的间隔,记录时长越长分辨率越高。
AI 应用场景
旋转机械故障诊断
阶段:传感器数据采集与特征工程
解决的问题:传统维护靠定期拆检,成本高且无法预警。频谱分析将振动波形转为频域特征,再用规则或 AI 模型判断轴承磨损,实现预测性维护。
具体案例:某化工厂给反应釜电机加装加速度传感器,以 5120 Hz 采样,使用 Welch 平均得到功率谱,发现 73.5 Hz 处有一个非整数倍频峰值,对照轴承特征频率判断外圈滚道剥落,提前两周报警。
音频特征提取
阶段:数据预处理与特征提取
解决的问题:语音识别和音频分类需要将时域波形转为频域特征,频谱分析提供分帧加窗 FFT,构成常用特征如 Mel 频谱。
具体案例:智能音箱的远场语音唤醒,先对 16 kHz 音频按 25 ms 分帧、10 ms 帧移,加 Hann 窗后做 FFT,提取功率谱特征,再由神经网络识别唤醒词。
通信信号监测
阶段:信号检测与频谱感知
解决的问题:在拥挤的无线电频段中识别干扰源,需要计算功率谱密度,判断信号占用频带。
具体案例:频谱监测车对 88-108 MHz 广播频段采样,用 Welch 平均获得清晰功率谱,发现一个超出广播授权的窄带峰值,定位到非法发射机。
Python 演示
import numpy as np def welch_power_spectrum(x, fs, nperseg=512): n = len(x) seg_num = n // nperseg window = 0.5 - 0.5 * np.cos(2 * np.pi * np.arange(nperseg) / (nperseg - 1)) freqs = np.fft.rfftfreq(nperseg, d=1.0 / fs) psd = np.zeros(len(freqs)) for i in range(seg_num): seg = x[i * nperseg:(i + 1) * nperseg] seg = seg * window X = np.fft.rfft(seg) psd += (np.abs(X) ** 2) / (nperseg * np.sum(window ** 2)) psd /= seg_num return freqs, psd def main(): fs = 1000.0 N = 4096 rng = np.random.default_rng(0) t = np.arange(N) / fs f_true = 127.0 x = 0.8 * np.sin(2 * np.pi * f_true * t) + 0.2 * rng.standard_normal(N) freqs, psd = welch_power_spectrum(x, fs, nperseg=512) peak_idx = np.argmax(psd) print("Welch估计峰值频率: %.2f Hz" % freqs[peak_idx]) print("真实信号频率: 127.00 Hz") if __name__ == "__main__": main()
window = 0.5 - 0.5 * np.cos(2 * np.pi * np.arange(nperseg) / (nperseg - 1))按正文的汉宁窗公式生成权重。x[i * nperseg:(i + 1) * nperseg]将长信号切成长度为 nperseg 的段,对应 Welch 分段。seg = seg * window对每段加窗,抑制频谱泄漏。X = np.fft.rfft(seg)用 FFT 把时域段转换为频域复数。psd += (np.abs(X) ** 2) / (nperseg * np.sum(window ** 2))累积每段功率谱,注意归一化。psd /= seg_num对所有段取平均,得到最终 Welch 功率谱。np.argmax(psd)找到峰值索引,再换算为实际频率。
常见误区
误区书上说采样率等于两倍信号频率就能还原,那我直接按两倍采样,也不用加抗混叠滤波器。
正解采样定理要求采样率严格大于两倍最高频率,而且真实信号往往含带外噪声。必须先经过低通抗混叠滤波,把高于奈奎斯特频率的成分在采样前滤掉,否则这些高频会折叠成虚假低频,污染整个频谱图。这就像隔两米想看清蚊子翅膀,必须先把它关在纱窗外面。
为何常见:教材常把采样定理简化为“两倍”,忽略了工程实现中滤波器过渡带和带外噪声的问题。
误区直接对原始数据做 FFT 才是真实结果,加窗不就是人为改数据吗?
正解不加窗等价于用矩形窗截断,波形在两端突然断开,频谱泄漏严重,小信号可能被旁瓣淹没。加窗是所有有限长信号分析的必然选择,只是选择泄漏量不同的窗。就像录音时突然拔电源会爆音,慢慢拉下推子反而能得到干净的音轨。
为何常见:直观上觉得“动了原始数据就是失真”,其实截断本身就是一种窗,矩形窗并不特殊。
误区我做完 FFT,把每个点的模画出来,这不就是功率谱吗?
正解周期图需要除以 N 进行能量归一化,实信号单边谱还要对非直流分量乘 2,否则功率之和与时域能量对不上。报告上写着“功率”但没标单位,后来的幅值比较和故障判断都没法做。
为何常见:很多教程代码省略归一化,画出的形状相似,但物理量不正确。
误区Welch 平均能降噪声,那把信号切得越碎、段数越多,频谱不是越干净吗?
正解总记录长度固定时,段数越多每段越短,FFT 点数越少,频率分辨率越差,可能无法区分两个相邻的真实峰。这就像把一小段录音切成 100 片,每片只有一个音,等于没听。实际要权衡平均次数与每段长度。
为何常见:只盯着方差降低的好处,忽略了分辨率与段长之间的反比关系。
误区看到频谱图里最高的那个尖峰,就直接说是轴承坏了。
正解最大峰可能是转频基波、50 Hz 电源干扰,或者调幅边带。判断故障要结合设备特征频率、倍频关系和边带间隔一起看。医生不能光看到体温高就说是肺炎,还得听肺音、看指标。
为何常见:缺乏设备机理知识,把谱峰与故障简单对应。
面试题
Q1. 一台机器转速为 3000 RPM,其转频是多少?
- A.50 Hz← 正确答案
- B.60 Hz
- C.100 Hz
- D.25 Hz
答案:A。转频 = RPM / 60,3000 / 60 = 50 Hz。这就好比把每分钟心跳次数换算成每秒几跳。其他选项分别对应 3600 RPM、6000 RPM 和 1500 RPM 的情况。
Q2. 抗混叠滤波器通常是什么类型?
- A.低通滤波器← 正确答案
- B.高通滤波器
- C.带通滤波器
- D.陷波滤波器
答案:A。抗混叠滤波器需要在采样前削弱高于奈奎斯特频率的部分,所以是低通。高通会滤掉低频有用信号,带通和陷波针对性太强,不适合通用抗混叠。
Q3. 窗函数的主要作用是什么?
- A.提高采样率
- B.抑制频谱泄漏← 正确答案
- C.增加频率分辨率
- D.放大微弱信号
答案:B。加窗通过平滑数据段两端的边界,降低因截断造成的频谱泄漏。窗本身不会提高采样率,也不会直接增加频率分辨率,反而可能让主瓣略宽。
Q4. 采样率为 1000 Hz,FFT 点数为 1024,相邻谱线的频率间隔约为多少?
- A.0.98 Hz← 正确答案
- B.1.00 ms
- C.1024 Hz
- D.0.50 Hz
答案:A。Δf = fs / N = 1000 / 1024 ≈ 0.98 Hz。频率分辨率只由采样率和点数决定,1.00 ms 是采样间隔,1024 Hz 是采样率或点数本身。
Q5. 计算单边功率谱时,非直流分量为什么要乘以 2?
- A.提高分辨率
- B.补偿负频率部分能量← 正确答案
- C.减小估计方差
- D.增强微弱信号
答案:B。实信号频谱关于奈奎斯特频率对称,负频率与正频率包含相同信息。只看正频时,乘以 2 能保持总功率守恒,就像把左右声道能量合并到一个声道。
Q6. 在总记录长度不变的前提下,增加 Welch 分段数量会导致什么结果?
- A.频率分辨率提高
- B.采样率提高
- C.频率分辨率下降← 正确答案
- D.方差增大
答案:C。分段越多,每段长度越短,FFT 点数越少,因此 Δf 变大,频率分辨率下降。段间平均次数增加会让方差减小,所以正确结论是分辨率下降。
Q7. 频谱图中,转频两侧对称出现的小峰通常表示什么?
- A.轴承外圈故障
- B.调幅边带← 正确答案
- C.量化噪声
- D.电源谐波干扰
答案:B。对称边带常见于幅度调制或齿轮啮合振动,边带间隔等于调制频率。轴承外圈故障一般表现为非整数倍频的独立峰,电源干扰则固定在 50 Hz 附近。
Q8. 为了获得可靠的功率谱,下列哪些做法是正确的?
- A.采样前加抗混叠滤波← 正确答案
- B.对数据段加窗← 正确答案
- C.使用 Welch 平均← 正确答案
- D.把采样率提高到实际需要的 100 倍
答案:ABC。抗混叠滤波、加窗和平均是频谱分析的标准流程。盲目提高采样率会让数据量爆炸,也不解决泄漏和噪声问题,所以 D 不是必要做法。
Q9. 窗函数选择时需要权衡哪些指标?
- A.主瓣宽度← 正确答案
- B.旁瓣衰减← 正确答案
- C.采样率大小
- D.传感器灵敏度
答案:AB。主瓣宽决定频率分辨率,旁瓣高决定泄漏水平,所以窗函数选择主要权衡这两者。采样率由抗混叠需求决定,传感器灵敏度是硬件问题,都与窗函数选择无关。
Q10. 判断频谱峰是否是真实故障时,下列哪些做法有帮助?
- A.多次测量观察峰是否稳定← 正确答案
- B.对比设备特征频率← 正确答案
- C.检查谐波与边带关系← 正确答案
- D.忽略所有小峰只取最大峰
答案:ABC。真实故障峰应稳定出现,且与设备特征频率吻合,并伴随合理的谐波或边带结构。只取最大峰可能误判为电源干扰或转频基波,因此 D 不正确。