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 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 位元位元組,小端),或解包為 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 減去 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。
有損和無損轉換
如果轉換是可逆的,則轉換是無損的:從A
到B
再到C
轉換會導致A = C
。否則轉換是有損的。
無損轉換允許往返格式轉換。
從具有 25 個或更少有效位元的定點表示形式到浮點表示形式的轉換是無損的。從浮點到任何常見定點表示的轉換都是有損的。