【问题标题】:Modify volume gain on audio sample buffer修改音频样本缓冲区的音量增益
【发布时间】:2011-05-17 02:31:22
【问题描述】:

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

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

也许我应该以其他方式修改增益?还是只是使用另一种后处理算法?

更新:哇,我刚刚发现了有趣的事情!我在增加音量之前和之后都转储了音频。

这是图片

对不起质量 - 我认为这就是声音应该出现的方式(我自己画了红线)。确实看起来值超出了示例数据类型。但我不明白为什么?我的样本缓冲区是 BYTE,但我只能通过短指针访问它。它已签名,但即使 *ptr 约为 15-20 千,也会发生剪裁。

【问题讨论】:

  • 什么是“一些剪辑或什么” - 您的值实际上是否超出了示例数据类型的界限? “尝试使用 Audacity 效果压缩器”是什么意思?是在裁剪后的输出上还是在裁剪前的输出上?
  • 样本为 200ms 音频,采样率为 22050hz。 2 个字节 - 短。如果我将此样本乘以 1.f - 原始体积 - 一切都很好。如果我乘以小于 1.f 的值 - 音量会变小。但是如果我将它乘以例如1.3f - 音量变高但有难看的刮擦声。我在混合缓冲区(带剪辑)上使用了大胆的效果压缩器。
  • 这是我用一些代码回答的问题 - 这不是我的想法,所以不要指望它会按原样工作。

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


【解决方案1】:

对于每个样本 - 将其转换为更大的数据类型 - 如果您有 16 位带符号样本,它们最初适合 SHORT - 从流中提取它,然后转换为本地双精度,然后相乘,然后 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++;

还有一个编辑:

如果您有多个声音 - 首先将它们全部加倍 - 然后获得每个声音 - 然后添加它们 - 并将它们作为最后一步进行剪辑。

再编辑一次(+1 鼓舞了我):

如果你有 STEREO,同样的东西也可以,只需计算所有样本 x2 即

number of shorts=number of samples*2.

【讨论】:

  • 哇!这只是一个超级答案!非常感谢 - 我明天会尝试这种方法,如果一切正常,我会标记为已回答;)
  • 是的,它有效!老实说,这是我犯的一种愚蠢的错误:'(丹尼尔,非常感谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多