2

ここstackoverflow.comで、実際にサウンドを再生するのに役立つ素晴らしい例を見つけました。すべて順調に進んでいますが、PCM 生成で何が起こるか知りたいです。コードは次のとおりです。

int idx = 0;
for (final double dVal : sample) {
    final short val = (short) ((dVal * 32767));

    generatedSnd[idx++] = (byte) (val & 0x00ff);
    generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}

ここで、sample は、この場合に必要なすべてのパラメーター (周波数、ヘルツなど) を使用して計算されたサインを保持する double 配列であり、generatedSnd はバイト配列です。私が知っていることはすべて、 val & 0xff が int をバイトに変換するということですが、ここで正確に何が行われるのでしょうか? なぜシフト>>> 8があるのですか?

4

1 に答える 1

4

あなたの質問では、この関数への入力が何であるかについて言及していませんが、要素sampleの範囲は -1.0 から +1.0 であると推測します。

16 ビット符号付き PCM データの範囲は -32768 ~ +32767 です。したがって、このメソッドで何が起こっているかというと、各浮動小数点サンプルが 32767 でスケーリングされて、-32767 から +32767 の範囲の値が取得され、short.

これshortは、最初に(最下位 8 ビット) の下位を書き込み、次に上位バイト (短い 8 ビットを右にシフトすると、元々上位バイトだったものを取得generatedSndbyte[]、下位バイトに配置します)。byteshort

于 2013-04-19T12:42:32.120 に答える