我正在播放程序中的音频文件,在音频渲染回调中,我将增益乘数应用于输入信号并将其添加到输出缓冲区。这里有一些伪代码来说明我的行为:
void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
for (int i=startSample; i<numSamples+startSample; i++){
ao[i] = ai[i]*gain;
}
}
基本上我只是将数据乘以一些乘数。在这种情况下,gain
是一个浮动成员,通过GUI回调进行调整。如果我在音频仍在播放时调整此值,我可以听到当我移动滑块时音频变得越来越柔和,但我听到很多小爆炸声和咔嗒声。
不确定这笔交易是什么。我知道插值,如果音频是音调移位的话,我会这样做,但是如果在音频文件播放完毕之前实时调整增益,我不确定是否需要进行任何额外的插值。 / p>
如果我在音频开始播放之前调整滑块,则增益设置正确,我没有点击。
我在这里遗漏了什么吗?如何实现增益,但输入信号是乘数?
答案 0 :(得分:2)
问题:乘法运算符如何知道哪个操作数是音频信号,哪个是增益?答:没有。 它们都是音频信号,任何一个声音都可以在输出中听到。
平坦,不变的信号不会产生任何可听见的声音。只要增益保持不变,它就不会引入任何声音。
突然变化的信号将非常听到,听起来像是一个包含大量高频的点击。
正如您自己确定的那样,减少高频内容的可能性之一就是使用恒定斜率来延长多个样本的变化。在您有足够时间进行增益更改的应用程序中,这肯定就足够了。
另一种方法是在增益信号上运行低通滤波器,并使用 作为乘法的输入。
答案 1 :(得分:1)
我通过改变增量改变增益来修复它。例如,如果增益乘数设置为1.0,则改为0.8,即0.2增益的差值。对于回调中的每个样本,将差值/ numSamples添加到前一个卷以创建一个slurring或逐渐增益变化。