修改音频样本缓冲区的音量增益

时间:2010-11-29 05:06:11

标签: c++ volume directsound audio-processing audacity

我想用语音数据增加缓冲区的音量。关键是我正在使用DirectSound,我有一个主缓冲区和一个辅助缓冲区 - 所有流混合都是手工完成的。在语音聊天中,所有参与者可以具有独立的音量级别。我将每个流数据乘以一个值(增益)并将其加到一个缓冲区。一切正常,但当我尝试将数据乘以大于1.0f的值时 - 我听到一些剪辑或什么。

我尝试过使用Audacity效果压缩器,但这无助于减少奇怪的噪音。

可能我应该以其他方式改变收益?或者只是使用另一种后处理算法?

更新:哇,我刚发现有趣的事情!在增加音量之前,我已经放弃了音频。

这是照片 Clipped audio

对不起质量 - 我认为声音应该出现的方式(我自己画了红线)。真的看起来像超过样本数据类型的值。但我无法理解为什么?我的samplebuffer是BYTE,但我只通过短指针访问它。它已签名但即使* ptr约为15-20万时也会发生剪辑。

1 个答案:

答案 0 :(得分:7)

对于每个样本 - 将其转换为更大的数据类型 - 如果你有16位带符号的样本,它们最初适合SHORT - 从流中提取它,然后转换为本地double,然后乘以,然后CLIP,然后返回简短。

它必须以这种方式工作......

如果需要,我甚至可以提供代码示例。

编辑:

你的图片确实证明你在乘法之前没有扩展到更大的类型 - 你无法在SHORT上'捕获'剪辑条件,因为它会自动换行。

short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;

还有一个编辑:

如果你有几个声音 - 首先将它们全部加倍 - 然后每个加一个 - 然后添加它们 - 并将它们作为最后一步CLIP。

另外一个编辑(+ 1s鼓舞了我):

如果你有STEREO,同样的东西也会起作用,只计算所有的样本x2,即

number of shorts = number of samples * 2