gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:15:56 24 4
gpt4 key购买 nike

我正在尝试对某些 PCM 样本应用音量限制。

但是,每当我应用的音量不是 1.0 时,就会产生严重的静电/噪音(有趣的是,仅在声音持续时间的 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] 与 [i+1] 交换即可解决此问题。请注意,如果您的数组与示例流有一个字节不一致,也会发生这种情况。

当您说以下内容时,您的代码也有一个错误:| pcm字节[i+1]字节在这里被转换为 int,如果它是“负”,那么它将用一堆 1 进行符号扩展,这将破坏 pcmBytes[i] 的高位。

结果听起来总是很糟糕,一直,即使你的音量是 1.0。它听起来并不可怕的原因可能还是因为你混淆了字节顺序,所以你实际上只是踩在低位而不是高位上。

因此,当您修复字节顺序时,请务必先将字节与 0xFF 进行 & 操作,然后再将其或操作到示例字中。

关于java - 将音量应用于产生静电/噪音的 PCM 样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com