想象你是一名演唱会录音师,音响里一直有一阵神秘的“嗡嗡”声。把音轨曲线放大来看(这就是时域视角),你看到一条上下乱抖的波形,隐约觉得有规律,却说不清它有多快、何时重来。可当你调出频谱分析仪(频域视角),神奇的事情发生了:整段录音像被摊成了一排清晰的“音符清单”,58Hz 处立着一根刺眼的高柱——那是舞台电源的电流声,它在时域里躲过了你的眼睛,在频域里无所遁形。如果说时域是“一秒一秒把歌听完”,那频域就是“摊开五线谱一眼看到全部”。这篇文章会带你认识三件改变时序分析视角的乐手工具:FFT(高效记谱器)、小波变换(带时间轴的卡拉OK谱)、谱密度估计(各声部的能量统计表)。学完你就能指着频谱图,像老工程师那样笃定地说:“问题就藏在这个频段里。”
频域特征能直接解锁周期检测、信号降噪、故障诊断和预测特征工程等实战能力,是时序预测与信号处理方向 AI 从业者的必备视角。掌握它,你的特征库会多出一整个维度。
目录
可视化演示
交互展示FFT频率分解、小波时频分析和功率谱密度估计三种频域分析方法,直观呈现时域信号到频域的变换过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
FFT分解:时域→频域 快速傅里叶变换将时域信号分解为正弦波叠加 频谱图显示各频率成分的幅值大小 X(k) = Σ x(n)·e^(-j2πkn/N) FFT 将计算复杂度从 O(N²) 降至 O(NlogN)
时域与频域:听歌与看谱
连着听完一整首歌,你记住的是“先舒缓、后高潮”的流动感——这就是时域视角。可如果你想搞清楚“这首歌为什么这么燃”,光靠听很慢:你得反复倒带,分辨鼓点、贝斯、主唱各做了什么。更聪明的办法是看谱子:五线谱摊开,哪个乐器、什么音高、何时换和弦,一目了然。谱子没有丢掉任何信息,只是换了一种记账方式。
时序数据也像一首歌。传感器每 10 毫秒记一个数,排成一列就是时域信号:横轴是时间,纵轴是数值。它能清楚展示趋势和突变,却很难直接回答“它是否每隔 12 小时循环一次”。频域则把同一段信号重新写成“不同频率正弦波的组合”,横轴变成频率,于是任何周期规律都会变成一根清晰的尖峰。
理解频域的基础语言是正弦波。任何足够平滑的信号都可以看作若干正弦波的叠加——就像任意混合音色都能分解成多个纯音。若某个频率成分很强,频谱图上对应位置就竖起高峰。这就是周期检测的原理:时域里数半天波峰,频域里一行尖峰直接点明周期。一个正弦波自带三个参数,正好对应乐谱上“多响、多高、从哪开始”:
听歌(时域)给你感性的流动感,看谱(频域)给你理性的清单。工程师真正宝贵的时间,往往花在“翻开谱子”的那一下。
- 时刻自变量 t表示现在进行到第几秒,是唯一的输入。
- 振幅 A决定这个音符多响亮,对应波形上下摆动的幅度。
- 频率 f每秒振动多少次,决定音高,单位是赫兹(Hz)。
- 初相位 φ决定 0 时刻从哪个位置开始起振。
- 瞬时值 x(t)三个旋钮组合起来,得到每一时刻的取值。
傅里叶变换:给混音记谱
傅里叶变换像一位“听音记谱师”。他把一段合奏反复与各种纯音对比:那支 2Hz 的摇铃你贡献了多少?那支 440Hz 的小提琴又唱了多少?比完一整圈,输出一张“音符 × 强度”的清单,这就是频谱。时域里纠缠在一起的所有声音,在谱面上各归其位。
技术上说,傅里叶变换把时域函数 $x(t)$ 变成频域函数 $X(f)$。$X(f)$ 在某个频率处的值越大,说明信号里这个频率的成分越强。它是一个数学变换,而不是某个具体算法,是所有频域方法的源头。对离散采样数据,后续会把连续积分改写成对采样点的求和,那就是离散傅里叶变换(DFT)。
连续版本的公式长这样:
记谱师把混音还原成乐谱,我们则用频谱把一堆看似杂乱的时间点还原成“几个周期加一团噪声”。从这之后,任何周期信号在你眼里都不再是一条波浪线,而是一排标明音高的柱子。
- 时域信号 x(t)原始录音,随时间变化的波形。
- 旋转探针 e^{-j2πft}以频率 f 匀速旋转的复指数,像一根带刻度的音叉。
- 乘法匹配把探针与信号逐点相乘,同频处贡献被放大、不同频处被抵消。
- 积分累加把整个时间轴上的匹配值全部加总。
- 频域结果 X(f)信号在频率 f 上的成分强度,复数,模长即幅值。
快速傅里叶 FFT:高效记谱师
如果记谱师一根音符一根音符地听写,一首三分钟的曲子要听三天——这就是直接按定义计算 DFT 的感受。FFT 是那位聪明的记谱师:他把音轨对半剪开,分别听写,再巧妙合并。两个半段里有大量重复计算被他识破并省掉,于是效率从“逐音符听写”跃升到“扫一眼谱架”。
FFT 不是一个新变换,而是 DFT 的快速实现,算出的结果一模一样,只是把计算量从 $O(N^2)$ 降到 $O(N \log_2 N)$。当 N=1024 时省下约百倍计算;现代传感器动辄几百万采样点,没有 FFT 就没有实时频谱分析。离散版本的公式如下:
FFT 的参数也很关键:采样率 fs 决定最高可分辨频率(奈奎斯特频率 fs/2);观测时长 T 决定频率分辨率 Δf=1/T。所以“采集多久”比“采多密”更能决定你能不能分辨两个紧挨着的峰。这位高效记谱师,把频谱分析从实验室搬进了手机 App。
- 采样点 x_n第 n 个时刻记录到的数值,是离散化的信号。
- 采样总数 N一共采集了多少个点。
- 谱线序号 k第 k 个频率桶,k 从 0 数到 N-1。
- 旋转因子以 $k n / N$ 为角速度的复指数探针。
- 累加求和把 N 个采样点的贡献逐个相加,得到第 k 根谱线。
小波变换:带时间轴的乐谱
FFT 的乐谱只告诉你“有哪些音符、多响”,却不告诉你“第几秒在响”。演唱会第 3 分钟突然炸响的鼓点,记谱师只会把它和所有鼓声混在一起。小波变换则像卡拉OK的滚动字幕:不仅标出音符,还在每个音符旁标注“2 分 30 秒出现、持续 0.4 秒”。它给频率加上时间坐标,专门对付非平稳信号。
实现上,小波变换用一个可伸缩、可平移的“小波探针”$\psi(t)$ 去扫描信号:探针压扁(尺度 a 小)时短促灵敏,能抓住高频细节;探针拉长(尺度 a 大)时宽厚沉稳,能看清低频概貌。不同尺度与位置的匹配强度构成一张“时间-频率”二维图。这就是多分辨率分析:高处以细窗看细节,低处用宽窗看概貌,因此特别擅长突变检测,比如脑电棘波、轴承撞击和语音分段。
小波像卡拉OK字幕,让你能指着某一行说:不是整首歌都有毛刺,而是 2 分 30 秒那一下鼓点出了问题。选哪类小波基(如 Haar、Morlet)要看信号形态——这就像选简体谱还是五线谱,顺手最重要。
- 小波母函数 ψ(t)一个短促的“音叉探针”,能量集中在很短的区间里。
- 尺度参数 a探针伸缩的倍数,a 小对应高频细节,a 大对应低频概貌。
- 平移参数 b探针滑到时刻 b 处开始扫描。
- 归一化系数保证探针在不同尺度下能量一致,结果可公平比较。
- 小波系数 W(a,b)时刻 b、尺度 a 处的匹配强度,值越大说明该时刻越像这个频段的小波。
谱密度估计:各声部的能量表
前面的工具告诉你“有哪些音符”,但现场调音师更常问:“低音区到底占了多少能量?”谱密度估计相当于给每个音区装一只积分音量表:把 20-200Hz 低音区的所有响度累加,得出“低频贡献 30%”,再如法炮制中频和高频。一张能量分布表,回答的是“力量集中在哪儿”。
功率谱密度(PSD)描述信号功率在频率轴上的分布。最朴素的做法是周期图:对信号做 FFT,取模平方,再除以采样点数 N,得到每个频率上的平均功率。但单次周期图方差很大,像只用一只话筒测音量,读数抖得厉害。工程上常用 Welch 法改进:把信号切成多段、分别求周期图、再取平均,用段数换方差、用窗函数压制频谱泄漏。
有了能量表,我们就能说:“这台机器的噪声集中在 500Hz 到 2kHz,请加一块专治这个频段的吸音棉。”量化让处理目标变得具体,也让“严重程度”可以比较、监控和预警。
- 内层求和与 DFT 相同的记谱运算,先算出该频率的复数成分。
- 模平方把复数变成实数功率,负频率与正频率能量在此合并。
- 除以 N 平均把总功率摊到每个采样点上,得到平均功率。
- 组合成周期图完整写法,谱峰对应主导周期,曲线下方面积对应频段总能量。
三者对比选型:按需挑工具
三种工具对应三本不同的谱:FFT 是“和弦总览谱”,不管时间,只问整体有哪些成分;小波是“卡拉OK滚动谱”,时间和频率双坐标;谱密度是“能量分布统计表”,统计各频段合计贡献。搞混它们,就会犯“拿总览谱找鼓点时刻”的错误。
选型记住三条原则:① 信号平稳、只关心整体周期,选 FFT,最简洁高效;② 信号非平稳或有突变、需要定位时刻,选小波;③ 任务需要量化频段能量、横向比较强度,选谱密度。三者不是竞争关系,常见流水线是:先 FFT 找主导周期,再小波定位异常时刻,最后谱密度量化严重程度。
| 工具 | 视角 | 擅长 | 局限 |
|---|---|---|---|
| FFT | 全局频谱 | 平稳信号、整体周期 | 丢失时间定位 |
| 小波变换 | 时频二维 | 非平稳、突变定位 | 参数多、解释成本高 |
| 谱密度估计 | 能量分布 | 频段能量量化 | 丢失相位信息 |
无论选哪本谱,都要记住时域与频域的总能量是同一个数——它们只是两种记账方式。这就是 Parseval 定理:
成熟的算法工程师像熟练的调音师,台面上摆着三本谱,按需翻开,甚至组合使用。选工具不是比谁高级,而是比谁更贴合眼下的问题。
- 时域能量把每一时刻瞬时值的平方在整段时间上累加。
- 频域能量把每个频率成分强度的平方在整个频带上累加。
- 能量守恒两种记账方式算出来的总能量一致,此消彼长但总量不变。
频域特征应用:修音与预测
记谱的最终目的是修音:把频谱里那根 58Hz 噪声柱削掉,再合成回去,嗡嗡声消失而歌声无损——这就是降噪。同样,在预测任务里,频域把“看不清的周期”变成“可量化的特征”,让模型少走弯路。频域特征工程有三件套:① 频域峰值,即幅值最大的几个频率及其幅值;② 频带能量,把特定频段(如脑电 α 波的 8-13Hz)的谱密度积分;③ 谱熵,能量分布越均匀熵越大,衡量信号的紊乱程度。这些特征可以像普通表格列一样喂给模型,对带周期或振动结构的数据尤其有效。
量化某个频段强弱的核心算式是频带能量:
落到工业现场:轴承磨损会在转频两侧长出“边带峰”,用 FFT 捕捉边带频率、用小波定位冲击时刻、用频带能量跟踪劣化趋势,就能提前两周预警故障。就像修音师精准剪掉噪音频段,数据科学家精准提取规律频带——频域视角让“对症下药”四个字终于有了坐标。
- 谱密度 S(f)每个频率处的能量密度,曲线越高代表该频段越有“劲”。
- 频段边界 f1、f2你要统计哪一段音区,比如 α 波的 8-13Hz。
- 积分求和把区间内每一小段的能量密度累加,得到面积。
- 频带能量 E_band该频段的总能量,可直接作为特征输入模型或做门限判断。
AI 应用场景
工业设备故障诊断
阶段:特征工程
解决的问题:传统做法靠老师傅“听音辨故障”,主观且难以规模化;时域波形对早期轴承磨损很不敏感。利用 FFT/小波从振动加速度计提取频谱特征:正常轴承的谱峰集中在转频及其整数倍,磨损后会出现边带峰和宽带抬升,这些频带能量直接作为特征送入分类模型,实现客观、可复现的预警。
具体案例:某风电场齿轮箱振动信号,采样率 2560Hz,每 10 秒一段。先用 FFT 找到啮合频率 780Hz 附近的主峰,再用小波定位冲击出现的时刻,最后用 500Hz-1kHz 频带能量的变化趋势做预警,提前两周发现齿面点蚀。
脑电信号睡眠分期
阶段:信号预处理与特征提取
解决的问题:脑电是非平稳信号,不同睡眠阶段有特征节律(α 波 8-13Hz、δ 波 0.5-4Hz),对整段做 FFT 会抹掉节律切换的时刻。用小波将信号分解到多个尺度,再提取各尺度的能量占比作为特征,能保留“何时出现什么节律”的关键信息。
具体案例:32 通道脑电数据,先带通滤波再做小波分解,取 δ/θ/α/β 四个频带的能量占比与谱熵送入随机森林,睡眠分期的准确率从纯时域特征的 78% 提升到 89%。
电力负荷预测的特征工程
阶段:特征工程与预测
解决的问题:纯时域的滑动平均特征无法显式告诉模型“存在 24 小时周期”,模型只能硬学。用谱密度估计找到日周期(1/24h≈0.0417Hz)和周周期的谱峰,据此构造小时点、星期几、频带能量等频域辅助特征,喂给 LSTM 或 Prophet 能显著改善长周期预测。
具体案例:某园区 15 分钟粒度的负荷数据,谱密度曲线上 24 小时峰的幅值比 12 小时峰高约 40%,据此设计周期特征并挑选滞后阶数,预测 MAPE 从 8.6% 降到 5.1%。
Python 演示
# -*- coding: utf-8 -*-"""Frequency domain analysis demo: extract dominant frequencies via FFT."""import numpy as np def generate_signal(n=1024, fs=100.0): # 合成信号: 2Hz / 5Hz / 11Hz 三个正弦分量, 再加一点噪声 t = np.arange(n) / fs x = (0.9 * np.sin(2 * np.pi * 2.0 * t) + 0.6 * np.sin(2 * np.pi * 5.0 * t) + 0.35 * np.sin(2 * np.pi * 11.0 * t) + 0.05 * np.random.randn(n)) return t, x def fft_spectrum(x, fs): # 实信号专用 FFT, 只算正半轴, 省一半计算量 n = len(x) spec = np.fft.rfft(x) # 离散傅里叶变换 freqs = np.fft.rfftfreq(n, 1.0 / fs) # 每条谱线对应的频率 amps = 2.0 * np.abs(spec) / n # 复数模长转幅值, 单边乘 2 return freqs, amps def top_frequencies(freqs, amps, k=3): # 按幅值降序取前 k 个主频 idx = np.argsort(amps)[::-1][:k] return [(freqs[i], amps[i]) for i in idx] def main(): fs = 100.0 t, x = generate_signal(n=1024, fs=fs) freqs, amps = fft_spectrum(x, fs) print("N = %d, fs = %.1f Hz" % (len(x), fs)) for f, a in top_frequencies(freqs, amps): print("dominant freq = %.2f Hz, amplitude = %.3f" % (f, a)) # 谱密度估计思想: 各频段能量求和再平均, 先去掉直流分量 energy = np.sum(amps[1:] ** 2) / len(amps[1:]) print("mean band energy = %.4f" % energy) if __name__ == "__main__": main()
spec = np.fft.rfft(x)一次 FFT 把全部频率成分算出来,rfft 只算正半轴更省。freqs = np.fft.rfftfreq(n, 1.0 / fs)生成每条谱线对应的频率坐标,方便后续按 Hz 解读。amps = 2.0 * np.abs(spec) / n复数的模是幅值,乘 2 还原单边幅值,直流分量除外。idx = np.argsort(amps)[::-1][:k]幅值降序排列,取出前 k 个主频,对应“最强音符清单”。energy = np.sum(amps[1:] ** 2) / len(amps[1:])去掉直流后求频段平均功率,是谱密度估计的雏形。
常见误区
误区频谱图上哪根尖峰最高,那个频率对应的周期就最长,所以峰高代表周期大。
正解频率和周期是倒数关系 T=1/f。峰高只代表这个频率成分的幅值(能量)强,和周期长短毫无关系。2Hz 的峰即使很矮,周期仍是 0.5 秒;11Hz 的峰再高,周期也只有约 0.09 秒。就像乐谱里“最响的那个音”绝不等于“最低沉的那个音”。
为何常见:直觉上“越高越大”容易和“越大越长”混淆,把幅值强度与周期长度两把尺子叠在了一起。
误区小波能看到频率随时间变化,说明它比 FFT 强大,所有信号都应该优先用小波。
正解工具没有高下,只有匹配。对平稳信号,FFT 结果简洁、计算快、解释直观;小波虽然能时频定位,但多了尺度参数,结果更复杂,调参成本也更高。好比卡拉OK字幕虽炫,但你只想确认整首歌有没有 50Hz 电流声,一张频谱图就够了。
为何常见:小波是“后来者”且功能更丰富,初学者容易默认“新 = 好”,忽略了代价与场景。
误区把采样率提高一倍,频谱就能把两个很接近的峰分开了,所以分辨率由采样率决定。
正解频率分辨率由观测时长决定:Δf=1/T。提高采样率只扩大最高可测频率(奈奎斯特 fs/2),并不改变谱线间距。要让相隔 0.1Hz 的两个峰分开,必须把信号多录 10 秒,而不是把每秒点数翻倍。放大镜倍数再高,也看不到你根本没有拍到的内容。
为何常见:采样率和分辨率都带“高”字,方向容易混淆;而且提高采样率确实会让谱线看起来更密,产生“分辨率提高了”的错觉。
误区某个频率上谱密度值很高,那这个频率的正弦振幅一定很大。
正解谱密度是频率处的功率密度,它正比于振幅的平方,还依赖分辨率带宽和窗函数;两个频率靠得很近时,谱密度还会把能量“抹开”。想报“振幅多大”应读 FFT 幅值谱,想报“能量集中在哪”才读谱密度。好比音量表上的分贝数不能直接当作琴键按下去的力度。
为何常见:FFT 幅值谱和谱密度都画成“频率-数值”曲线,形状相似,初学者容易直接把两条曲线画等号。
面试题
Q1. FFT 频谱图中,某根尖峰对应的横轴坐标代表什么?
- A.该成分的频率大小← 正确答案
- B.该成分的幅值大小
- C.该成分出现的时间
- D.采样点的序号
答案:A。频谱图的横轴是频率,纵轴才是幅值。尖峰出现在哪个横轴位置,就说明信号里含有哪个频率的成分,好比乐谱上音符所在的位置决定音高。B 是纵轴含义,C 是时域概念,D 与频率无关,均不对。
Q2. 某机器的振动每 0.25 秒重复一次,对应的基频是多少?
- A.0.25 赫兹
- B.4.00 赫兹← 正确答案
- C.2.50 赫兹
- D.25.0 赫兹
答案:B。频率是周期的倒数,f=1/T=1/0.25=4Hz。周期越长频率越低,周期 0.25 秒属于较快振动,对应 4Hz。记不住倒数关系时,可以想“一秒振几下”:0.25 秒一下,一秒正好四下。
Q3. FFT 把 DFT 的计算复杂度从多少降到了多少?
- A.从 O(N) 降到 O(log N)
- B.从 O(N^2) 降到 O(N log N)← 正确答案
- C.从 O(N log N) 降到 O(N^2)
- D.从 O(N^2) 降到 O(N)
答案:B。直接按定义算 DFT 要对 N 个频率各做 N 次运算,复杂度 O(N^2);FFT 用分治策略复用中间结果,降到 O(N log N)。D 的 O(N) 不可能,因为输出本身就有 N 根谱线。N 越大,FFT 省下的计算越可观。
Q4. 相比 FFT,小波变换的主要特点包括哪些?
- A.可定位频率出现的时间← 正确答案
- B.适合分析非平稳信号← 正确答案
- C.只能分析平稳周期信号
- D.同时有尺度与平移双参数← 正确答案
答案:ABD。小波的尺度 a 对应频率、平移 b 对应时间,天然给出“时间-频率”二维定位,适合非平稳信号,所以 A、B、D 正确。C 说反了:只能处理平稳信号是 FFT 的局限,而非小波的特点。
Q5. 以 100Hz 采样率采集信号,理论上能分辨的最高频率是多少?
- A.25 赫兹
- B.50 赫兹← 正确答案
- C.100 赫兹
- D.200 赫兹
答案:B。奈奎斯特频率等于采样率的一半,100Hz 采样最多忠实还原 50Hz 以内的成分,超出部分会发生混叠,伪装成低频信号。想测更高频率,只能提高采样率,这是“采多密决定能看多高”的经典结论。
Q6. 谱密度估计回答的核心问题是什么?
- A.信号整体均值是多少
- B.能量在各频段如何分布← 正确答案
- C.信号随时间如何变化
- D.采样误差有多大
答案:B。谱密度把总功率按频率摊开,回答“能量集中在哪个频段”,曲线下的面积就是频段能量。A 是均值统计,C 是时域关心的事,D 与采样误差无关。好比给乐队各声部分别装音量表,问的是“低频占几成”。
Q7. 想让频谱区分两个距离很近的频率成分,正确的做法包括?
- A.延长观测信号的时长← 正确答案
- B.提高采样率但时长不变
- C.只对结果做平滑处理
- D.对原始数据末尾补零
答案:A。频率分辨率由观测时长决定,Δf=1/T,所以 A 正确。B 中时长不变只提高采样率,分辨率不变;C 中平滑反而可能把两个峰糊成一个;D 中补零只是插值出更密的谱线,并不会产生真实分辨能力。三者都治标不治本。
Q8. 振动信号中出现一次短暂冲击,想同时定位冲击发生的时刻与频带,应选择?
- A.对全段信号直接做 FFT
- B.用小波变换做时频定位← 正确答案
- C.只计算信号的均值和方差
- D.用谱密度估计总能量
答案:B。冲击是典型的非平稳事件,FFT 会把冲击能量摊到全时段,丢失“何时发生”;小波变换同时保留时间与频率信息,最适合定位短暂冲击。A 无时间信息,C 是标量统计,D 只能看能量谱不能定时刻,均不满足题意。
Q9. 改进周期图方差偏大的常用手段有哪些?
- A.对信号分段求平均← 正确答案
- B.加窗函数抑制泄漏← 正确答案
- C.直接放大频谱幅值
- D.折衷段长与段数平衡← 正确答案
答案:ABD。Welch 法把信号切成多段求周期图再平均,方差随段数下降,但同时分辨率变差,所以要在段长与段数间权衡,A、D 正确;加窗能压制频谱泄漏的旁瓣,B 正确。C 放大幅值只改变刻度,不改方差,属于错误手段。
Q10. 关于频率分辨率 Δf=1/T 与采样点数 N、采样率 fs 的关系,下列说法正确的是?
- A.采样率不变时加长观测时长← 正确答案
- B.时长不变时增加采样点数← 正确答案
- C.补零能把真实谱峰一分为二
- D.频率分辨率等于采样率除点数← 正确答案
答案:ABD。A 中 fs 不变、时长 T 增加,Δf=1/T 变小,分辨率提高。B 中时长不变、增加 N 意味着 fs 提高,而 Δf=fs/N=1/T 不变,真实分辨率不变,说法正确。C 中补零只做插值平滑,不能把单一真实谱峰分开,错误。D 中 fs/N=1/T=Δf 正是分辨率的表达式,正确。此题考察对“分辨率由时长决定”这一本质的理解。