【问题标题】:Downsample 16-bit pcm audio to 8-bit in android在 android 中将 16 位 pcm 音频下采样到 8 位
【发布时间】:2010-03-01 18:29:01
【问题描述】:

我想将 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]+"*-----------");
} 

其中 tempbuffer 是一个短 [] 而 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]+"*-----------");
}

我不确定它是否有效。

【问题讨论】:

    标签: android audio pcm


    【解决方案1】:

    假设 8 位和 16 位音频都经过 PCM 签名:

    16 位到 8 位:

    sample_8 = sample_16 >> 8;
    

    8 位到 16 位:

    sample_16 = sample_8 << 8;
    

    但是,如果 8 位 PCM 是“偏移二进制”(带有隐式偏差的无符号格式),那么转换将是:

    16 位到 8 位:

    sample_8 = (sample_16 >> 8) + 128;
    

    8 位到 16 位:

    sample_16 = (sample_8 - 128) << 8;
    

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

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

    【讨论】:

    • 但我认为通常 8 位 PCM 是无符号的,而 16 位 PCM 是有符号的,不是吗?
    • 8 位 PCM 通常是“偏移二进制”(在某种意义上可以被认为是无符号的)但它也可以被签名 - 不幸的是,OP 没有指定哪个,但我当你提出这个问题时,我会在我的回答中添加一个注释。
    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多