AI 工程地基 20|傅里叶变换:同一列数,第二种读法

这是「AI 工程地基」系列第二十篇。我们在啃 GitHub 上 58k star 的开源课 ai-engineering-from-scratch,一课一课过它的数学地基。上一篇讲复数,i 的本职工作是旋转。这一篇全是那根旋转的戏。

目录
  1. AI 工程地基 20|傅里叶变换:同一列数,第二种读法
  2. 拿旋转去对表
  3. 换坐标,不丢一个比特
  4. 一万亿和两千万之间,隔一个巧劲
  5. 混叠:快波冒充慢波
  6. 分辨率:想看得细,先看得久
  7. 窗:不是免费的
  8. 卷积变乘法
  9. 位置编码:这课离你最近的出口
  10. 从练习 3 开始

AI 工程地基 20|傅里叶变换:同一列数,第二种读法

这是「AI 工程地基」系列第二十篇。我们在啃 GitHub 上 58k star 的开源课 ai-engineering-from-scratch,一课一课过它的数学地基。上一篇讲复数,i 的本职工作是旋转。这一篇全是那根旋转的戏。

一段录音存进电脑,就是一列数:每几毫秒量一次气压,量一万次。股价是一列数,一天一格。图片摊平了也是一列数。这些数有个共同的读法——沿着时间往后看,看每一步的值怎么变。这个读法很好用,但有些问题它天生答不了。这段录音是一个纯音,还是几个音的和弦?这支股票有没有周循环?图里有没有重复的纹理?这些问的都是「里面装着哪些快慢」,不是「第几步是多少」。

傅里叶变换就是第二种读法。同一列数,换个角度:不看每一步的值,看里面有哪些频率的波、各有多强、从哪里起步。

拿旋转去对表

上一篇说过,复数乘上 e^{iθ} 就是转 θ 角。傅里叶变换全部建立在这根旋转上。

办法出奇地直接。你想知道信号里有多少「每 N 步转 k 圈」的成分,就造一根这个快慢的旋转尺,让信号跟它走一遍:信号正着转,尺子反着转。如果信号里真有这个快慢的波,两者全程保持同相,逐项相乘再求和,会累积出一个大数。如果没有,各项正负相抵,和接近零。造 N 根不同快慢的尺子挨个试,N 个系数就出来了。这就是离散傅里叶变换,DFT。

每个系数是个复数。模长告诉你这个频率有多强,辐角告诉你它从哪里起步。

系数怎么读:第 0 个是直流,全部样本之和,就是平均值乘 N。中间那个是奈奎斯特频率,采样率的一半,这套样本能表示的最快振荡。对实数信号,后半截系数是前半截的镜像——有用的信息只在前一半多一点,这也是为什么实信号的频谱图只画一半。

换坐标,不丢一个比特

把 N 个系数乘回旋转因子、除以 N,原信号原样回来。不是近似,是精确重构。傅里叶变换不压缩、不丢东西,它只是换了一套坐标:同一列数,横着读是时间,竖着读是频率。

正因为是无条件换坐标,有件事值得停下来想一想。任何一列数都分解得同样完美。一段纯音和一段白噪声,送进去都得到 N 个干干净净的系数。课程开篇那句口号「每个信号都是正弦波之和」,在离散世界里严格成立——成立到不挑食的程度。分解永远成立,解释才需要挑剔:先得问信号里是不是真有稳定的节律,系数才有意义。垃圾信号拆出来的正弦波,一根根也都很精神,只是合起来还是垃圾。

一万亿和两千万之间,隔一个巧劲

按定义算 DFT 是 N² 挡的:N 个系数,每个要乘加 N 次。一百万个样本,一万亿次运算。

1965 年 Cooley 和 Tukey 发表了一个巧劲:把信号按下标分成偶数位和奇数位两半,各算一个半长的 DFT,再用一个旋转因子(行话叫 twiddle factor)拼回去。每一层拼的活是 O(N),一共 log₂N 层。总量从 N² 掉到 N log N。一百万样本,一万亿变成两千万,五万倍。现代音频、图像、通信全站在这五万倍上。

有个细节要读细。课程说:FFT 要求信号长度是 2 的幂,实践中补零到下一个 2 的幂。我拿这句话去试了试周围的工具。999 个点、甚至 127 个点——素数个,没法按奇偶对半分到底——直接喂给 numpy 的 FFT,它照算不误,结果跟一格一格硬乘的笨办法全部对得上,误差在 10⁻¹¹ 量级。2 的幂这个限制,属于课堂上的递归版本(这一课自己写的 fft 函数,遇到奇数长度就退回去用慢的 DFT)。现代的库对任意长度都有路:长度能拆成小因子就混合基,素数长度有专门的算法兜底。课本把自家教学实现的限制,说成了 FFT 这门技术的限制。

顺带还核了一个小数字:课件配图写着 8 点 FFT 是「24 次乘法」。真去数,乘法是 12 次,24 是加法的数。结论不受影响,只是数字贴错了口袋。

混叠:快波冒充慢波

比奈奎斯特快的波,采下来会冒充慢波。课程举的例子:90 Hz 的正弦波用 100 Hz 采,看起来跟 10 Hz 一模一样。

