采样率转换

本文介绍了 Android 中的采样率转换(也称为重采样)。有关采样率转换相关的术语,请参阅术语

采样率转换是指将离散样本流从一个采样率更改为另一个不同采样率的流的过程。采样率转换器或重采样器是实现采样率转换的模块。对于重采样器,原始流称为源信号,重采样后的流称为目标信号。

重采样器在 Android 中的多个位置使用。例如,MP3 文件可能以 44.1 kHz 采样率编码,但需要在内部支持 48 kHz 音频的 Android 设备上播放。在这种情况下,将使用重采样器将 MP3 输出音频从 44.1 kHz 源采样率上采样到 Android 设备内部使用的 48 kHz 目标采样率。

重采样器的特性可以使用指标来表示,包括

  • 信号整体幅度保留程度
  • 信号频率带宽保留程度,受目标采样率限制
  • 通过重采样器的整体延迟
  • 相对于频率的一致相位和群延迟
  • 计算复杂度,以 CPU 周期或功耗表示
  • 允许的源采样率和目标采样率比率
  • 动态更改采样率比率的能力
  • 支持的数字音频采样格式

理想的重采样器应精确保留源信号的幅度和频率带宽(受目标采样率的限制),具有最小且一致的延迟,具有最小的计算复杂度,允许任意和动态的转换比率,并支持所有常见的数字音频采样格式。实际上,理想的重采样器不存在,因为实际的重采样器是对这些特性的一种折衷。例如,理想质量的目标与短延迟和低复杂度相冲突。

Android 包含各种音频重采样器,以便可以根据应用用例和负载做出适当的折衷。可用重采样器在重采样器实现中进行了解释。

重采样器实现

可用的重采样器实现经常更改,并且可能由 OEM 定制。默认的重采样器(按信号失真降序和计算复杂度升序排列)包括

  • 线性
  • 三次
  • 使用原始系数的 sinc
  • 使用修订系数的 sinc

一般来说,sinc 重采样器更适合高质量音乐播放,而其他重采样器应保留用于质量不太重要的场合(例如“按键音”或类似声音)。

选择的特定重采样器实现取决于用例、负载和系统属性 af.resampler.quality 的值。有关详细信息,请查阅 AudioFlinger 中的音频重采样器源代码。