Audio 实现音频延迟效果单元

Audio 实现音频延迟效果单元,audio,delay,signal-processing,Audio,Delay,Signal Processing,我正在创建一个音频延迟单元。基本上,传入的样本进入循环缓冲区,并从某个读指针(即写指针后面的多个样本)中提取出来。对于每个新样本,这些指针将递增一 此外,为了允许分数延迟,我实际上有两个读取指针,一个采样间隔,并根据浮点延迟参数使用双线性插值在它们之间混合。(我可以使用sinc插值或其他方法,但还没有为此烦恼。) 当延迟设置为特定值时,一切正常。但是,当用户在播放声音时改变延迟时,由于延迟抽头的变化,也会出现爆裂声。据推测,这是在不同的样本中提取信号,并在音频波形中引入随机阶跃不连续性 我想知道

我正在创建一个音频延迟单元。基本上,传入的样本进入循环缓冲区,并从某个读指针(即写指针后面的多个样本)中提取出来。对于每个新样本,这些指针将递增一

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

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


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

当您更改延迟时,总会出现某种失真。这只是挑选你想要的东西的问题

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

Problerhead的理由实际上模拟了加速和减慢录音,就像是磁带延迟一样,而你正在移动磁头。这很复杂。。。在到达新的缓冲区位置之前,您可以有效地动态重新采样缓冲区音频

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

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


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

我不知道DSP单元是如何做到这一点的,但我建议您对用户设置的延迟应用低通滤波器,以避免任何突然的变化

set\u delay[n]
表示用户在采样时设置的延迟
n
,并让
filtered\u delay[n]
为过滤延迟。最简单的低通滤波器是单极IIR滤波器:

filtered_delay[n] = (1-alpha)*filtered_delay[n-1] + alpha*set_delay[n]
alpha
控制过滤器的时间常数。应该选择它作为响应性和平滑性之间的折衷


例如,如果用户突然将
set_delay
从100个样本更改为50个样本,则
alpha=0.1的
filtered_delay
将为:95、90.5、86.45,…,从而从100慢慢减少到50。

这是一个很酷的答案。我对最后一个感兴趣。问题是,用户正在动态地改变控制器上的延迟,因此我得到的控制消息可能非常频繁,所以静音不是一个选项,因为我不想中断音频。我确实提出了一个类似于你的解决方案,那就是在10毫秒内将音频从一个延迟交叉淡入另一个延迟。这引入了一个控制延迟,但我怀疑它会在过渡期间混合。然而,簿记是相当复杂的,特别是当新的控制消息可以在交叉淡入完成之前到达时。这是一个很好的答案。请注意,它确实引入了人工制品,因为您正在对信号重新采样。特别是,如果你向上俯仰(减少延迟时间),你可能会产生混叠失真。你不是在做双线性插值,只是常规的线性插值。双线性插值将用于成像。