我们大都听过"傅里叶变换"四个字,知道它能"把信号拆成频率"。但绝大多数教程停在拆这一步,像把一块表砸碎给你看零件,却不告诉你怎么把零件装回去。Sebastian Lague 这期《Coding Adventure: Additive Synthesis》做的,正是把傅里叶反过来用——他不是分析声音,而是用最无聊的波形(纯正弦波),一个一个相加,把一段真实录下来的钢琴、人声、甚至鸟鸣,从零重建出来。当那个被"拼"出来的声音和原音几乎无法分辨的那一刻,你会突然理解一个深刻的反直觉事实:世界上所有的音色,都不是某种"本质",而是无数个无聊正弦波相加之后涌现出来的幻觉。这不只是一节音频编程课,更是一堂关于"什么是理解"的认识论课——能重建,才算真懂。
| 项目 | 内容 |
|---|---|
| 视频标题 | Coding Adventure: Additive Synthesis |
| 频道 | Sebastian Lague |
| 发布日期 | 2026-03-20 |
| 时长 | 约 24 分钟 |
| 播放量 | 34.5 万+(截至 2026-06) |
| 频道订阅 | 300 万+ |
| 核心主题 | 用傅里叶分析结果做加法合成,从正弦波重建任意声音 |
| 系列定位 | 音频三部曲之一(Sound & Fourier → Analyzing Audio → Additive Synthesis) |
打开任何一本信号与系统的教材,傅里叶变换都是分析工具:给你一段波形 x(t),吐出一堆频率分量。这是一种"拆解"的姿态——像把光通过棱镜分成彩虹。可问题是,拆得开 ≠ 装得回去。Sebastian 在视频里把方向掉了个头:既然一段声音能被拆成若干正弦波,那我反过来,手动把正弦波加回去,能不能把原声音"种"出来?
这就是加法合成(additive synthesis)的定义:y(t) = Σ Aₙ·sin(2π·fₙ·t + φₙ)。视频最漂亮的论证不在于这个公式本身,而在于它隐含的认识论——真正理解一个系统的标志,是你能用最基本的部件把它重建出来。这是物理学家费曼那句名言的工程版本:"What I cannot create, I do not understand."(我不能创造的,我就没有真正理解。)Sebastian 在视频里反复用"能不能让它重新发声"作为检验标准,这种"重建式理解"恰恰是程序员最容易共鸣的思维——你读懂一个开源项目最快的方式,从来不是逐行看,而是自己照着造一遍。
视频原话内核:分析告诉你"里面有什么",合成逼你证明"你知道怎么把它造出来"。我补充的判断:这两者之间隔着一整座工程的矿山,而绝大多数人卡在第一座山上就下山了。
一切的基础,是一个纯得不能再纯的正弦波:
$$y(t) = A \cdot \sin(2\pi f t + \varphi)$$
一个频率 f、一个振幅 A、一个相位 φ,仅此而已。它听起来是什么样?就像医院里测听力的那个"嘀——",平、薄、没有任何个性。纯正弦波没有"音色",它只有"音高"和"响度"。
这一点反直觉得令人不安。我们直觉上以为"钢琴声""小提琴声"是某种藏在波形里的"本质味道"。但真相是:音色不在任何单个波形里,它是无数个正弦波叠加之后才"长"出来的整体性质。单看一个正弦波,你永远看不出它将来能变成贝多芬。这就像单看一个氢原子,你猜不到它能组成你的大脑。Sebastian 在视频里反复演示这个"无聊原子"——单独听它,是嘟嘟的电子音;但只要开始相加,奇妙的事情就发生了。
如果声音只是正弦波相加,那为什么 440Hz 的钢琴和 440Hz 的小提琴听起来完全不同?答案藏在谐波(harmonics)里。
一段近似周期性的声音,可以分解成一个基频 f₀ 加上它的整数倍:f₀, 2f₀, 3f₀, 4f₀…。这串频率叫谐波序列。基频决定了你听到的"音高"(440Hz 就是标准 A 音),而各次谐波的相对强度,决定了音色。
1/n 衰减——这是合成器里最"亮"的波形。所以音色,本质上是一张"谐波幅度指纹"。Sebastian 在视频里把一段真实声音的谐波列出来给你看——你亲眼看到一个抽象的"小提琴味"被还原成了一串冷冰冰的数字。这个瞬间,是整期视频最值钱的一帧:它把"音色"这个模糊的、主观的感受,钉死成了一组可以测量、可以重建、可以篡改的频率柱状图。从此"音色"对你不再是玄学。
这才是视频的核心工程闭环,可以画成一条流水线:
fₙ、振幅 Aₙ、相位 φₙ。这些峰就是"分音(partial)"。Σ Aₙ·sin(2π·fₙ·t + φₙ) 实时相加,重新合成出波形。这六步,是傅里叶定理的构造性证明。教科书告诉你"周期信号等于正弦波之和",Sebastian 让你亲耳听到这个"等于"。当那个被一千个正弦波拼出来的钢琴音从音箱里流出时,你获得的不是一条公式,而是一次认知冲击——抽象定理第一次变成可触摸的实体。
延伸判断:这正是数字音频一切魔法的源头。MP3 之所以能压缩 10 倍,靠的就是第 3、4 步——它把声音变到频域,然后丢掉人耳听不见的频率,再合成。Auto-Tune(修音)能改变音高而不改音色,靠的也是操控这些分音的频率。Sebastian 走通了这条链路,等于把现代音频算法的底层逻辑给你摸了一遍。
把理论搬进代码,立刻撞上工程现实。FFT 有一个隐含前提:它假设输入信号是周期性的、且无限延伸。但你要分析的钢琴音只有零点几秒,硬塞给 FFT,结果就会失真——这就是频谱泄漏(spectral leakage):一个本该是单根尖锐谱线的频率,会被"抹"成一坨宽宽的鼓包。
解决办法是加窗(windowing):在 FFT 之前,给信号乘一个两端渐弱到 0 的窗函数(最常用的是 Hann 窗、Hamming 窗),让信号"软着陆",减少突变带来的泄漏。但这又引出一个根本性的分辨率权衡(resolution trade-off):
这几乎是测不准原理在信号处理里的翻版:你不可能同时精确知道"某一瞬间有哪些频率"。Sebastian 在视频里调窗长度的对比演示,把这条抽象权衡变成了可视的画面。把每一帧的 FFT 谱按时间摞起来画成热力图,就得到了频谱图(spectrogram)——横轴时间、纵轴频率、颜色深浅代表能量。这是语音识别、Shazam 听歌识曲、地震分析共用的同一种武器。
视频里最让我意外的一个细节,关于相位(phase)。合成时,每个分音都有一个相位 φₙ。直觉告诉我们相位很重要——毕竟它改变了波形。Sebastian 做了一个实验:保留所有频率和振幅,却把相位全部打乱随机化。结果呢?声音听起来几乎一样,照样认得出是钢琴、是人声。
这是一个深刻的悖论:人耳对相位极不敏感,但对振幅谱极其敏感。频域上几乎没变的信号,时域波形却可能面目全非。这解释了为什么 MP3 敢于大量丢弃相位信息——反正你听不出来。但注意,这是有边界的:对于打击乐、爆破音这类瞬态(transient)声音,相位关系变得关键,打乱相位会出现明显的"咔哒"声和浑浊。所以"相位不重要"是一句有条件的真话,而不是定律。我特别欣赏视频没有把这一点绝对化——好的科普是给出结论的同时标注它的适用边界,而不是制造新的神话。
最后一个、也是程序员最该关心的问题:加法合成太贵了。朴素实现下,N 个分音、M 个采样点,复杂度是 O(N·M)。假设你要合成 1000 个分音、44100 个采样/秒、一段 10 秒的音频,那就是 4.4 亿次乘加运算——逐个正弦波硬加,CPU 会原地哭出来。
解法分两条路:
sin() 调用换成一次数组取值。早期硬件合成器(包括传奇的 Hammond 风琴,用旋转的金属齿轮物理实现"正弦相加")都是这个思路。O(N·M)),不如直接在频域里"画"出整张谱,再做一次逆变换(O(M·log M)),一口气合成一帧。这是真正的对称之美——同一个 FFT 算法,既能拆,也能装。这条捷径,是把加法合成从"实验室玩具"变成"实时音乐工具"的关键。Sebastian 在视频末尾从这里展开出各种创造性的副作用:因为你能逐个操控分音,于是可以做物理上不可能的事——不改变时长地升降调(pitch-shift)、不改变音高地拉伸时间(time-stretch)、把声音"冻结"在某个频谱瞬间(spectral freeze)、甚至用一段声音的振幅包络去"印"在另一段声音的频谱上(cross-synthesis)。分析—合成这个闭环,本身就是一台创造机器。
flowchart TD
A["真实声音<br/>录音 x(t), 44100Hz"] --> B["分帧 + 加窗<br/>Hann 窗, 2048点/帧"]
B --> C{"分析方向<br/>FFT 频谱"}
C -->|频率分辨率| D["峰值检测<br/>分音 partial: fₙ, Aₙ, φₙ"]
D --> E["谐波指纹<br/>f0, 2f0, 3f0... → 音色"]
D --> F["相位信息 φₙ<br/>耳朵不敏感, 瞬态敏感"]
E --> G{"合成方向"}
F --> G
G -->|朴素| H["Σ Aₙsin 相加<br/>O(N·M) 太慢"]
G -->|捷径| I["逆 FFT 合成<br/>O(M·log M) 快"]
H --> J["重建声音 y(t)"]
I --> J
J --> K["创造性副作用"]
K --> K1["变调/时间拉伸"]
K --> K2["频谱冻结/交叉合成"]
E -.->|解释| L["MP3 / JPEG 频域压缩<br/>Auto-Tune 修音"]
style C fill:#fff3cd
style G fill:#d1ecf1
style I fill:#d4edda
对程序员和音频开发者:这期视频给出了一个完整、可复现的工程闭环,你完全可以照着写出来。技术栈上,Python 用 numpy.fft / librosa 做分析、scipy.signal 加窗,几十行就能复现频谱图;想要实时合成,C++ 生态里有 JUCE 框架和成熟的 smbPtPr 风格的相位声码器(phase vocoder)。更重要的是,"分析—合成"是一个万能范式:图像领域的 JPEG(DCT 变换后丢高频再合成)、通信领域的 OFDM(用 IFFT 把数据"合成"成正交子载波)、甚至大模型里的自编码器,本质上都是同一种思维——先压缩到一个低维/频域表示,再从表示重建。吃透这一集,你就拿到了通往半个工程学的钥匙。
对所有读者:这期视频真正的礼物,是一种认识论的升级。Sebastian 反复用"能不能重建出来"作为检验理解的标尺,这其实是主动回忆(active recall)和费曼学习法在工程里的化身——你以为你懂了某个系统,但只有当你能用最基本的零件把它从零搭起来时,你才算真懂。下次当你读一份文档、看一段代码、学一个概念时,不妨问自己:我能用最简单的原语把它重建出来吗? 如果不能,你对它的"理解"就还停留在"听过名词"的层面。这,远比记住傅里叶公式本身重要。
当你能用一千个最无聊的正弦波,把一段钢琴声从零拼出来时,你才第一次真正"听懂"了什么是声音——傅里叶不是拆解工具,而是把理解变成创造的总开关。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
