Nintendo 64 在音频方面面临重大的技术障碍:卡带空间极其有限,且 93 MHz 的 CPU 处理周期受到严格限制。与能够从 CD 中流式传输未压缩 Redbook 音频的 PlayStation 不同,N64 需要压缩格式才能将音乐放入卡带中。虽然该主机的 RSP(Reality Signal Processor)协处理器可以处理某些解压任务,但标准的解决方案往往力不从心。ADPCM(自适应差分脉冲编码调制)虽然节省空间,但效率低下,往往需要过多的存储空间才能实现高质量音轨。相反,像 MP3 或 Opus 这样的现代格式虽然提供了出色的压缩率,但其计算成本太高,在活跃的游戏过程中运行会严重影响帧率。
超低复杂度编解码器 (ULC) 通过作为 MP3 格式的“简化版”来解决这些问题。与 MP3 类似,ULC 是一种变换编解码器,它使用改进离散余弦变换 (MDCT) 将 PCM 数据转换为频域。然而,它去除了 MP3 中使用的复杂熵编码(如 Huffman 编码)。相反,ULC 使用基于 nibble 的语法,其中每个系数仅占用 4 位。这种设计允许解码器在无需任意位读取的情况下运行,使其具有极高的效率。ULC 还包含“噪声填充”功能,这对于编码镲片和军鼓等打击乐声音特别有效——这些是 MP3 难以准确表现的元素。
在 N64 上实现 ULC 需要应对 RSP 严苛的内存限制,特别是其 4096 字节的数据内存 (DMEM) 和指令内存 (IMEM)。为了将解码器放入这个空间,该实现采用了 16 位定点数数学 (Q1.14) 而非 32 位浮点数。这一选择减少了 DMA 流量并加快了计算速度,尽管从技术上讲它引入了更高的噪声底噪。在实践中,作者发现这种噪声是可以忽略不计的。最终的解码器仅消耗 N64 CPU 时间的约 4% 和 RSP 时间的 5%,能够在接近 Opus 比特率的情况下实现 44100 Hz 立体声音频。这种效率在《Half-Life》的 N64 移植版中得到了证明,ULC 使其能够在 64 MB 的卡带镜像中包含 2,500 个声音和 27 首音乐。
虽然 ULC 是 N64 硬件上的突破,但需要注意的是,其效率源于简化的语法而非更先进的算法。通过避免标准变换编解码器的“冗余”,它实现了 ADPCM 或 Opus 在此特定硬件上都无法提供的质量与性能的平衡。然而,由于它依赖 16 位定点数数学来满足 RSP 的内存限制,它可能无法达到基于浮点数的解码器的绝对峰值保真度,即使这种差异对听众来说几乎无法察觉。
