实现音频延迟效果单元

时间:2013-10-12 23:12:28

标签: audio delay signal-processing

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

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

当延迟设置为特定值时,一切正常。但是当用户在播放声音时改变延迟时,由于延迟抽头的改变,噼啪声也很明显。据推测,它是在不同样本处拾取信号并在音频波形中引入随机步长不连续性。

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

3 个答案:

答案 0 :(得分:3)

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

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

Propellerhead's Reason实际上模拟了加速和减慢录音的速度,好像它是一个磁带延迟,而你正在移动头部。这非常复杂......您有效地重新采样缓冲区音频,直到到达新的缓冲区位置。

答案 1 :(得分:0)

  

当用户在播放声音时改变延迟时,会发出噼啪声   由于延迟抽头的变化,噪声也很明显。大概是这样的   正在以不同的样本取出信号并随机引入   音频波形中的步骤不连续。

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

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

答案 2 :(得分: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_delay alpha=0.1将为:95,90.5,86.45,...,因此< em>慢慢从100减少到50。