AudioUnit:如何摆脱音调开始和结束时的弹出/点击?

时间:2011-11-16 21:21:18

标签: iphone objective-c ios

在我正在使用AudioUnits生成音效的游戏中工作。我的声音生成代码来自示例:http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html

我几乎所有的东西都在工作,除了每个音调的开始和结束都会产生一种非常烦人的砰砰声。有没有办法过滤掉这个?我已经工作了几个小时试图修复它,我真的可以使用一些指针。什么可能导致这种爆裂声?

3 个答案:

答案 0 :(得分:7)

弹出的噪音是由您产生的声音的恒定振幅引起的。扬声器的振膜必须立即从静止位置(0幅度)移动到第一个样本振幅的正确位移。它产生的“跳跃”会产生爆裂声。

你需要在前几十个样本上增加幅度,同样在声音结束时减速。

答案 1 :(得分:4)

这很可能是由于从静音到最大音量的突然变化,导致信号强烈不连续。如果是这样,您应该有攻击阶段和发布阶段:从第0卷逐渐增加到最大数量,反之亦然。这些阶段不必很长,只需几毫秒。它们不会被人类听到。

答案 2 :(得分:0)

是的,信号中的突然跳确实会导致弹出/点击。然而,重要的是要评论如果连续播放音调,那么它们之间应该存在连续性(例如,最后一个样本=第一个样本),并且频率内容是“平滑的”。

我发现生成镜像音频非常有用。例如,如果你需要一个n样本音频,你可以生成一个n / 2样本的正弦曲线,然后将翻转/反转(n / 2样本)信号附加到自身,这样你就知道了(最后样本==第一个样本),频域属性也是连续的。

如果octave / matlab可用,sig = [halfSig fliplr(halfSig)];将会这样做。观察figure;plot(abs(fft(sig)));

乘以线性斜坡包络,瞧。