2

我目前正在做一个小项目,我正在加载采样率为 44100Hz 的 16 位波形文件。在正常播放中,音频看起来不错,但是一旦我开始播放诸如振幅大小之类的东西来改变音量,它就会开始发出一点点静态噪音。

我正在做的是在这个 16 位类型的情况下从缓冲区中获取一个样本短,将其转换为 -1 到 1 范围内的浮点数以开始进行混合和其他效果。在这我也改变了音量,当我只是将它乘以 1 给出相同的输出时,它很好,但是一旦我开始改变音量,我就会听到静态噪音。当超过 1.0 和低于 1.0 时会发生这种情况。规模越大或越小,情况就会变得更糟。

有人知道如何减少或消除噪音吗?

4

2 回答 2

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。

从一个样本更改为 0.05 的下一个样本可能听起来像是咔哒声或砰砰声。如果你创建了足够多的这些,它会听起来像静态的。

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

如果您想要此代码的示例,请查看 juce::AudioSampleBuffer::applyGainRamp:

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

于 2012-05-02T02:11:03.107 回答
1

I found the flaw, I was abstracting different bit data types by going to their data using char*, I did not cast the usage of it to the correct datatype pointer. This means bytes were cut off when giving it data. This created the noise and volume changing bugs amongst others.

A flaw of my implementation and me not thinking about this when working with the audio data. A tip for anyone doing the same kind of thing, keep a good eye when modifying data, check which type your data is when using abstractions.

Many thanks to the guys trying to help me, the links were really interesting and it did learn me more things about audio programming.

于 2012-05-21T20:55:42.247 回答