在Android中将16位pcm音频下采样到8位

max*_*sap 3 audio android pcm

我想将16位pcm音频下采样到8位,然后在android中将8位上采样到16位.我正在使用这似乎工作:

int tempint;
for (int i=1, j=0; i<tempBuffer.length; i+=2, j++)
{
    tempint = ((int) tempBuffer[i]) ^ 0x00000080;
    tempBuffer[j] = (byte) tempint; 
    Log.e("test","------------* COUNTER -> "+j+" BUFFER VALUE -> "+tempBuffer[j]+"*-----------");
} 
Run Code Online (Sandbox Code Playgroud)

其中tempbuffer是short [],tempint是int.任何人都可以告诉我,如果这是正常的,因为我是一个启动器,我也使用它将字节[]转换回短[]

for (int x=1, j=0; x<music.length; x+=2, j++)
{
    tempint = ((int) music[x])& 0xFF;
    music[j] = tempint.shortValue();
    Log.e("maxsap","------------*"+ music[j]+"*-----------");
}
Run Code Online (Sandbox Code Playgroud)

我不确定它是否有效.

Pau*_*l R 5

假设8位和16位音频都是带符号的PCM:

16位到8位:

sample_8 = sample_16 >> 8;
Run Code Online (Sandbox Code Playgroud)

8位到16位:

sample_16 = sample_8 << 8;
Run Code Online (Sandbox Code Playgroud)

如果8位PCM是"偏移二进制"但是(带有隐式偏置的无符号格式)则转换为:

16位到8位:

sample_8 = (sample_16 >> 8) + 128;
Run Code Online (Sandbox Code Playgroud)

8位到16位:

sample_16 = (sample_8 - 128) << 8;
Run Code Online (Sandbox Code Playgroud)

理想情况下,当从8位转换为16位时,您会添加抖动,但您可能无法承担这样做的计算成本.

另请注意,术语"上采样"和"下采样"通常指的是更改采样率.你在这里做的不是重新采样,而是改变位深度或重新量化数据.