如何在 ADI DSP 中设计一个合理的混响 (下)
《如何在 ADI DSP 中设计一个合理的混响》系列专辑由两篇文章构成,围绕着混响的需求、原理以及实现流程展开了详细描述。一方面可以帮助大家了解混响效果的一些基本知识,另一方面工程师可以参考这些模型用到自己的产品上,从而设计出比较贴合自身产品的算法。
本文为下篇,将对混响的具体参数调整以及选择 ADI 的 DSP 设计合理算法进行深入解析。关于混响的类型、主要几大类 DSP 混响的实现原理,可参考上篇《如何在 ADI DSP 中设计一个合理的混响 (上) 》。
混响的常见参数
在上篇文章中,我们提及了混响的类型和基本实现原理。目前做一个专业级混响需要设置许多参数,有些参数是必备的,而有些是在特定需求下慢慢增加起来的。专业的效果器一般包含了如下图 (图1) 所示的一些参数:
- 混响时间:能够逼真地模拟自然混响的数码混响器上都有一套复杂的程序,其中虽然有很多技术参数可调,然而对这些技术参数的调整都不会比原有的效果更为自然,尤其是混响时间 (取决于预延迟时间以及衰减速率和收敛的判定)。
- 预延迟时间:在混响效果器上的众多参数中,预延迟时间 (Predelay) 是一个比较重要的点。所谓预延迟时间,指的是进入人耳的直达声和第一次反射声之间的时间间隔。在混音中,预延迟时间的选择与我们的基准时间有着一定的关联性。而基准时间的计算方式一般来说就是拿 60 秒除以音乐 BPM 的值 (取决于直达声之后做的延迟时间以及 FIR 的时间)。
- 高频滚降:此项参数用于模拟自然混响中,空气对高频的吸收效应,以产生较为自然的混响效果。一般高频混降的可调范围为 0.1~1.0。此值较高时,混响效果也较接近自然混响;此值较低时,混响效果则较清澈 (取决于低通滤波器的阶数以及截至频率的设计)。
- 扩散度:此项参数可调整混响声阵密度的增长速度,可调范围为 0~10,其值较高时,混响效果比较丰厚、温暖;其值较低时,混响效果则较空旷、冷僻 (取决于 Comb Filter 的 D 值选取以及回声密度递增数值)。
- 声阵密度:此项参数可调整声阵的密度,其值较高时,混响效果较为温暖,但有明显的声染色;其值较低时,混响效果较深邃,器声染色也较弱 (取决于 Comb Filter 的数量)。
- 频率调制:这是一项技术性参数,因为电子混响的声阵密度比自然混响稀疏,为了使混响的声音比较平滑、连贯,需要对混响声阵列的延时时间进行调制。此项技术可以有效消除延时声阵列的段裂声,可以增加混响声的柔和感 (取决于 Comb Filter 的延时时间)。
- 混响类型:不同房间的自然混响声阵列差别也较大,而这种差别并不是一两项参数就能表现的。在数码混响器当中,不同的自然混响需要不同的程序。它的可选项一般有小厅 (S-Hall)、大厅 (L-Hall)、房间 (Room)、随机 (Random)、反混响 (Reverse)、钢板 (Plate)、弹簧 (Spring) 等。其中小厅、大厅、房间混响属自然混响效果;钢板、弹簧混响则可以模拟早期机械式混响的处理效果。
- 干湿比:干声信号和混响信号的比例,调节直达声以及混响信号的分量比重。
从这些后续发展出来的参数不难看出,涉及的调节选择变得越来越多,那么对于设计者来讲,如何挑选合适的参数和类型去搭建自己想要的产品就变得非常重要。
DSP 和混响类型的选择
在实际的生产应用中,选择混响的类型并不是直接去选一个最完善的类型就好了。实际上很多时候应用达不到这个条件,越完善的混响类型意味着它对 DSP 的内存空间以及算力大小都是有需求的。然而在很多成本预算不是那么充足,或者工作环境对功耗等方面都有需求的产品中,我们无法选择那么一个较高复杂度的混响。
举个很简单的例子,比如 A 用户需要做一个轻量级的吉他拾音器,拾音器主要的目的就是拾音,当然为了丰富一些效果,可能我们需要调节高中低频的 EQ,加一个混响。在这个时候,选择一个 ECHO 类的混响要比选择 MOORER 类的混响好太多。从控制成本和功耗的角度上来讲,虽然 ECHO 类并不如 Moorer 类的好,但是在演奏中已经够用,复杂的可以通过拾取后送到效果器或者功放中去实现。在选择时,建议都要根据自己的产品类型合理地从成本、封装体积大小,以及功耗上选择最为合适的产品。
ADI DSP 在 ECHO 类算法的基本实现
众所周知,ADI 在音频的 DSP 上相当有竞争力,从 Sigma 到 Sharc 类的 DSP 均运用于各类音频电子产品中。如下图 (图2) 所示为 ADI SigmaDSP 产品选型对比表:
下图 (图3) 为 ADI SharcDSP 产品选型对比表:
ADI SigmaDSP 的产品是定点的数字信号处理器,而 SharcDSP 即全浮点的数字信号处理器。全浮点的 DSP 可以处理复杂度比较高的混响,SigmaDSP 一般用于处理一些简单一点的混响。以下将展示一些 ECHO 类混响在 DSP 上的应用实现,目前混响主要对内存的空间需求是比较多的,存在着很多 Delay。ECHO 类混响在 ADAU1701 和 ADAU1761中 的实现如下图 (图4) 所示:
从图中可以看出,直达声直接作为干音传到输出端,将音源的左右通达合成一路用来减少内存空间和算力的消耗,用三个延时线创造混响空间,传到后端进行低通滤波,实现高频滚降。这样做能够得到一定量的混响的效果,但是由于回声密度不够,增益调节以及扩散度和频率调制是无法实现的,适合一些轻量化的产品应用。我们在 SharcDSP 中一般直接通过代码来实现,例如下方的 ECHO 类回声的实现:
创建一个 DSP 混响的效果器。以下图 (5) 是一个使用 Python 和 NumPy 库实现简单 DSP 混响效果的示例代码:
如上图 (图5) 所示的代码实现了一个基本的 DSP 混响效果,包括延迟线和低通滤波器。我们可以根据需要调整延迟时间和截止频率来改变混响的效果。需要注意的是,这个示例使用了 Python 的 NumPy 库来处理数字信号,并且需要在支持音频播放的环境中运行 (例如 Jupyter notebook 或 Python 脚本)。
如上图 (图6) 所示的代码是一个简单的 DSP 混响效果实现,它使用了 C 语言进行编程。代码主要有以下操作:
- 定义了一些常量,如采样率、帧大小、通道数、延迟长度和衰减时间等;
- 定义了一个名为 DelayBuffer 的结构体,用于实现延迟缓冲区;
- 创建了一个名为 create_delay_buffer 的函数,用于创建延迟缓冲区;
- 定义了一个名为 destroy_delay_buffer 的函数,用于销毁延迟缓冲区。
在 main 函数中,首先创建了一个延迟缓冲区,然后进入了一个循环,模拟了信号的输入、处理和输出过程。在每次循环中,信号被输入到混响效果处理中,处理后的信号被输出,同时衰减时间也在不断衰减。最后当延迟时间达到最大值时,循环结束,延迟缓冲区被销毁。在 ADI Sharc 平台上,当我们跑通 Framework 之后,导入这一部分代码,将音频流导入进去就可以得到一个 ECHO 类的混响效果。如果需要更高级好用的 Schroeder & Moorer 类混响系统时,可以通过开源框架 Sox,Freeverb 和 Tonic 去获取,完整的算法会比较长,需要大家在线下去参考。
总结
本文简要概述了混响的相关类型和实现方式,通过对产品的需求分析,可以在 ADI DSP 中去实现合适的算法。ADI DSP 在各类混响的算法都能够实现,同时也支持大家进行相应的产品选择。欲了解更多技术细节和 ADI 相关方案,您可以点击下方「联系我们」,提交您的需求,我们骏龙科技公司愿意为您提供更详细的技术解答。
相关阅读
更多信息: