将量应用于产生静电/噪音的PCM样品?

时间:2015-10-24 21:51:55

标签: java audio signal-processing pcm

我试图对某些PCM样本应用音量限制。

然而,无论何时我应用的音量都是1.0,但产生的静音/噪音很大(有趣的是只有声音持续时间的80%左右,其余部分似乎没有失真)并且音量不大甚至看起来都受到了影响。

就像我说的,如果soundVolume在下面的代码中是1.0,那么效果很好。如果它是0.1-0.9,它会产生可怕的噪音并且根本不起作用。我不知道为什么会这样做。

PCM样本以16位签名。

short s1 = (short)(((pcmBytes[i + 1] & 0xFF) << 8) | (pcmBytes[i] & 0xFF));

s1 = (short)(s1 * soundVolume);

pcmBytes[i + 1] = (byte)((s1 >> 8) & 0xFF);                                     
pcmBytes[i] = (byte)(s1 & 0xFF);

这段代码有问题吗?在通过算法时追踪s1似乎表明它被正确修改。我是否正确操作字节?

编辑:即使我修改的声音是纯静音,也会发生这种情况。如果soundVolume不是1.0,我会得到静态。

解决方案:新代码,当它们是little-endian时,我错误地将字节处理为big-endian。结合一些缺少掩码0xFF,这就是解决方案。

    /// <summary>
    /// throws <exception cref="MyException">MyException</exception>
    /// </summary>

1 个答案:

答案 0 :(得分:2)

仅从您对问题的描述中,我猜您正在处理小端数据,就好像它是大端数据一样。用[i + 1] s交换[i] s可以解决这个问题。请注意,如果您的数组与样本流不对齐,则会发生这种情况。

当你说:你的代码也有一个错误: | pcmBytes [I + 1] 这里的字节转换为int,如果它是“负”,那么它将用一串1来进行符号扩展,这些1将踩踏pcmBytes [i]的高位。

结果听起来很糟糕,即使你的音量是1.0。它听起来不太可怕的原因可能是因为你把字节顺序混淆了,所以你真的只是在低位而不是高位上踩踏。

因此,当您修复字节顺序时,请确保&amp;在将其插入样本字之前使用0xFF的字节。