0

我正在播放程序中的音频文件,并且在音频渲染回调中,我将增益乘数应用于输入信号并将其添加到输出缓冲区。这是一些伪代码来说明我的操作:

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 回调调整的浮动成员。如果我在音频仍在播放时调整此值,我可以听到当我移动滑块时音频变得更柔和或更响亮,但我听到很多小的爆裂声和咔嗒声。

不太确定这笔交易是什么。我知道插值,如果音频发生了音高偏移,我会这样做,但我不确定是否需要做任何额外的插值,或者如果在音频文件完成播放之前实时调整增益,我会这样做。

如果我在音频开始播放之前调整滑块,增益设置正确并且我没有点击。

我在这里错过了什么吗?除了输入信号的乘法器之外,增益还如何实现?

4

2 回答 2

3

问题:乘法运算符如何知道哪个操作数是音频信号,哪个是增益?答:不会。它们都是音频信号,任何一个可以听到的任何声音都会在输出中听到。

平坦、不变的信号不会产生任何可听见的声音。只要增益保持不变,它就不会引入任何自己的声音。

突然变化的信号会非常可听,听起来像咔哒声,包含很多高频。

正如您自己确定的那样,减少高频内容和可听度的一种方法是使用恒定斜率在多个样本上扩展变化。在您有大量时间进行增益更改的应用程序中,这当然就足够了。

另一种方法是对增益信号运行低通滤波器并将用作乘法的输入。

于 2014-08-08T22:18:12.070 回答
2

我通过改变改变量的增量来修复它。例如,如果增益乘数设置为 1.0,然后更改为 0.8,则相差 0.2 增益。对于回调中的每个样本,将差异/numSamples 添加到前一个音量以创建模糊或渐变的增益变化。

于 2014-08-04T07:15:54.187 回答