採樣率轉換

本文介紹了 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中的音頻重採樣器源代碼。