2013-04-18 54 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],如你所说 –