采样率转换

本文介绍了 Android 中的采样率转换(也称为“重新采样”)。如需查看与采样转化率相关的术语,请参阅术语

采样率转换是将具有某一采样率的离散样本流更改为具有另一采样率的流的过程。采样率转换器(即重采样器)是执行采样率转换的模块。对于重采样器,原始流称为源信号,而重新采样的流称为设备信号。

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

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

  • 信号整体幅度的保存程度
  • 信号频率带宽的保存程度(受设备采样率的限制)
  • 通过重采样器的整体延迟时间
  • 有关频率的一致相位和群组延迟
  • 计算复杂度(以 CPU 周期或功耗表示)
  • 允许的源采样率和设备采样率的比率
  • 动态更改采样率比率的能力
  • 支持的数字音频采样格式

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

Android 包括各种音频重采样器,因此可以根据应用用例和负载进行适当折衷。重采样器实现部分介绍了可用的重采样器。

重采样器实现

可用的重新采样器实现会频繁变化,并且可由原始设备制造商 (OEM) 自定义。默认重新采样器包括(按照信号失真降序和计算复杂度升序的顺序):

  • 线性
  • 立方
  • 具有原始系数的 sinc
  • 具有修订系数的 sinc

一般来说,sinc 重采样器更适合用来播放品质较高的音乐,而其他重采样器也应保留下来,以便在质量要求不那么高的情况(例如“按键声”或类似情况)下使用。

所选择的特定重采样器实现取决于用例、负载以及系统属性 af.resampler.quality 的值。如需了解详情,请参阅 AudioFlinger 中的音频重采样器源代码。