高品质混响算法

信息处理 算法
2022-01-02 07:43:57

我在这个网站上做了一些搜索,但令人惊讶的是,我没有找到太多相关信息,而且我对 DSP 的了解非常有限。

我的目标很简单:我想用 C++ 编写一个算法混响,听起来真的很棒。或者更准确地说,最好的选择是让最终用户在质量和 CPU 使用率之间进行权衡。

到目前为止,我发现,要创建混响,您必须将干信号输入到早期反射算法中,然后再输入到后期反射算法中。它是否正确 ?

现在,我找到了一篇关于后期反射部分的广泛文章,使用反馈延迟网络(使用时变反馈延迟网络减少人工混响要求)。从我读到的内容来看,FDN 是一种模拟后期反射的高质量、不太扩展(cpu 方面)的方法。此外,我想您可以通过更改延迟线的数量来控制质量/cpu 费用的权衡。

但是我完全不知道如何对早期反射算法进行编程(记住?我对 DSP 领域一无所知)。

对我来说,使用一种多延迟听起来是合乎逻辑的,它的优点是易于编程且计算成本低廉。但这听起来太简单了,不可能是真的。

此外,我的直觉告诉我,信号路径中的某处必须包含一个或多个滤波器。

有人可以为我澄清一下这个话题吗?

两个注意事项:

  • 我根本不追求卷积混响。我并不真正关心混响的真实性,而是我想要一个好的声音,可调整的,而不是 CPU 饥饿的混响。
  • 另外,编码部分不是我担心的,否则我会在stackoverflow上问。这真的是 DSP 部分,只是我所追求的那部分 :)
2个回答

您需要通过一些延迟生成早期反射(= 与少数狄拉克之和的卷积);以及通常使用全通(AP)和梳状滤波器网络实现的“尾部”。

第一部分实施起来很简单,但很难做到正确。查看预先记录的脉冲响应头部的峰值位置可能有助于了解哪种响应是“自然的”。很难通过一些设置轻松地对其进行参数化,尽管您可以通过为这部分提供一堆预设来获得“混合”混响 à la Virsyn Reflect 来摆脱它。

尾部是算法混响发光的地方(没有双关语),因为它很容易参数化。算法混响的祖父是施罗德的算法。请注意,它只会产生“尾巴”,而不是早期反射——您可以通过点击几下延迟来增加它以使其领先。这听起来不是很好(非常“颗粒状”),但它是一个不错的开始 - 你有一些东西要搞砸,它有助于理解每个参数的影响。许多广受赞誉的算法混响,尤其是 80 年代的算法混响(Lexicon、Eventide、Publison)只是全通滤波器和梳状滤波器的微调拓扑。我怀疑这涉及到训练有素的耳朵的大量试验和错误,他们非常擅长弄清楚参数或拓扑结构的变化会如何听起来,而不是任何科学方法。这是另一个有趣的读物- 展示 Keith Barr 最喜欢的混响拓扑。最初的 midiverb 可能不是你对“高质量算法混响”的定义,但它听起来很甜美,而且它是用“dsp”制作的,它只能用于系数为 0.5 的 MAC ......

Valhalla 房间是我最喜欢的软件算法混响 - 花一些时间阅读它的开发者博客,以找到有助于使其正确的事情的灵感。

制作好听的混响并不容易。反馈延迟网络绝对是要走的路。带有所有通过和梳状滤波器的原始 Schroeder 算法会遭受“光谱变薄”的影响,这使得它具有金属感。您需要在代表混响时间的不同延迟线上拨入频率相关衰减(作为频率的函数)。早期反射可以通过抽头延迟线完成,还带有一些频率相关的衰减和一些漫射器以将它们去相关。做立体声也需要一些去相关的方法。

有一个相当不错的开源实现,它被称为 GVerb,它被用于例如 Audacity。谷歌搜索应该可以让您找到源代码的(合法)副本。