如何通过改变16位PCM样本的“音量”来减少或消除噪音

时间:2012-05-01 18:31:44

标签: c++ wav pcm 16-bit

我目前正在开展一个小项目,我正在加载16位波形文件,采样率为44100Hz。在正常播放中,音频似乎很好,但是一旦我开始播放像振幅大小这样的东西来改变音量,它就会开始产生一点静电噪声。

我正在做的是在16bit类型的情况下从缓冲区获取一个样本,将其转换为-1到1范围内的浮点数,以开始混合和其他效果。在这里我也改变音量,当我将它乘以1给出相同的输出它的罚款,但一旦我开始改变音量我听到静音。它发生在超过1.0以及低于1.0时。而且规模越大或越小,情况就越糟糕。

任何人都知道如何减少或消除噪音?

2 个答案:

答案 0 :(得分:4)

“静态”,也称为“咔嗒声​​和砰砰声”,是输出信号不连续的结果。以下是不连续性的完美示例:

http://en.wikipedia.org/wiki/File:Discontinuity_jump.eps.png

如果您向系统发送音频缓冲区以进行回放,然后对于下一个缓冲区,您将每个样本乘以1.1,则可以创建不连续性。例如,考虑一个包含值为[-0.5,0.5]的正弦波的缓冲区。您将此波的一部分发送到输出设备,最后一个样本恰好是0.5。

现在在您的下一个缓冲区上,您尝试通过乘以1.1来调整音量。新缓冲区的第一个样本将接近0.5(因为前一个样本是0.5)。将其乘以1.1,得到0.55。

从一个样本到下一个样本的变化可能听起来像点击或流行。如果你创造了足够的这些,它听起来就像是静态的。

解决方案是“缓冲”缓冲区上的音量变化。例如,如果要将增益1.1应用于100个样本的缓冲区,并且之前的增益为1.0,那么您将从增益1开始循环所有100个样本,并平滑地增加增益,直到到达最后一个样本,此时你的收益应该是1.1。

如果你想要这个代码的例子,请看juce :: AudioSampleBuffer :: applyGainRamp:

http://www.rawmaterialsoftware.com/api/classAudioSampleBuffer.html

答案 1 :(得分:1)

我发现了这个缺陷,我通过使用char *转到他们的数据来抽象不同的位数据类型,我没有将它的用法转换为正确的数据类型指针。这意味着在给出数据时会切断字节。这造成了噪音和音量改变等问题。

我的实施的一个缺陷,我在处理音频数据时没有考虑这个问题。对于任何做同样事情的人来说,在修改数据时要保持良好的眼光,在使用抽象时检查数据的类型。

非常感谢那些试图帮助我的人,链接非常有趣,它确实让我了解了有关音频编程的更多信息。