2、傅里叶变换基础:从连续傅里叶变换到离散傅里叶变换
聊傅里叶变换之前,我先问大家一个问题:你平时处理信号,是在时域还是频域?
我猜大部分人第一反应是时域。毕竟我们看到的波形、采集到的数据,都是随时间变化的。但说实话,很多问题在时域里看就是一团乱麻,转到频域反而一目了然。这就是傅里叶变换存在的意义——它帮我们把信号从时间维度,映射到频率维度。
2.1 连续傅里叶变换(CFT)——理论起点
先看最经典的公式。连续傅里叶变换的定义是:
F(ω) = ∫_{-∞}^{∞} f(t) · e^{-jωt} dt
这个公式看着有点吓人,对吧?我刚开始学的时候也懵。但后来我把它拆成三块理解:
- f(t):原始信号,随时间变化
- e^{-jωt}:旋转因子,本质是一个复指数信号
- 积分:把信号和旋转因子做内积,看看它们有多"像"
说白了,傅里叶变换就是在问:"我的信号里,频率为ω的分量有多少?"
举个例子。假设你有一个纯正弦波:
f(t) = cos(2π·100·t)
它的频率是100Hz。做傅里叶变换后,你会在ω=2π·100处看到一个尖峰。其他地方几乎为零。这就是频域的魅力——把复杂的时间波形,浓缩成几个频率点。
核心理解:连续傅里叶变换是理论基石。但在实际工程中,我们几乎不可能直接用它。为什么?因为现实世界的信号是离散的、有限长的。你没法对一个无限长的连续信号做积分。
2.2 离散傅里叶变换(DFT)——工程落地
好,理论说完了。现在聊聊实际干活时用的东西。
我在项目中遇到过这样一个场景:用ADC采集传感器数据,采样率是1kHz,采了1秒钟。得到1000个离散点。这时候你没法用连续傅里叶变换,只能用离散傅里叶变换(DFT)。
DFT的公式长这样:
X[k] = Σ_{n=0}^{N-1} x[n] · e^{-j(2π/N)kn}
对比一下连续版本,你会发现几个关键变化:
- 积分→求和:离散数据只能用累加
- 无限→有限:n从0到N-1,共N个点
- 连续频率→离散频率:k是整数,对应N个频率点
我的习惯:每次写DFT代码前,我都会先确认N的值。N太小,频率分辨率不够;N太大,计算量爆炸。后面我们会讲FFT怎么解决这个问题。
2.3 从连续到离散——采样定理
这里有个坑,我必须提醒你。
连续信号转离散信号,不是随便采几个点就行的。你想想看,如果信号里有个1000Hz的分量,但你只用500Hz采样,会发生什么?
混叠(Aliasing)。高频信号会伪装成低频信号,让你误判。
这就是奈奎斯特采样定理的核心:
采样频率必须大于信号最高频率的两倍。
即:f_s > 2·f_max
我曾经在一个音频项目里吃过这个亏。当时采集麦克风信号,采样率设了8kHz,觉得够用了。结果回放时发现高频部分全变味了。后来一查,麦克风本身能响应到4kHz以上,8kHz采样刚好踩在临界点上,高频分量全混叠到低频区了。
从那以后,我养成了一个习惯:采样率至少留20%的余量。比如信号最高频率10kHz,采样率至少24kHz以上。
2.4 频率分辨率与DFT参数选择
做DFT时,有两个参数你绕不开:
| 参数 | 含义 | 计算公式 |
|---|---|---|
| 采样率 f_s | 每秒采集的点数 | 硬件决定 |
| DFT点数 N | 一次变换用多少数据 | 用户选择 |
| 频率分辨率 Δf | 频域中相邻两个点的间隔 | Δf = f_s / N |
举个例子:
- f_s = 1000 Hz,N = 1000 → Δf = 1 Hz
- f_s = 1000 Hz,N = 100 → Δf = 10 Hz
你看,N越大,频率分辨率越高。但代价是计算量更大,而且需要更长的采样时间。
工程权衡:在CNN与FFT融合的场景中,我通常选择N为2的幂次(如256、512、1024)。这样后面可以用FFT加速。另外,N不要超过你实际能采集到的数据长度。强行补零虽然能增加点数,但不会提高真实分辨率。
2.5 从DFT到FFT——为什么需要加速
直接计算DFT,复杂度是O(N²)。什么意思?
N=1024时,需要约100万次复数乘加。N=4096时,需要约1600万次。在嵌入式设备或实时系统里,这根本跑不动。
我刚开始做实时频谱分析时,用的就是直接DFT。采样率48kHz,N=1024,算一次要好几毫秒。CPU占用率直接拉满,其他任务全卡死。
后来换成FFT,同样的N=1024,计算时间降到微秒级。差距就是这么夸张。
FFT的核心思想就一句话:利用旋转因子的对称性和周期性,把大DFT拆成小DFT。具体怎么拆,下一章我会详细讲。这里你先记住:
- DFT是定义,FFT是算法
- FFT把O(N²)降到O(N log N)
- N=1024时,FFT比DFT快约100倍
2.6 本章小结与实战建议
好,我们来捋一下今天的内容:
- 连续傅里叶变换是理论模型,适合理解频域概念
- 离散傅里叶变换是工程实现,处理有限长离散信号
- 采样定理是前提,采样率不够一切白搭
- 频率分辨率由采样率和DFT点数共同决定
- FFT是DFT的高效实现,后续课程重点
我的建议:如果你刚开始接触DFT,别急着写代码。先拿一个已知频率的正弦波,手动算一遍DFT。比如f=100Hz,f_s=1000Hz,N=10。算完你会发现,频域峰值出现在k=1的位置。这个"aha moment"比看十遍公式都管用。
下一章,我们会深入FFT的核心——蝶形运算与分治策略。到时候我会用实际代码演示,怎么把DFT跑出FFT的速度。敬请期待。