2013-10-12 41 views
3

我正在创建音频延迟单元。本质上来说,传入的样本进入循环缓冲区,并从一些读指针中取出,该指针是写指针后面的一些样本。对于每个新样本,这些指针会加1。实现音频延迟效果单元

此外,为了允许分数延迟,我实际上有两个读取指针分开一个样本,并使用双线性插值根据浮点延迟参数在它们之间进行混合。 (我可以使用sinc插值或其他东西,但还没有打扰过。)

当延迟设置为特定值时,它都可以正常工作。但是当用户在播放声音时改变延迟时,由于变化的延迟抽头,crack啪声也很明显。据推测,它是在不同的采样点采集信号并在音频波形中引入随机步长不连续。

我想知道是否有任何DSP音频爱好者知道如何解决这个问题,因为我知道我已经玩过延迟盒,但这种效果没有发生,但目前我无法想象的解决方案。

+0

您不是在执行双线性插值,而是在进行常规的旧线性插值。将使用双线性插值,例如,用于成像。 http://en.wikipedia.org/wiki/Bilinear_interpolation –

回答

3

当你改变延迟时,总会有某种失真。这只是一个挑选你想要的东西的问题。

正如你发现的那样,如果你只是掉进一个随机点,从一个样本值到下一个样本值的急剧跳转往往会导致听得见的流行音乐。一种选择是简单地将音频静音一小段时间并重新启动。如果这仍然太突然,可以在几毫秒内将值缩小到零,并在几毫秒内将它们缩放到新缓冲区位置。 (有效地快速调低音量,然后在您处于新位置时再备份。)

Propellerhead的原因实际上模拟加速和减慢录音,就好像它是磁带延迟一样,并且您正在移动头。这非常复杂......您将动态地重新采样缓冲区音频,直到您到达新的缓冲区位置。

+0

这是一个很酷的答案。我对最后一个感兴趣。问题在于用户动态地改变了控制器的延迟,所以我得到的控制消息可能很常见,所以静音不是一种选择,因为我不想中断音频。 我确实想出了一种类似于你的解决方案,即将音频从一个延迟交叉淡入到另一个,比如说10ms。这引入了控制延迟,但我怀疑它会混合过渡。但是,簿记相当复杂,特别是在交叉淡入淡出完成之前新的控制消息可以到达。 – Robotbugs

+0

这是一个很好的答案。请注意,它会引入人为因素,因为您正在对信号进行重采样。特别是,如果您正在调整(缩短延迟时间),则可能会产生混叠失真。 –

0

当用户在播放声音时改变延迟时,由于变化的延迟抽头,噪音也很明显。据推测,它在不同样本处拾取信号并在音频波形中引入随机步骤不连续。

是的。这是完全正确的。我认为最自然的解决方法是平滑延迟时间的变化。例如,不是从200毫秒延迟跳跃到500毫秒,延迟效应应该在一段时间内平稳地从200毫秒变为500毫秒。利用这种技术,延迟音频将会下降或上升,这取决于延迟时间改变的速度。

这种技术可以引入别名(正如Bjorn Roche在评论中指出的那样)。如果这是一个问题,一个解决方案是使用bandlimited interpolation

0

我不知道DSP单元如何去做,但我建议您将低通滤波器应用于用户设置的延迟,以消除任何突然的变化。

set_delay[n]表示用户在时间样本n处设置的延迟,并且让filtered_delay[n]为过滤后的延迟。最简单的低通滤波器是一个单极IIR滤波器:

filtered_delay[n] = (1-alpha)*filtered_delay[n-1] + alpha*set_delay[n] 

alpha控制滤波器的时间常数的值。应该选择它作为响应性和平滑性之间的折衷。

例如,如果用户突然改变set_delay从100到50个样品中,用filtered_delayalpha=0.1将是:95,90.5,86.45,...,从而慢慢从100降低至50。