首页 › programming › 正弦波重建一切:加法合成的编程冒险

正弦波重建一切:加法合成的编程冒险

导语:当程序员决定"手搓"一个声音

你有没有想过,小号之所以是小号、长笛之所以是长笛,差别到底藏在哪儿?如果你是个普通听众,你会说"音色不同"。但如果你是个程序员——尤其是像 Sebastian Lague 这种"非要从第一性原理重建世界"的程序员——你会本能地追问:这个"音色",能不能用代码精确地造出来?

这正是 Sebastian 在《Coding Adventure: Additive Synthesis》(加法合成)这期 35 分钟的视频里干的事。作为他音频三部曲(《Sound and the Fourier Transform》→《Analyzing Audio》→ 本期)的收官之作,这期视频没有教你用现成的合成器插件,而是从最朴素的"一个正弦波"开始,一路堆叠出能逼真还原真实乐器音色的完整声音引擎。

它的价值不止于"很酷"——它是一堂把抽象数学(傅里叶变换)变成可触摸的工程实践的公开课。对每一个想理解"信号处理到底在干什么"的开发者,这期视频值得反复看。下面我把它的核心拆给你看,并补上视频之外你需要知道的背景。

视频背景卡片

项目 内容
视频标题 Coding Adventure: Additive Synthesis
频道 Sebastian Lague("Exploring how to create stuff out of code")
频道订阅 144 万
时长 35 分 30 秒
播放量 34.3 万(截至 2026 年 6 月,发布约 2 个月)
核心主题 用加法合成(Additive Synthesis)从正弦波重建真实声音
技术栈 C# / Unity(Coding Adventure 系列一贯选择)
开源代码 github.com/SebLague
## 核心内容拆解

一、傅里叶的承诺:一切声音,本质上都是正弦波的叠加

