資料格式

Android 在內部使用多種音訊資料格式,並在公共 API、檔案格式硬體抽象層(HAL) 中公開這些格式的子集。

特性

音訊資料格式依其屬性分類:

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

定點表示

定點是未壓縮 PCM 音訊資料最常見的表示形式,尤其是在硬體介面上。

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

我們談論整數 PCM ,因為定點值通常作為整數值進行儲存和操作。作為定點的解釋是隱式的。

我們對所有有符號定點表示形式使用二進制補碼,因此以下情況適用於所有值均以 1 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 位元位元組,小端),或解包為 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 減去 1 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。

有損和無損轉換

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

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

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