2013-04-18 69 views
2

我在這裏找到了stackoverflow.com a great example,實際上可以播放聲音。 一切正常,但我想知道在PCM一代會發生什麼。 下面是代碼:生成聲音 - PCM(Android - Java)

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); 
} 

其中樣品是保持與在此情況下,所有需要的參數計算出的正弦(頻率,赫茲,等等等等)雙陣列,並且generatedSnd是一個字節數組。 我所知道的一切都是val & 0xff將int轉換爲一個字節,但是這裏究竟做了什麼?爲什麼有這種轉變>>> 8?

+0

只是猜測...它在第一個字節保存最低的8位,然後在第二個字節保存高8位(從9到16)?這是對的嗎?那麼dVal * 32676是什麼意思? –

回答

4

你沒有在你的問題中提到這個函數的輸入是什麼,但是我猜測sample中的元素的範圍是-1.0到+1.0。

16位帶符號的PCM數據的範圍是-32768到+32767。所以在這種方法中發生的事情是,每個浮點採樣都被32767縮放得到一個值在-32767到+32767之間的值,然後截斷到short

short然後存儲在generatedSnd(我假定是一個byte[])由第一寫入short(最低顯著8位),然後是高字節的低byte(移位短8位來右邊是原來是高位字節的位置,並將它放在低位字節中)。

+0

你的猜測是正確的,樣本的元素有你提到的範圍。非常感謝你的好解釋!編輯:generateSnd是字節[numSamples * 2],如你所說 –