视频的精神内核,是一个诞生于 200 多年前的数学定理——傅里叶定理(Fourier's Theorem):任何周期信号,无论多复杂,都可以被分解为一组正弦波(和余弦波)的和。

Sebastian 在前一期《Sound (and the Fourier Transform)》里已经铺垫了这件事:他用 FFT(快速傅里叶变换)把一段声音从"时间域"(振幅随时间变化的波形)翻译成"频率域"(哪些频率各占多少能量)。而本期他做的,是这件事的逆操作——已知频率域里有哪些分量,把它们重新加回去,把声音"合成"出来。

这就是"加法合成"名字的由来:你不是去"塑造"一个已有的声音,而是从一片寂静开始,一个正弦波一个正弦波地加上去,直到声音浮现。

我的延伸分析:很多人对傅里叶变换的恐惧,来自它被讲成了"公式"。但本质上它就是一个"翻译官"——把同一段信息用两种语言(时间 vs 频率)表达。Sebastian 的天才之处在于:他不让你背公式,而是让你看见。当你亲眼看到一段小号的波形被拆成一堆独立振荡的竖条,再亲眼看到这些竖条重新合回小号的声音——傅里叶就不再抽象了。这种"可视化证明"的认知效率,远超任何教科书。

二、加法 vs 减法:两条方向相反的造音之路

要理解加法合成为什么"硬核",得先看它的对手——减法合成(Subtractive Synthesis)。

减法合成是 Moog、Minimoog 那一代传奇合成器的思路:先产生一个本来就富含谐波的波形(锯齿波、方波),然后用滤波器(filter)把不需要的频率削掉,雕刻出想要的音色。这就像雕塑家从一块大理石上凿去多余的部分。

加法合成则完全相反:从最纯净的单一正弦波(只有基频、没有任何谐波,听起来像电话嘟嘟声)开始,手动添加每一个谐波分量。这就像雕塑家从零开始,一粒沙一粒沙地堆出雕像。

维度 减法合成 加法合成
起点 富含谐波的复杂波形 单一正弦波(纯音)
操作 滤波器"减去"频率 逐个"加上"谐波
直觉性 高(拧旋钮即可) 低(要精确控制几十上百个分量)
还原真实音色 较难(受限于初始波形) 极强(理论上可还原任意周期声音)
计算成本 低 高(每个采样点要叠加大量正弦波)

我的延伸分析:减法合成之所以统治了流行音乐 50 年,是因为它"好用"——一对振荡器加一个低通滤波器,立刻出声。但它的天花板也明显:你很难用它精确复刻一把小号的音色,因为小号的谐波结构是动态、非线性变化的,不是"一个滤波器"能表达的。加法合成恰恰在这个维度上有压倒性优势,这也是为什么 Sebastian 选择它来"还原真实乐器"——这是减法合成做不到的事。

三、谐波与泛音:音色的"DNA 序列"

视频里最让人醍醐灌顶的概念,是谐波(harmonics)与泛音(partials/overtones)。

当你拨动一根吉他弦,它发出的不是一个频率,而是一整族频率:最低的那个叫基频(fundamental frequency),决定了你听到的"音高";而在基频的整数倍(2 倍、3 倍、4 倍……)处,分布着一连串谐波,它们的强度配比,决定了"音色"。

同样是 440Hz 的 A 音,小提琴和小号听起来不同,不是因为基频不同(都是 440Hz),而是因为它们谐波"指纹"的能量分布完全不同。

Sebastian 在视频里把这些谐波画成了一排排随时间涨落的竖条——这就是频谱图(spectrogram)。你会看到小号的谐波在起音瞬间猛烈爆发、然后衰减;而长笛的谐波稀疏而稳定。音色,本质上是谐波振幅随时间变化的一张"动态地图"。

我的延伸分析:这个洞察的深远意义在于——它把"音色"这个模糊的感知概念,量化成了一个可测量、可复制的数据结构。这也是为什么加法合成能"逆向工程"真实声音:你只需要用 FFT 测出每个谐波的强度包络(envelope),然后用一组正弦波按这个包络去振荡,就能重建出高度逼真的音色。这是从"艺术"到"工程"的关键一跃。

四、从真实声音里"反向求出"正弦波族

这期视频最硬核的部分,是 Sebastian 演示了如何从一段录制的真实声音里,提取出它的谐波配方,再用加法合成把它重建出来。

流程大致是: 1. 录下一段真实乐器(如长笛)的声音; 2. 用 FFT 分析出它的频谱,定位基频和各次谐波; 3. 追踪每个谐波随时间的振幅包络(ADSR:Attack 起音、Decay 衰减、Sustain 保持、Release 释放); 4. 生成一组正弦波振荡器,分别按这些包络振动; 5. 把它们全部相加,输出重建后的声音。

你会听到重建版与原版惊人地相似——但也有微妙的差别。而正是这些差别,引出了真正的工程难点。

我的延伸分析:这个过程,本质上就是"有损压缩再解压"。FFT 是一把有粒度的尺子:你的频率分辨率(能区分多接近的两个频率)受限于分析窗口的长度——窗口越长,频率越准,但时间精度越差(因为这段时间里的变化被平均掉了)。这就是信号处理里著名的时频不确定性原理(Gabor limit):你无法同时在时间和频率上都无限精确。Sebastian 没有在视频里深挖这个理论,但你听到的"重建声音与原声的差异",很大一部分就来自这个根本性的权衡。理解它,你就理解了为什么所有音频分析都是妥协的艺术。

五、工程难点:相位、非谐波成分与计算成本

重建为什么"不完全像"?Sebastian 在视频里诚实地展示了三个敌人:

1. 相位(Phase)。 正弦波不光有频率和振幅,还有相位(起始角度)。人耳对相位相对不敏感,但相位错乱会让重建声音"发虚"或"咔哒"。Sebastian 需要决定:是忠实保留相位,还是只重建振幅谱(更省事、听感差异不大)。这是一个典型的"工程取舍"。

2. 非谐波成分(Inharmonics)与噪声。 真实声音里不只有整齐的整数倍谐波,还有摩擦噪声、气流噪声、击弦瞬态——这些不是周期性的,加法合成(本质只擅长周期信号)很难处理它们。一把小号的"吹气声"、一把吉他拨弦的"咔"声,恰恰是这些非谐波成分赋予了声音真实感。

3. 计算成本。 这是程序员最该关心的。要逼真还原一个声音,可能需要叠加几十甚至上百个正弦波。如果采样率是 44100Hz(CD 音质),意味着每秒要计算 44100 × 上百次 sin() 运算。sin() 是出了名的"贵"——它通常调用硬件指令或库函数,远比加减乘慢。Sebastian 必须优化,否则实时播放会卡死。

我的延伸分析:这个性能问题,正是真实世界合成器工程的缩影。专业加法合成器(如 Kawai K5、现代的 Synclavier、或软件合成器像 NI Razor)用了各种技巧:查表法(lookup table)预计算正弦值、递归振荡器用前一个采样推算下一个、甚至IFFT(逆快速傅里叶变换)一次性算出整批谐波。Sebastian 在视频里没有把所有优化都做满(那是另一个 35 分钟),但他把"为什么需要优化"讲透了——这是比任何优化手册都好的教学。

六、可视化即调试:Sebastian 的工程方法论

跳出具体技术,这期视频(乃至整个 Coding Adventure 系列)真正值得程序员学习的,是 Sebastian 的工程方法论:把每一个中间状态都画出来。

他不满足于"代码跑通了,能听到声"。他要看到:每个谐波的包络曲线、频谱随时间演化的热力图、重建波形与原波形的叠加对比、单个正弦波分量对总声的贡献。可视化不是装饰,是调试工具,是认知工具。

当某个谐波提取错了,他不是盯着日志猜,而是直接在图上看到那个突兀的尖峰;当重建声音有杂音,他能从波形对比里定位到哪个时间段出了问题。这种"所见即所调"的方式,让极其复杂的 DSP 工程变得可驾驭。

我的延伸分析:这套方法论在所有"黑盒难调试"的领域都通用——机器学习(看 loss 曲线、特征图、attention 热力图)、图形学(看 G-buffer、法线、深度)、网络(抓包可视化)、并发(trace timeline)。一个领域越难调试,可视化就越值钱。 很多团队项目延期、bug 难修,根因就是中间状态全是黑盒。Sebastian 用一期视频示范了:在你写第一行业务逻辑之前,先把"看见中间结果"的工具搭好,这是十倍工程师的隐性习惯。

七、"Coding Adventure"范式:从零造轮子的认知红利

最后,值得谈谈为什么这种"从零造一个加法合成器"的内容能在 YouTube 拿到几百万播放(他同系列的多期破百万)。

答案是:从零造轮子,是建立深层理解的唯一捷径。

你可以背下"傅里叶变换把时域变频域",但只有当你真的写代码,亲手把一堆正弦波加成一段音乐、再亲手用 FFT 把它拆回去,你才会真正理解它。Sebastian 的视频之所以迷人,不在于他用了什么高深框架——他用的就是 C# 和 Unity,人人都会——而在于他展示了一个完整的、从困惑到顿悟的认知过程。你跟着他一起卡壳、一起试错、一起在看到结果时发出"哦——"的惊叹。

我的延伸分析:这与教育心理学里的"建构主义(constructivism)"高度吻合——学习者通过主动建构,而非被动接收,才能形成牢固的知识。它也呼应了 Les Brown 的"2 Sigma"问题:一对一辅导的效果远超传统课堂。Sebastian 的视频,某种意义上是"理想导师"的规模化——他把高质量的一对一探索过程,录成了可无限复制的视频。对自学的程序员来说,这种"陪练式"内容的价值,远高于任何速成教程。

知识结构图

flowchart TD
    A[真实声音 录音] -->|FFT 分析| B[频率域: 频谱图]
    B --> C[定位基频 Fundamental]
    C --> D[提取各次谐波 Harmonics 的振幅包络]
    D --> E{是否含非谐波/噪声?}
    E -->|是| F[难点1: 相位 Phase]
    E -->|是| G[难点2: 噪声/瞬态 难以周期化]
    E -->|是| H[难点3: 计算成本 大量sin运算]
    F --> I[工程取舍: 保相位 or 仅振幅谱]
    G --> J[叠加噪声层/混合方法]
    H --> K[优化: 查表法 递归振荡器 IFFT]
    I --> L[加法合成器: N个正弦波振荡器]
    J --> L
    K --> L
    L -->|逐点求和 Σ sin| M[重建声音]
    M --> N[可视化对比: 原声 vs 重建]
    N -->|迭代调参| B
    style A fill:#e1f5ff
    style M fill:#e8f5e9
    style N fill:#fff4e1

这张图概括了整期视频的工程闭环:录制 → 分析 → 提取 → 解决三大难点 → 合成 → 对比可视化 → 迭代。注意那个从"对比"回到"分析"的反馈箭头——这正是可视化驱动开发的精髓。

实战启示:程序员能从中学到什么

1. 把傅里叶变换从"面试考点"变成"手上的工具"。 大多数程序员对 FFT 的认知停留在"算法题"层面。看完这期视频,你应该能动手:用 Python 的 numpy.fft 或 scipy.signal,录一段自己的声音,画出它的频谱图,再尝试用前 N 个谐波重建它。这个周末项目,胜过读十篇博客。

2. 学习"可视化优先"的工程习惯。 下次你写一个复杂模块(尤其涉及数据流、信号、概率的),先花 20% 的时间搭可视化——把中间结果画出来。你会发现 bug 减少、调试加速、对系统的理解成倍提升。这是 Sebastian 用整期视频示范的高杠杆习惯。

3. 用"从零造一遍"攻克难懂的概念。 不要满足于"会用 API"。加法合成器、一个 mini 编译器、一个 toy 数据库、一个简易 TCP 栈——选一个你一直似懂非懂的东西,从零造一遍。Sebastian 的整个频道就是这套方法论的活广告:他造过光线追踪器、软件光栅化器、流体模拟、神经网络……每一次都是"先造后懂"。

4. 理解"工程就是取舍"的真实样貌。 视频 里相位保不保、谐波取多少个、用不用 IFFT——每个决定都是性能 vs 质量、简单 vs 逼真的权衡。培养这种"在约束下做选择"的工程直觉,比记住任何具体 API 都重要。

5. 关注一个被低估的技能方向:DSP / 音频编程。 在 AI 绘图、AI 编程火热的当下,音频/信号处理是相对蓝海。游戏音频、空间音频(Apple Spatial Audio)、语音 AI、音乐科技(Spotify、BandLab)都需要懂 DSP 的工程师。Sebastian 的视频是最好的入门诱饵。

延伸学习路径

  1. Sebastian Lague《Coding Adventure: Sound (and the Fourier Transform)》 — 本期视频的前传,从零讲清 FFT 与频域可视化。频道同系列,强烈建议连看。(youtube.com/@SebastianLague)
  2. 《Coding Adventure: Analyzing Audio》 — 音频三部曲的第二部,分析音频信号的各种技术,是理解本期的桥梁。
  3. 3Blue1Brown《But what is the Fourier Transform? A visual introduction.》 — 数学可视化之神用动画讲透傅里叶变换的几何直觉,是配合本系列的最佳数学补充。
  4. 《The Scientist and Engineer's Guide to Digital Signal Processing》(Steven W. Smith,免费在线) — DSP 经典入门,从零讲起,工程导向,适合想深入谐波、滤波、FFT 实现的读者。(dspguide.com)
  5. Martin Vicanek 的加法合成教程系列 /"Additive Synthesis" 相关论文 — 进阶,讲真实加法合成器的优化技巧(递归振荡器、IFFT 合成),适合想把性能榨干的硬核玩家。

一句话总结

Sebastian Lague 用一堆正弦波证明了一件事:当你愿意从第一性原理亲手重建一个系统,傅里叶变换就不再是公式,音色就不再是玄学,而"工程师的直觉"会在每一次可视化的顿悟中悄然生长。

参考来源

  1. Coding Adventure: Additive Synthesis — Sebastian Lague — 本文分析的核心视频(35:30,34.3 万播放,144 万订阅频道)
  2. Sebastian Lague 频道主页 — Coding Adventure 系列全集(光线追踪、流体模拟、光栅化等)
  3. Coding Adventure: Sound (and the Fourier Transform) — 本期前传,FFT 与频域基础(69.4 万播放)
  4. Sebastian Lague GitHub — 系列项目开源代码,含音频合成相关实现
  5. The Scientist and Engineer's Guide to DSP — Steven W. Smith — 数字信号处理经典免费教材,谐波、FFT、合成原理的权威来源

    本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

完成摘要(What was done)

下一步计划

注意事项

[!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 等场景全覆盖。

51学通信知识星球海报-扫码加入