Android 會使用多種音訊 資料格式 並在公用 API 中公開一部分的服務供應商 檔案格式 和 硬體抽象層 (HAL)。
屬性
音訊資料格式會依其屬性分類:
- 壓縮
- 未壓縮、 無損壓縮,或 經過壓縮。 PCM 是最常見的未壓縮音訊格式。FLAC 的壓縮檔是無損壓縮 格式,而 MP3 和 AAC 則是有損壓縮的格式。
- 位元深度
- 每個音訊樣本的有效位元數。
- 容器大小
- 用於儲存或傳輸樣本的位元數。市價 這與位元深度相同,但在某些情況下 系統會利用邊框間距位元來對齊。舉例來說 24 位元樣本可以包含在 32 位元的單字中。
- 對齊方式
- 如果容器大小完全等於位元深度, 這種表示法稱為「封裝」,否則代表 。樣本的重要部分通常 對齊方式最左側 (最明顯) 或最右側 (最不重要) 位元。這個做法較為傳統 只有在其位元為「已封裝」和「未封裝」時,才適用字詞 深度不是 兩個力量。
- 署名
- 樣本是否有符號或未簽署。
- 表示法
- 固定點或浮點;請參閱下文。
固定點表示法
定點 是未壓縮 PCM 音訊資料最常見的呈現方式 在硬體介面上更是如此
固定點數具有固定 (常數) 位數 根點前後。 所有的表示法 基數 2, 因此我們會使用 bit 取代 digit 和「二進位點」,或稱為「弧點」的「點」。 點左側的位元是整數部分 點右側的位元則是
我們說的是整數 PCM,因為固定點值 通常是以整數值儲存和操控。 固定點的解釋是隱含的。
我們使用兩套相輔相成 所有已簽署的定點表示法 因此以下規則中的所有值都是以 1 為單位的單位 LSB:
|largest negative value| = |largest positive value| + 1
Q 和 U 標記
有許多 註解 以整數表示的固定點表示法 我們使用 Q 標記法: Qm.n 是指「m」整數位元和「n」小數位元。 「Q」會計為一個位元,不過該值會以兩個的補數表示。 總位元數為 m + n + 1。
m.n 適用於無正負號的號碼: m 整數位元和 n 個小位元, 以及「U」會計為零位元。 總位元數為 m + n。
整數部分可能會用於最終結果或暫時使用。 在第二種情況中,系統會呼叫組成整數部分的位元 守衛位元允許中繼計算器溢位 ,只要最終值在範圍內或可以限制在範圍內即可。 請注意,固定點守衛位元位於左側,而浮點單元則位於 守衛數字 ,用來減少捨入錯誤,位於右側。
浮點表示法
浮點 可替代固定點,因為該點的位置可能會有所不同。 浮點的優點包括:
以往,浮點計算速度比整數或固定點慢 雖然浮點運算速度較快 提供的控制流程決策並非取決於運算的價值。
Android 音訊格式
各種主要的 Android 音訊格式如下表所示:
資源 | 問題 0.15 | 問題 7 1 | 問題 23 | 問題 0.31 | float | |
---|---|---|---|---|---|---|
容器 位元 |
16 | 8 | 24 或 32 2 | 32 | 32 | |
大量位元 包含符號 |
16 | 8 | 24 | 24 或 32 2 | 25 3 | |
分貝 空間 |
0 | 0 | 0 | 0 | 126 4 | |
動態範圍 (dB) |
90 | 42 | 138 | 138 至 186 | 900 5 |
以上所有固定點格式的顯著性範圍介於 -1.0 到 +1.0 減去一個 LSB。 正好比正值多一個 兩個搭配使用的表示法
註腳:
-
以上所有格式的明確已簽署範例值。
8 位元格式通常稱為「無正負號」,
實際上是有
0.10000000
偏誤的帶正負號值。 - Q0.23 可以封裝成 24 位元 (3 8 位元、小端序) 或未封裝 影片長度如果未封裝,重要片段會靠右對齊 將簽署副檔名為 MSB (Q8.23), 或靠左對齊 MSB (問題 0.31)。Q0.31 理論上允許高達 32 個重要位元 但接受 Q0.31 的硬體介面很少會使用所有位元。
- 單精度浮點具有 23 個明確位元加上一個隱藏位元與符號位元。 就會產生 25 位元的總位元數 異常數字 較不重要的位元
- 單精度浮點可以表示分數最高至 ±1.7e+38, 說明大型進步空間
- 顯示的是動態範圍,適用於自主式最大值的反常態 ±1.0。 請注意,部分架構專屬的浮點實作,例如 東北 不支援超自然現象
轉換次數
本節會討論 資料轉換 在不同形式的虛擬運算間取得平衡
浮點轉換
如要將值從 Qm.n 格式轉換為浮點值,請按照下列步驟操作:
- 將值轉換為浮點值,如同整數值 (忽略點)。
- 乘以 2 -n。
舉例來說,如要將 Q4.27 的內部值轉換成浮點值,請使用:
float = integer * (2 ^ -27)
從浮點數到固定點的轉換遵循以下規則:
- 單精度浮點的顯著範圍是 ±1.0、 但中繼值的完整範圍是 ±1.7e+38。 轉換浮點值與固定點之間的轉換 (用於外部表示法) (例如輸出至音訊裝置) 超過該範圍值的取值範圍限制。 尤其是,當 +1.0 轉換 ,則限制為 +1.0 減 1 LSB。
- 表示可以表示反常 (異常) 和 +/- 0.0, 但可能會在處理程序中自動轉換成 0.0。
- Infinity 則會通過運作,或無訊息受到無限制 到 +/- 1.0。後者通常用於轉換為固定點格式。
- NN 的行為未定義:NN 可能以相同的 NaN 的形式傳播,也可能 且可能在無訊息的情況下限制為 +/- 1.0,或 無聲轉換成 0.0 或導致錯誤
固定點轉換
不同 Qm. 格式的轉換請參考下列規則:
- 當 m 增加時,請擴充左側的整數部分。
- 在 m 減少時,限制整數部分。
- 增加 n 時,0 會擴充右側的分數部分。
- 當 n 減少時,可為負分、四捨五入,或將右側多餘位元截斷。
例如將 Q4.27 的值轉換為 Q0.15 (不含雙精度浮點數或 無條件進位),將 Q4.27 的值向右移動 12 位元,並限制任何結果 超出 16 位元帶正負號範圍這會對齊 Q 表示法。
如果想將 Q7.24 換算成問題 7.23,請將帶正負號除以 2 或等同為 Q7.24 整數數量加上正負號,接著簽署右移 1。 請注意,簡單的帶正負號偏移「不」等於帶正負號的除號 2。
無損和無損的轉換
如果轉換屬於無損的轉換
invertible:
從 A
到 B
的轉換到
C
搜尋結果為「A = C
」。
否則轉換就會流失。
無損轉換許可 來回格式轉換。
如果從固定點表示法中,有效位元到浮點數在 25 以下的轉換,就不會損失。 從浮點間到任何常見固定點表示法的轉換都會遺失。