混响是一类模拟声音在空间扩散反射的效果器,按照实现方式的不同可以分为卷积混响和算法混响。
卷积混响是使用卷积来物理级模拟声音在空间中反射的效果器。一般地可以将卷积混响定义如下
Y[n]=(X∗I)[n]
其中 X[n] 为输入音频 I[n] 为实现录制的脉冲响应 (Impulse Response, 简称 IR) Y[n] 为输出。
脉冲响应是某个空间中理想脉冲信号的声学响应记录,保留该空间中的混响特性。一般以在目标空间中录制的一个瞬态信号经去卷积处理后得到。不过由于 IR 的任意性,在电子音乐中 IR 也可以用作声音染色。
在实践中,因为卷积混响的计算复杂度较高,一般会通过卷积定理配合快速傅里叶变换、SIMD、多线程等手段加速运算(如将 IR 分块与输入音频帧长度一致,之后执行 FFT,在频域逐分量相乘后在进行 IFFT 并将重叠部分输出)。
算法混响是使用算法来模拟混响效果的方式,一般通过物理方式建模等等。下面列举了一些经典的算法混响。下文中如未作特殊说明,则 X[n] 表示输入音频流,Y[n] 表示输出音频流。
物理学家 Manfred Schroeder 在 1962 年提出的混响,主要思想是利用并联的梳状滤波器和串联的全通滤波器模拟自然混响。
Schroeder 混响通常由 k 个并联的 Comb Filter 和 m 个串联的 Allpass Filter 实现,其结构如下(以 k=4,m=2 为例,下同):
flowchart LR
输入信号 --> 反射滤波1[Comb Filter]
输入信号 --> 反射滤波2[Comb Filter]
输入信号 --> 反射滤波3[Comb Filter]
输入信号 --> 反射滤波4[Comb Filter]
反射滤波1 --> 扩散滤波1[Allpass Filter]
反射滤波2 --> 扩散滤波1[Allpass Filter]
反射滤波3 --> 扩散滤波1[Allpass Filter]
反射滤波4 --> 扩散滤波1[Allpass Filter]
扩散滤波1 --> 扩散滤波2[Allpass Filter]
扩散滤波2 --> 输出
其中 Comb Filter 用以模拟反射回声,其差分方程如下
Y[n]=X[n−T]+aY[n−T]
其中 T 是延迟时间,一般选择互质的毫秒级长度避免周期性,如 31,37,41,43,a 为反馈系数控制衰减速度,一般 a∈(0,1)。
而 Allpass Filter 用于模拟回声信号的扩散,其差分方程如下
Y[n]=−gX[n]+X[n−D]+gY[n−D]
其中 D 是延迟时间,一般选择较短的长度如 5ms,g 为反馈系数控制衰减速度,一般 g∈(0.5,0.7)
该混响持续时间 t 由以下公式给出
t=−fslga3T
取 k 个 Comb filter 所确定的持续时间的最大值。
此混响的效果具备较强的金属质感,优势在于计算效率高但缺乏真实空间的早期反射建模。
已有的实现如 Sonicbits Sphere 或 Freeverb,你也可以自行用 Max for Live、Fl Studio 的 Patcher 或是其他手段自行实现。
反馈延迟网络 (Feedback Delay Network, 简称 FDN) 是通过多个延迟线生成衰减信号的方法。
反馈延迟网络通常由多个独立的延迟线组成,设系统总共有 k 个延迟线,则其状态向量定义为 S[n]=(s1[n],⋯,sk[n])T 其满足
S[n+1]=M⋅D(S)[n]+X[n]⋅b
其中 M∈Mk(R),称作反馈矩阵,通常取正交矩阵保证混响正常衰减。D(⋅):(N→R1×k)→(N→R1×k) 是延迟线操作,其定义为
D(S)[n]=[s1[n−d1],⋯,sk[n−dk]]T
即向历史状态的每一个分量添加不等的延迟 d1,⋯,dk,通常互质。b 是输入分配向量,表示向每一条延迟线输入多大的输入,一般可以直接取作 (1,⋯,1)T∈R1×k
而系统输出满足
Y[n]=c⋅S[n]+d⋅X[n]
其中 c∈Rk×1 是输出混合向量,一般可以直接取 (1,⋯,1)∈Rk×1,而 d∈R 是原始信号的比例,一般取 0 避免原始信号过强。
即整个系统可以由下图描述(以 k=3 为例)
graph LR
input[输入信号] --> adder1[混合器]
adder1 --> delay1[延迟线 3]
adder1 --> delay2[延迟线 2]
adder1 --> delay3[延迟线 1]
delay1 --> mixer[延迟并按特定方式混合]
delay2 --> mixer
delay3 --> mixer
mixer -->|反馈信号1| adder1
mixer -->|反馈信号2| adder1
mixer -->|反馈信号3| adder1
delay1 --> final_process[最终处理]
delay2 --> final_process
delay3 --> final_process
final_process --> output[输出信号]
实践中反馈矩阵常使用 Householder 反馈矩阵,其定义如下
M=I−⟨v,v⟩2vvT
其中 v 是任意一个向量,I 是单位矩阵 ⟨⋅,⋅⟩ 是内积。
实践中为了更好的模拟混响对高频的衰减,延迟线中音色往往还会经过低通滤波器,也会在末尾添加 Allpass filter 以更好的模拟回声信号的扩散。
混响持续时间 t(无低通)由下述公式给出
t=fs3max{d1,⋯,dk}
其中 fs 是采样率
市面上常见的混响如 ValhallaShimmer, Valhalla Room, FabFilter Pro-R2 等等均基于 FDN 实现,也有一些免费混响如 u-he Protoverb 可以使用。
除了上述主流方案还有其他基于物理模拟的解决方案,如基于有限元分析或者有限差分法求解声学方程,或引入深度学习方案(如扩散网络混响)等等。在此受限于篇幅原因略过。