采样率转换

简介

有关采样率转换(也称为“重新采样”)的一般定义,请参阅维基百科文章重新采样(音频)。本文的其余部分将介绍 Android 中的重新采样。相关术语,请参阅采样率转换一节。

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

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

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

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

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

Android 包括各种音频重新采样器,因此可以根据应用使用情形和负载进行适当折衷。下面的重新采样器实现部分列出了可用的重新采样器,总结了它们的特性,并且确定了它们通常的使用情形。

重新采样器实现

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

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

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

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