.WAV オーディオ データ サンプルを double 型に変換するにはどうすればよいですか?
-
12-09-2019 - |
質問
私は音声データを処理するアプリケーションに取り組んでいます。私は Java を使用しています (MP3SPI、Jlayer、および Tritonus を追加しました)。.wav ファイルからオーディオ データをバイト配列に抽出しています。私が扱っているオーディオ データ サンプルは 16 ビット ステレオです。
私が読んだところによると、あるサンプルの形式は次のとおりです。
AABBCCDD
ここで、AABB は左チャネルと CCDD 右チャネルを表します (各チャネルにつき 2 バイト)。このサンプルを double 値型に変換する必要があります。データ形式について読みました。Java はビッグ エンディアンを使用し、.wav ファイルはリトル エンディアンを使用します。少し混乱しています。変換プロセスを手伝ってもらえますか?皆さんありがとう
解決
警告:整数とバイトが署名されています。たぶん、あなたはそれらを一緒に梱包する際の低バイトをマスクする必要があります:
for (int i =0; i < length; i += 4) {
double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));
... your code here ...
}
他のヒント
あなたがたByteBufferを使用する場合( java.nio.ByteBufferのの)あなたがメソッドの順序を使用することができます。
[順序
公共最終ByteBufferの順序(BYTEORDERのBO)
Modifies this buffer's byte order.
Parameters:
bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
This buffer
; この後はあなたが上記の値を取得することができます
GETCHAR() getShort() getInt() getFloat() GetDoubleを()
偉大何言語がJavaの;-)です。
リトルエンディアンは、データがフォームBBAAとDDCCにあることを意味します。あなたはそれを周りに入れ替えます。
フレームの先頭から:
int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];
私はあなたのサンプルのあなたのインデックスであります。
私は個人的にエンディアンスワップを行うライブラリを探します。各オーディオ ファイル形式にはエンディアンに関する前提条件があり、これを正しく理解することは、wave ファイルがサポートするすべてのビット深度/データ型にとって困難です。
- 8ビット - uint8
- 16ビット - int16
- 24ビット - int32
- 32 ビット - float としての int32
- 32ビット - 浮動小数点数
- 64ビット - ダブル
最も一般的なタイプの wave ファイルをサポートしたい場合は、これらすべてのデータタイプのエンディアン変換が必要になります。
私は見ます バイトスワッパー, これにより、上記のほとんどのタイプでバイトスワップが可能になります。
残念なことに、Java には File IO クラスにエンディアンフィールドがありません。エディアンネスが大きいか小さいファイルを単純に開くことができれば、この問題に対するはるかに簡単な解決策になります。