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 m 。 n表示m個整數位和n個小數位。 “Q”計為一位,但該值以二進制補碼表示。總位數為m + n + 1。
嗯。 n代表無符號數: m個整數位和n個小數位,“U”計為零位。總位數為m + n 。
整數部分可以在最終結果中使用,也可以是臨時的。在後一種情況下,構成整數部分的位稱為保護位。保護位允許中間計算溢出,只要最終值在範圍內或可以被箝制在範圍內。請注意,定點保護位位於左側,而浮點單元保護位用於減少舍入誤差,位於右側。
浮點表示
浮點是定點的替代方案,其中點的位置可以變化。浮點的主要優點包括:
從歷史上看,浮點運算比整數或定點運算要慢,但現在浮點運算通常更快,前提是控制流決策不是基於計算值。
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。由於二進制補碼表示,負值比正值多一個。
腳註:
- 以上所有格式都表示有符號的樣本值。 8 位格式通常稱為“無符號”,但它實際上是一個有符號值,偏差為
0.10000000
。 - Q0.23 可以打包成 24 位(三個 8 位字節,little-endian),或解包成 32 位。如果未打包,則有效位要么右對齊到 LSB,符號擴展填充到 MSB (Q8.23),要么左對齊到 MSB,零填充到 LSB (Q0.31)。 Q0.31 理論上允許最多 32 個有效位,但接受 Q0.31 的硬件接口很少使用所有位。
- 單精度浮點有 23 個顯式位加上 1 個隱藏位和符號位,總共有 25 個有效位。非正規數的有效位較少。
- 單精度浮點可以表示高達±1.7e+38的值,這解釋了大的餘量。
- 顯示的動態範圍適用於高達標稱最大值 ±1.0 的非規範化。請注意,某些特定於體系結構的浮點實現(例如NEON )不支持非規範化。
轉換
本節討論各種表示之間的數據轉換。
浮點數轉換
從 Q m轉換一個值。 n格式轉浮點:
- 將值轉換為浮點數,就好像它是一個整數(通過忽略該點)。
- 乘以 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。
有損和無損轉換
如果轉換是可逆的,則轉換是無損的:從A
到B
到C
的轉換導致A = C
。否則轉換是有損的。
無損轉換允許往返格式轉換。
從具有 25 個或更少有效位的定點表示到浮點的轉換是無損的。從浮點到任何常見定點表示的轉換都是有損的。