データ形式

Android は内部でさまざまなオーディオデータ形式を使用し、そのサブセットをパブリック API、ファイル形式、およびハードウェア抽象化レイヤー(HAL) で公開します。

プロパティ

オーディオ データ形式は、そのプロパティによって分類されます。

圧縮
非圧縮可逆圧縮、または非可逆圧縮。 PCM は最も一般的な非圧縮オーディオ形式です。 FLAC は可逆圧縮フォーマットですが、MP3 と AAC は非可逆圧縮フォーマットです。
ビット深度
オーディオ サンプルあたりの有効ビット数。
容器サイズ
サンプルの保存または送信に使用されるビット数。通常、これはビット深度と同じですが、場合によっては、位置合わせのために追加のパディング ビットが割り当てられることがあります。たとえば、24 ビットのサンプルを 32 ビットのワード内に含めることができます。
位置合わせ
コンテナーのサイズがビット深度と正確に等しい場合、その表現はパックと呼ばれます。それ以外の場合、表現はアンパックされます。サンプルの有効ビットは通常、コンテナの左端 (最上位) または右端 (最下位) ビットのいずれかに揃えられます。従来、パックおよびアンパックという用語は、ビット深度が2 の累乗ではない場合にのみ使用されます。
署名
サンプルが署名されているかどうか。
表現
固定小数点または浮動小数点のいずれか。以下を参照してください。

固定小数点表現

固定小数点は、特にハードウェア インターフェイスにおいて、非圧縮 PCM オーディオ データの最も一般的な表現です。

固定小数点数は、小数点の前後に固定 (定数) 桁数を持ちます。すべての表現では基数 2を使用するため、 digitを bitに、基数 point を 2小数点または単純なpointに置き換えます。ポイントの左側のビットは整数部分であり、ポイントの右側のビットは小数部分です。

固定小数点値は通常、整数値として格納および操作されるため、整数 PCMについて話します。固定小数点としての解釈は暗黙的です。

すべての符号付き固定小数点表現に2 の補数を使用するため、すべての値が 1 LSBの単位である場合、次のことが当てはまります。

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

QとUの記法

整数の固定小数点表現にはさまざまな表記法があります。 Q 表記法: Q mを使用します。 n はm個の整数ビットとn 個の小数ビットを意味します。 「Q」は 1 ビットとしてカウントされますが、値は 2 の補数で表現されます。ビットの総数は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
ヘッドルーム
dB単位で
0 0 0 0 126 4
ダイナミックレンジ
dB単位で
90 42 138 138~186 900 5

上記のすべての固定小数点形式の公称範囲は、-1.0 ~ +1.0 から 1 LSB を引いたものです。 2 の補数表現により、負の値は正の値より 1 つ多くなります。

脚注:

  1. 上記のすべての形式は、符号付きサンプル値を表します。 8 ビット形式は一般に「符号なし」と呼ばれますが、実際には0.10000000のバイアスを持つ符号付きの値です。
  2. Q0.23 は 24 ビット (3 つの 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 による除算。

非可逆変換と可逆変換

変換B可逆である場合、変換は可逆です。A からA 、そしてCへの変換はA = Cになります。そうしないと、変換に損失が生じます。

ロスレス変換では、ラウンドトリップ形式の変換が可能です。

有効ビット数が 25 以下の固定小数点表現から浮動小数点表現への変換はロスレスです。浮動小数点から一般的な固定小数点表現への変換には損失が伴います。