我在程序中播放音频文件,在音频呈现回调中,我对输入信号应用增益乘法器,并将其添加到输出缓冲区。下面是一些伪代码来说明我的操作:
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回调进行调整。如果我在音频还在播放的时候调整这个值,我可以听到当我移动滑块时音频变得更软或更响,但是我听到很多小的弹出和点击。
不太确定交易是什么。我知道插值,如果音频发生了音高偏移,我就会这样做,但我不确定是否需要做任何额外的插值,或者在音频文件播放结束之前,是否需要实时调整增益。
如果我调整滑块之前,音频开始播放,增益是正确设置,我没有得到点击。
我是不是漏掉了什么?除了输入信号上的乘法器外,增益如何实现?
发布于 2014-08-08 22:18:12
问:乘法运算符如何知道哪个操作数是音频信号,哪个是增益?答:不是。它们都是音频信号,任何声音都会在输出中被听到。
一个平坦的,不变的信号不会产生任何声音。只要增益保持不变,它就不会自己带来任何声音。
一个突然变化的信号将是非常可听到的,它听起来像一声咔嗒声,包含了大量的高频。
正如你自己决定的那样,降低高频含量的一种方法就是用一个恒定的斜率将变化扩展到多个样本上。在您有大量时间进行增益更改的应用程序中,这当然就足够了。
另一种方法是在增益信号上运行一个低通滤波器,并将其用作乘法的输入。
发布于 2014-08-04 07:15:54
我修正了它,改变了收益的增量所改变的数额。例如,如果增益乘数设置为1.0,然后更改为0.8,则相差0.2。对于回调中的每个示例,将差异/ numSamples添加到前一个卷中,以创建一个模糊或渐进式增益变化。
https://stackoverflow.com/questions/25112055
复制相似问题