3

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

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

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

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

4

3 回答 3

3

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

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

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

于 2013-10-12T23:24:49.950 回答
0

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

是的。这是完全正确的。我认为解决这个问题最自然的方法是平滑延迟时间的变化。例如,不是从 200 毫秒延迟跳到 500 毫秒,您的延迟效果应该在一段时间内平滑地从 200 毫秒变为 500 毫秒。使用这种技术,延迟的音频将根据延迟时间的变化速度下降或上升。

这种技术可以引入混叠(正如 Bjorn Roche 在评论中指出的那样)。如果这是一个问题,一种解决方案是使用带限插值

于 2013-10-14T07:08:39.400 回答
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_delaywithalpha=0.1将是:95, 90.5, 86.45, ...,从而从 100缓慢减少到 50。

于 2013-10-14T19:03:56.480 回答