基础振荡器的快速合成:整数运算在受限硬件上的极致优化
来源:artemis.sh — 2026-07-23
📋 概述
作者在 GBA(Game Boy Advance)和 RP2040 等超级受限的嵌入式平台上开发合成器的经验总结。全篇使用纯 32 位整数运算——GBA 的 ARM7TDMI 没有 FPU,整数运算更快且利用 wrapping 溢出自然地实现相位循环。文章逐一展示了从锯齿波到方波、三角波、脉冲波和抛物线近似正弦波的高速实现代码,所有波形都从一个基础相位累加器衍生。特别值得注意的是32 位相位的选择:它在可听范围内提供完美音高精度(低音部分也无需特殊处理),而 16 位相位在低频时会出现音高不准的问题。作者坦承这些波形都会产生混叠伪影(aliasing),但强调这是「追求极致速度」的取舍——对于真的需要无混叠音色的情况,建议使用正弦波之间的相位调制,承诺另写一篇。
🔑 核心要点
- 所有运算使用 纯 32 位整数,无浮点。32 位是 GBA 原生寄存器大小,也是音高精度的最佳平衡点——足够低音完美,超过 32 位收益递减。
- 核心公式:step = (频率 × 2³²) ÷ 采样率,每个采样周期将 step 累加到 phase,phase 的自然 wrapping 溢出即完成循环。
- 所有波形从锯齿波作为基元衍生:phase 本身即是 ramp-up 锯齿波输出;通过比较、反向和算术变换可生成方波、三角波和脉冲波。
- 抛物线近似正弦波使用二次函数近似而非查表法,在 GBA 级硬件上用极低成本获得可用的正弦波形。
- 明确接受混叠:作者声明这些快速实现必然产生混叠伪影,PolyBLEP 等反混叠技术会增加开销——对于极致受限环境,混叠是可接受的代价。
- 替代方案预告:正弦波相位调制可以在低预算下获得干净音色(虽不如这些波形便宜),作者承诺后续文章介绍。
💡 金句
This is for super constrained environments, where you have to accept the aliasing is there and move on. ——这是为超级受限的环境准备的,你必须接受混叠的存在,然后继续前进。
👍 0👎 0
← 返回 Lobsters 首页