數據格式

Android 在內部使用多種音頻數據格式,並在公共 API、文件格式硬件抽象層(HAL) 中公開其中的一部分。

特性

音頻數據格式按其屬性分類:

壓縮
未壓縮無損壓縮有損壓縮。 PCM 是最常見的未壓縮音頻格式。 FLAC 是無損壓縮格式,而 MP3 和 AAC 是有損壓縮格式。
位深
每個音頻樣本的有效位數。
容器尺寸
用於存儲或傳輸樣本的位數。通常這與位深度相同,但有時會分配額外的填充位用於對齊。例如,一個 24 位樣本可以包含在一個 32 位字中。
結盟
如果容器大小恰好等於位深度,則表示稱為packed 。否則,表示將被解包。樣本的有效位通常與容器的最左邊(最高有效)或最右邊(最低有效)位對齊。僅當位深度不是 2 的時才使用術語打包和解包
簽名
樣本是簽名還是未簽名。
表示
定點或浮點;見下文。

不動點表示

定點是未壓縮 PCM 音頻數據的最常見表示形式,尤其是在硬件接口處。

定點數在小數點之前和之後具有固定(恆定)位數。我們所有的表示都使用基數 2 ,所以我們用代替數字,用二進制點或簡單的代替小數點。點左邊的位是整數部分,點右邊的位是小數部分

我們說整數 PCM ,因為定點值通常作為整數值存儲和操作。作為定點的解釋是隱含的。

我們對所有帶符號的定點表示使用二進制補碼,因此以下公式適用於所有值以一個LSB為單位的情況:

|largest negative value| = |largest positive value| + 1

Q 和 U 符號

整數中的定點表示有多種表示法。我們使用Q 表示法:Q mn表示m個整數位和n個小數位。 “Q”計為一位,但該值以二進制補碼表示。總位數為m + n + 1。

n代表無符號數: m個整數位和n個小數位,“U”計為零位。總位數為m + n

整數部分可以在最終結果中使用,也可以是臨時的。在後一種情況下,構成整數部分的位稱為保護位。保護位允許中間計算溢出,只要最終值在範圍內或可以被箝制在範圍內。請注意,定點保護位位於左側,而浮點單元保護位用於減少舍入誤差,位於右側。

浮點表示

浮點是定點的替代方案,其中點的位置可以變化。浮點的主要優點包括:

  • 更大的動態餘量動態範圍;浮點運算允許在中間計算期間超出標稱範圍,並且僅在最後箝位值
  • 支持特殊值,例如無窮大和 NaN
  • 在許多情況下更易於使用

從歷史上看,浮點運算比整數或定點運算要慢,但現在浮點運算通常更快,前提是控制流決策不是基於計算值。

Android 音頻格式

下表列出了主要的 Android 音頻格式:

符號
財產Q0.15 Q0.7 1 Q0.23 Q0.31漂浮
容器
16 8 24 或 32 2 32 32
有效位
包括標誌
16 8 24 24 或 32 2 25 3
淨空
分貝
0 0 0 0 126 4
動態範圍
分貝
90 42 138 138 至 186 900 5

上述所有定點格式的標稱範圍為 -1.0 到 +1.0 減去 1 個 LSB。由於二進制補碼表示,負值比正值多一個。

腳註:

  1. 以上所有格式都表示有符號的樣本值。 8 位格式通常稱為“無符號”,但它實際上是一個有符號值,偏差為0.10000000
  2. Q0.23 可以打包成 24 位(三個 8 位字節,little-endian),或解包成 32 位。如果未打包,則有效位要么右對齊到 LSB,符號擴展填充到 MSB (Q8.23),要么左對齊到 MSB,零填充到 LSB (Q0.31)。 Q0.31 理論上允許最多 32 個有效位,但接受 Q0.31 的硬件接口很少使用所有位。
  3. 單精度浮點有 23 個顯式位加上 1 個隱藏位和符號位,總共有 25 個有效位。非正規數的有效位較少。
  4. 單精度浮點可以表示高達±1.7e+38的值,這解釋了大的餘量。
  5. 顯示的動態範圍適用於高達標稱最大值 ±1.0 的非規範化。請注意,某些特定於體系結構的浮點實現(例如NEON )不支持非規範化。

轉換

本節討論各種表示之間的數據轉換

浮點數轉換

從 Q m轉換一個值。 n格式轉浮點:

  1. 將值轉換為浮點數,就好像它是一個整數(通過忽略該點)。
  2. 乘以 2 - n

例如,要將 Q4.27 內部值轉換為浮點數,請使用:

float = integer * (2 ^ -27)

從浮點到定點的轉換遵循以下規則:

  • 單精度浮點的標稱範圍為 ±1.0,但中間值的完整範圍為 ±1.7e+38。用於外部表示(例如輸出到音頻設備)的浮點和定點之間的轉換將僅考慮標稱範圍,並對超出該範圍的值進行箝位。特別是,當 +1.0 轉換為定點格式時,它被限制為 +1.0 減去一個 LSB。
  • 表示允許非正規(次正規)和 +/- 0.0,但在處理過程中可能會默默地轉換為 0.0。
  • 無窮大要么通過操作,要么默默地硬限制在 +/- 1.0。通常後者用於轉換為定點格式。
  • NaN 行為未定義:NaN 可以作為相同的 NaN 傳播,或者可以轉換為默認 NaN,可以靜默硬限制為 +/- 1.0,或者靜默轉換為 0.0,或者導致錯誤。

定點轉換

不同 Q m之間的轉換。 n格式遵循以下規則:

  • m增加時,符號擴展左邊的整數部分。
  • m減小時,箝制整數部分。
  • n增加時,零擴展右側的小數部分。
  • n減小時,抖動、舍入或截斷右側多餘的小數位。

例如,要將 Q4.27 值轉換為 Q0.15(無抖動或舍入),請將 Q4.27 值右移 12 位,並箝制任何超出 16 位有符號範圍的結果。這對齊了 Q 表示的點。

要將 Q7.24 轉換為 Q7.23,請進行有符號除以 2,或等效地將符號位添加到 Q7.24 整數,然後有符號右移 1。請注意,簡單的有符號右移等於有符號除以 2。

有損和無損轉換

如果轉換是可逆的,則轉換是無損的:從ABC的轉換導致A = C 。否則轉換是有損的。

無損轉換允許往返格式轉換

從具有 25 個或更少有效位的定點表示到浮點的轉換是無損的。從浮點到任何常見定點表示的轉換都是有損的。