我逐个样本比过。不是「一模一样」——是差一个负号。90 Hz 采出来的每个点,恰好是 10 Hz 对应点的相反数;幅度谱则完全分不出来。90 Hz 混叠成的严格说是负 10 Hz,正负频率的幅度谱共享同一面镜子。仅凭这些样本,多少数学都救不回 90 Hz。所以模数转换器采样前都要先过一个抗混叠滤波器,把太快的东西挡掉。深度学习里给特征图降采样时不做低通,会踩同一个坑,抗混叠池化就是给这个坑修的路。

分辨率:想看得细,先看得久

频谱上相邻两根 bin 隔多远,只由观察时长决定。看 1 秒,bin 宽 1 Hz;看 2 秒,bin 宽 0.5 Hz。

一个常见误会:数据不够,补一堆零再算,分辨率不就上去了?课程专门立了一节讲这件事:不行。补零只是在已有的 bin 之间插值,谱看着平滑了,两根挨着的峰该分不开还是分不开。我实测验证了判据的边界:10.5 Hz 和 11.5 Hz 两个音,相隔恰好 1 Hz,拿 1 秒数据算,两个峰鼓成一个包(两个频率都骑在 bin 的缝上);拿 2 秒数据,两根尖峰清清楚楚。要分开相隔 Δf 的两个频率,至少要 1/Δf 秒的真实观察。想看得更细,唯一的办法是看得更久。

窗:不是免费的

DFT 把你这 N 个样本当成一个永远循环的周期。信号头尾不衔接,接缝处就有个跳变,跳变是「无穷快」的变化,会把能量洒满整个频谱。这叫频谱泄漏:明明只有一根频率,谱上两边全亮。

补救是给信号戴帽子:两端慢慢压到零,中间留着。Hann 窗把最响的旁瓣压到 -31 dB,Hamming 到 -42 dB,Blackman 到 -58 dB。我用 4096 点的窗逐个测了:-13.5、-32.3、-42.7、-58.1 dB,跟课程表格的 -13/-31/-42/-58 全部对上。代价是主峰变胖——挨得近的两个频率更难分清。

课程练习 4 里埋了一个反直觉的对照,值得亲手跑一遍。两个音,10 Hz 和 12 Hz,采样 1 秒,各自都转了整圈数。这时不加窗的谱是完美的:两根尖峰高 64,其余每个 bin 都是零,一个数都不漏。反而加了 Hann 窗之后,旁边的 bin 升到 32——窗把主瓣加宽的代价当场现形。把频率挪到 10.5 和 12.5 Hz(骑在缝上),局面反过来:不加窗,泄漏得一塌糊涂;加窗,救命。窗不是免费的,也不是永远该加的。信号恰好整周期时,矩形窗才是正解——课程在练习提示里自己承认了这一点:「不加窗可能反而最好」。一个练习里藏着对正文直觉的反例,这是好教材的写法。

卷积变乘法

信号处理里最漂亮的一条定理:时域的卷积,等于频域的逐点相乘。把信号和滤波器都变换过去,对应位置相乘,再变回来,结果和滑窗累乘一模一样,费时从 O(NM) 掉到 O(N log N)。

CNN 的卷积层、大核卷积,走的都是这个后门。有个叫 FNet 的架构干脆用 FFT 整个替换掉自注意力,用 O(N log N) 换下 O(N²)。注意一个细节:DFT 算的是循环卷积,信号首尾相接绕圈。要普通的线性卷积,先把两边补零到 N+M-1 再算。

一整帧 FFT 告诉你有哪些频率,不告诉你它们什么时候出现。一段「先 5 Hz 后 50 Hz」的扫频音和一段「两个一起响」的和弦,幅度谱可以长得差不多。要区分,就把信号切成小段,每段加窗做 FFT,排成一张时间乘频率的图——声谱图。语音模型吃的 mel 声谱图就是这个的变体。切窗意味着时间和频率不可兼得:窗长,频率分得清、时间分不清;窗短,时间清楚、频率糊成一团。这不是工程缺陷,是物理。

位置编码:这课离你最近的出口

Transformer 的位置编码是这套数学的直接应用。每个位置编成一串不同频率的 sin 和 cos,频率从「一步一转」到「一万步一匝」几何排开,每个位置在所有频段上的指纹独一无二。

练习 5 让你验证一个性质:两个位置编码的点积只取决于距离,不取决于绝对位置。我跑了:dot(PE(0), PE(10)) 和 dot(PE(100), PE(110)),两组都算出 42.8200228985,六位小数一个不差,差异在 10⁻¹⁵ 量级,浮点尾数的水平。距离拉开,点积从 62 一路缩到 19 左右——先快速衰减,最后停在最低几根慢频率托着的小平台上,并不归零。离得远的位置,指纹确实越来越不像。上一篇的 RoPE 旋转位置编码是同一件事的复数版本,两条路在「只认相对位置」这里会师。

从练习 3 开始

这一课的五个练习都值得跑,最小的是练习 3。x = [1, 2, 3, 4, 0, 0, 0, 0],h = [1, 1, 1, 0, 0, 0, 0, 0]。循环卷积手算前三项:第 0 项是 1×1 = 1,第 1 项是 1×2 + 1×1 = 3,第 2 项是 1×3 + 1×2 + 1×1 = 6。然后用 FFT 路线核:变换、相乘、逆变换,前三项 1、3、6,逐位对上。第一次亲眼看见「时域卷积等于频域乘法」,不在书页上,在自己的终端里。

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens