FFT,也就是快速傅里叶变换,是一种快速计算离散傅里叶变换(DFT)的方法。如果你有一组等间隔采样点,DFT 会告诉你这些样本中包含了多少不同的离散频率模式。
关键点在于,FFT 并不会改变结果。它得到的 DFT 数值与直接套公式计算完全相同,只是中间少做了大量重复工作。
一句话理解 FFT
FFT 是一种更快的算法,用来计算 DFT 所定义的那组频域数值。
DFT 在测量什么
假设你有样本 。DFT 会生成数值 ,定义为
每个 都表示数据与某一种离散频率模式匹配得有多强。
如果这些样本是以采样率 等间隔取得的,那么相邻频率 bin 之间的间隔是
这个条件很重要。如果不知道采样率,你仍然可以得到 DFT 的各个 bin,但无法把它们标成赫兹这样的实际物理频率。
为什么 FFT 更快
FFT 是一类高效计算 DFT 的算法。它最核心的技巧,是复用复指数因子中的结构,而不是从头反复计算几乎相同的求和。
最容易直观理解的版本是基 2 FFT。它在 是 的幂时最自然,会先把一个长度为 的变换拆成两个长度为 的变换,再把结果合并起来。
对于直接计算 DFT,运算量大致按 增长。对于常见的 FFT 方法,运算量则降到大约 。
这就是 FFT 在实际中如此重要的原因。输入规模小时,两种方法都可能还算能接受;但输入一大,FFT 就会快得非常明显。
FFT 如何拆分计算
FFT 不会直接把每个样本都与每个频率模式逐一比较,而是先把问题拆成更小的变换,再用相位因子把结果重新组合。
一种标准拆分方式是:
- 把偶数索引的样本放进一个列表。
- 把奇数索引的样本放进另一个列表。
- 分别对这两个列表计算更小的变换。
- 再把两部分合并。
这就是分治法在频率分析中的应用。
4 点 FFT 例子
考虑下面这个 4 点信号
这个模式在 和 之间交替出现,所以我们预期它会表现出一定的频率结构,而不是得到一个完全平坦的结果。
按偶数索引和奇数索引拆分:
偶数部分的 2 点 DFT 是
奇数部分的 2 点 DFT 是
对于 4 点 FFT,合并步骤为
其中
因为 ,所以合并过程特别简单:
现在来解释这个结果。
是零频项,因此它反映了样本的非零平均值。 的非零值则刻画了这个 4 点例子中模式的交替部分。如果你先减去均值,那么 项就会消失,交替成分会更清楚地显现出来。
这个例子虽然很小,但思路是可以推广的:先求更小的变换,再把它们合并,而不是每次都把整个求和重新算一遍。
FFT 常见误区
把 FFT 和 DFT 当成不同结果
并不是。FFT 只是更快地计算 DFT 的一种方法。
过早把 bin 当成实际物理频率
只有在已知采样间隔时,bin 的位置才能对应到实际物理频率。如果采样率是 ,那么对于等间隔采样,bin 间隔就是 。
以为零填充会增加新信息
零填充会让频谱看起来更平滑,因为它更细地采样了底层变换,但它并不会增加新的实测数据。
忽略信号预处理
去均值、加窗以及谨慎选择采样方式都可能非常重要。如果忽略这些条件,FFT 输出对给定样本来说在数学上仍然是正确的,但在解释时可能会产生误导。
FFT 用在哪里
凡是你需要从采样数据中快速获得频域信息的地方,都会用到 FFT。常见例子包括频谱分析、滤波、图像处理、振动分析、微分方程的数值求解,以及快速多项式或卷积计算。
原因很实际:很多运算在从样本域转到频域之后,会变得更容易或更高效。
试试一个类似的例子
取一段正弦波在一个完整周期内的 个等间隔采样点,用计算器或脚本算出它的 DFT。然后给它加上一个常数偏移,再比较新的输出。观察 变大,是理解 FFT 分离了什么内容的一种简单方式。