将体积应用到产生 static/noise 的 PCM 样本?
Apply volume to PCM samples producing static/noise?
我正在尝试对某些 PCM 样本应用音量限制。
但是,每当我应用的音量不是 1.0 重 static/noise 时(有趣的是,只有大约 80% 的声音持续时间,其余部分似乎没有失真)并且音量没有甚至似乎受到影响。
就像我说的,如果下面代码中的 soundVolume 是 1.0,效果很好。如果它是 0.1-0.9,它会产生可怕的噪音并且根本不起作用。我不知道为什么。
PCM 样本采用 16 位签名。
// Get samples, apply volume, clamp, write back.
short s1 = (short)((pcmBytes[i] << 8) | (pcmBytes[i + 1]));
s1 = (short)(s1 * soundVolume);
pcmBytes[i] = (byte)((s1 >> 8) & 0xFF);
pcmBytes[i + 1] = (byte)(s1 & 0xFF);
这段代码有问题吗?在通过算法时追踪 s1 似乎表明它已被正确修改。我是否正确处理了字节?
编辑: 即使我正在修改的声音是纯粹的静音,也会出现这种情况。如果 soundVolume 不是 1.0,我会得到静态值。
解决方案: 新代码,当字节是小端时,我错误地将字节处理为大端。将其与一些缺失的掩码 0xFF 结合起来,这就是解决方案。
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);
仅根据您对问题的描述,我猜您正在处理小端数据,就好像它是大端数据一样。用 [i+1] 交换 [i] 可以解决这个问题。请注意,如果您的数组与示例流有一个字节不对齐,也会发生这种情况。
当您说以下内容时,您的代码也有错误:
| pcmBytes[i+1]
字节在这里被转换为一个 int,如果它是 "negative" 那么它将用一堆 1 进行符号扩展,这些 1 将踩踏 pcmBytes[i].
的高位
结果一直听起来很糟糕,即使您的音量是 1.0。它听起来不可怕的原因可能是因为你把字节顺序搞混了,所以你真的只是在踩低位而不是高位。
因此,当您固定字节顺序时,请务必先将字节与 0xFF 进行或运算,然后再将其放入示例字中。
我正在尝试对某些 PCM 样本应用音量限制。
但是,每当我应用的音量不是 1.0 重 static/noise 时(有趣的是,只有大约 80% 的声音持续时间,其余部分似乎没有失真)并且音量没有甚至似乎受到影响。
就像我说的,如果下面代码中的 soundVolume 是 1.0,效果很好。如果它是 0.1-0.9,它会产生可怕的噪音并且根本不起作用。我不知道为什么。
PCM 样本采用 16 位签名。
// Get samples, apply volume, clamp, write back.
short s1 = (short)((pcmBytes[i] << 8) | (pcmBytes[i + 1]));
s1 = (short)(s1 * soundVolume);
pcmBytes[i] = (byte)((s1 >> 8) & 0xFF);
pcmBytes[i + 1] = (byte)(s1 & 0xFF);
这段代码有问题吗?在通过算法时追踪 s1 似乎表明它已被正确修改。我是否正确处理了字节?
编辑: 即使我正在修改的声音是纯粹的静音,也会出现这种情况。如果 soundVolume 不是 1.0,我会得到静态值。
解决方案: 新代码,当字节是小端时,我错误地将字节处理为大端。将其与一些缺失的掩码 0xFF 结合起来,这就是解决方案。
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);
仅根据您对问题的描述,我猜您正在处理小端数据,就好像它是大端数据一样。用 [i+1] 交换 [i] 可以解决这个问题。请注意,如果您的数组与示例流有一个字节不对齐,也会发生这种情况。
当您说以下内容时,您的代码也有错误: | pcmBytes[i+1] 字节在这里被转换为一个 int,如果它是 "negative" 那么它将用一堆 1 进行符号扩展,这些 1 将踩踏 pcmBytes[i].
的高位结果一直听起来很糟糕,即使您的音量是 1.0。它听起来不可怕的原因可能是因为你把字节顺序搞混了,所以你真的只是在踩低位而不是高位。
因此,当您固定字节顺序时,请务必先将字节与 0xFF 进行或运算,然后再将其放入示例字中。