网站设计论文介绍,深圳网页设计学院,google 官网入口,wordpress 国内 模板系列文章目录
Delay Line 简介及其 C/C 实现LFO 低频振荡器简介及其 C/C 实现【音效处理】Delay/Echo 简介【音效处理】Vibrato 简介 文章目录 系列文章目录一、混响二、人工混响三、数字混响算法3.1 混响的脉冲响应信号3.2 RT603.3 Schroeder 混响算法3.3.1 梳妆滤波#xf…系列文章目录
Delay Line 简介及其 C/C 实现LFO 低频振荡器简介及其 C/C 实现【音效处理】Delay/Echo 简介【音效处理】Vibrato 简介 文章目录 系列文章目录一、混响二、人工混响三、数字混响算法3.1 混响的脉冲响应信号3.2 RT603.3 Schroeder 混响算法3.3.1 梳妆滤波Comb Filter混响器3.3.2 全通滤波All-Pass FilterAPF混响器Schroeder 混响算法 总结参考 一、混响
混响是一种自然发生的声学现象。在房间中放置一个扬声器用于发声放置一个麦克风用于收集声音。当声音与墙壁或者其他材料相遇时声音发生反射因此麦克风收集到的信号除了扬声器到麦克风的径直路径外还有很多其他方式到达的声音如下图所示。 由于声波的传播距离稍长反射的声波到达我们耳朵的时间会比直达的声波晚一点。声波的振幅会弱一点因为墙面会吸收一些声音的能量。根据房间的大小时间和振幅的差异是不同的。这就是为什么我们可以在音乐厅里比在客厅里更容易分辨出反射效果。
在一个足够大的房间里反射会重复许多次然后一系列延迟和衰减的声波这被称为回声到达我们的耳朵。这就是我们如何感受到一个房间的“空间感”
二、人工混响
对人工混响的需求首先出现在录音广播和音乐背景下在录音室录制的声音往往过于 “干” 了缺乏音乐表演所需的音乐厅声学效果。早在 20 世纪 20 年代混响是通过将 “干” 的录音室信号发送到一个混响环境中通常是一个专门建造的回音室来人为地制造混响。人们在浴室唱歌时会感觉更有效果浴室、卫生间等可以认为就是一种回音室。
虽然回音室可以产生高质量的混响但它们的物理性质通常限制了它们在录音室和广播场合的使用。它们通常很难甚至不可能运输对外部的声学或机械干扰很敏感并且需要专门的知识来维护和调音。相比之下由计算过程产生的人工混响具有便利性、便携性和可重复性并允许自动化记录、编辑和回放混响器控制参数随时间变化的情况。这促使人们研究数字合成高质量混响的方法。
三、数字混响算法
由于数字处理设备和计算机技术的发展人们能够完成复杂的模拟找到自然产生混响的数字解决方案。这个混响问题的最早的数字解决方案是由贝尔电话实验室的Manfred Schroeder在1961年建立的Schroeder。这个解决方案被称为 Schroeder 的混响器它是本文的重点将在下面的章节中详细说明。
3.1 混响的脉冲响应信号
为了研究混响器的工作原理我们首先要了解声音在房间中的发射性质。 上图是某个房间的脉冲响应信号从图中可以观察到
直达声以直线路径传播是第一个到达听众耳朵的声波。离散的早期反射在直达声到达后 80ms 内进入听众耳朵。接下来的后期混响包含了成千上万的紧密间隔的回声但需要超过80毫秒的时间来建立然后逐渐消失。
下图是两个真实环境的脉冲响应 总的来说reverb 信号可以分为三个部分pre-delay、early reflections 和 late reverberation因此一种可行 reverb 模型为
3.2 RT60
不同的空间、场所有着不同的混响如何区分混响的不同呢有一个重要的指标混响时间Reverberation Time也叫 RT60具体的定义是指声场衰减 60 dB 所用的时间单位为「秒」。通俗的说就是你在一个房间里“啊”的大叫了一声这一声“啊”的分贝衰减了 60db 所花费的时间。
有些研究给出了 RT60 估计模型例如在公式【1】 R T 60 0.5 V R S R A R A v e (1) R T_{60}0.5 \frac{V_{R}}{S_{R} A_{R A v e}} \tag{1} RT600.5SRARAveVR(1) 其中 V R V_R VR 表示房间体积立方英寸 S R S_R SR 表示房间表面积平方英寸 A R A v e A_{R A v e} ARAve 表示平均吸收系数
不同的材料有着不同的吸收系数例如墙面、瓷砖、沙发、床等都有着不同吸收系数你需要单独计算这些物品的面积加权求平均得到平均吸收系数。
几乎所有的混响插件都会有混响时间的参数控制我们在分析各类算法时重要的一点是知道哪些参数控制这混响时间。
3.3 Schroeder 混响算法
现在让我们回到 1960s跟着 Schroeder 的论文来窥探当时是如何创造出第一个混响算法的相关论文有两篇
“Colorless” Artificial Reverberation - 1961Natural Sounding Artificial Reverberation - 1962
3.3.1 梳妆滤波Comb Filter混响器
作者首先想 “咦这个混响不就是声音在空间中不断的碰撞产生很多回声的过程吗那我搞一个系统让它产生很多很多回声就可以了”于是乎作者发明了第一个混响器梳妆滤波混响器。浅浅地用公式描述下推导过程。假定 h ( t ) h(t) h(t) 是这个系统的单位冲击响应如果只有一个回声的情况那么 h ( t ) δ ( t − τ ) h(t) \delta(t - \tau) h(t)δ(t−τ) 其中 δ ( t ) \delta(t) δ(t) 为狄拉克函数即理想的冲击信号 τ \tau τ 为回声的延迟时间。 h ( t ) h(t) h(t) 的频谱长啥样呢我们对它做傅里叶变换得到 H ( ω ) ∫ − ∞ ∞ h ( t ) e − i ω t d t e − i ω τ H(\omega)\int_{-\infty}^{\infty} h(t) e^{-i \omega t}d t e^{-i\omega\tau} H(ω)∫−∞∞h(t)e−iωtdte−iωτ
那么多个回声且回声音量以指数函数衰减的 h ( t ) h(t) h(t) 为 h ( t ) δ ( t − τ ) g δ ( t − 2 τ ) g 2 δ ( t − 3 τ ) ⋯ h(t)\delta(t-\tau)g \delta(t-2 \tau)g^{2} \delta(t-3 \tau)\cdots h(t)δ(t−τ)gδ(t−2τ)g2δ(t−3τ)⋯ 其中 g g g 表示衰减系数对上述的 h ( t ) h(t) h(t) 做傅里叶变换得到 H ( ω ) e − i ω τ g e − 2 i ω τ g 2 e − 3 i ω τ ⋯ H(\omega)e^{-i \omega \tau}g e^{-2 i \omega \tau}g^{2} e^{-3 i \omega \tau}\cdots H(ω)e−iωτge−2iωτg2e−3iωτ⋯ 简易起见我们令 a e − i ω τ a e^{-i \omega \tau} ae−iωτ那么 H ( ω ) a g a 2 g 2 a 3 ⋯ g H ( ω ) g a g 2 a 2 g 3 a 3 ⋯ \begin{aligned} H(\omega) a ga^2 g^2a^3 \cdots \\ gH(\omega) ga g^2a^2 g^3a^3 \cdots \\ \end{aligned} H(ω)gH(ω)aga2g2a3⋯gag2a2g3a3⋯ 你看 g H ( ω ) gH(\omega) gH(ω) 是一个等比数列我们用等比数列求和公式对 g H ( ω ) gH(\omega) gH(ω) 求和可得 g H ( ω ) g a 1 − g a gH(\omega) \frac{ga}{1-ga} gH(ω)1−gaga 最后两边除以 g g g 得 H ( ω ) a 1 − g a e − i ω τ 1 − g e − i ω τ (2) H(\omega) \frac{a}{1-ga} \frac{e^{-i \omega \tau}}{1-ge^{-i \omega \tau}} \tag{2} H(ω)1−gaa1−ge−iωτe−iωτ(2) H ( ω ) H(\omega) H(ω) 就是该系统的传递函数我们计算它的频谱响应来观察该系统对频率的影响 ∣ H ( ω ) ∣ 2 ∣ e − i ω τ ∣ 2 ∣ 1 − g e − i ω τ ∣ 2 ∣ cos ( ω τ ) − i sin ( ω τ ) ∣ 2 ∣ 1 − g ( cos ( ω τ ) − i sin ( ω τ ) ) ∣ 2 1 1 g 2 − 2 g cos ω τ . \begin{aligned} |H(\omega)|^{2} \frac{|e^{-i \omega \tau}|^2}{|1-ge^{-i \omega \tau}|^2} \\ \frac{|\cos(\omega \tau) -i\sin(\omega\tau)|^2}{|1 - g(\cos(\omega\tau) -i\sin(\omega\tau))|^2} \\ \frac{1}{1g^{2}-2 g \cos \omega \tau} .\\ \end{aligned} ∣H(ω)∣2∣1−ge−iωτ∣2∣e−iωτ∣2∣1−g(cos(ωτ)−isin(ωτ))∣2∣cos(ωτ)−isin(ωτ)∣21g2−2gcosωτ1.
当 ω 2 n π / τ \omega2 n \pi / \tau ω2nπ/τ 时 ∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2 有最大值 H max 1 1 − g H_{\max }\frac{1}{1-g} Hmax1−g1 当 ω ( 2 n 1 ) π / τ \omega(2n1) \pi / \tau ω(2n1)π/τ 时 ∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2 有最小值 H min 1 1 g H_{\min }\frac{1}{1g} Hmin1g1 ∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2整体呈现一种周期性像是梳子一样因此名为 “梳妆滤波器”画图的话长这样 那么在具体代码中如何实现梳妆滤波混响器呢我们现在从公式2中知道了转换函数Z变换的逆变换令 z e i ω ze^{i\omega} zeiω 有 H ( z ) Y ( z ) X ( z ) z − τ 1 − g z − τ Y ( z ) − g z − τ Y ( z ) X ( z ) z − τ y ( t ) x ( t − τ ) g y ( t − τ ) \begin{aligned} H(z) \frac{Y(z)}{X(z)} \frac{z^{-\tau}}{1-g z^{-\tau}} \\ \\ Y(z) - g z^{-\tau}Y(z) X(z)z^{-\tau} \\ \\ y(t) x(t - \tau) g y(t -\tau) \end{aligned} H(z)X(z)Y(z)1−gz−τz−τY(z)−gz−τY(z)X(z)z−τy(t)x(t−τ)gy(t−τ)
根据 y ( t ) y(t) y(t) 就能很容易得到块状图了
3.3.2 全通滤波All-Pass FilterAPF混响器
Schroeder 还发明了全通滤波All-Pass FilterAPF混响器它不会对频率产生任何影响其频谱响应是一条笔直的线。它的冲击响应信号为 h ( t ) − g δ ( t ) ( 1 − g 2 ) ⋅ [ δ ( t − τ ) g δ ( t − 2 τ ) ⋯ ] \begin{aligned} h(t)-g \delta(t)\left(1-g^{2}\right) \\ \cdot[\delta(t-\tau)g \delta(t-2 \tau)\cdots] \end{aligned} h(t)−gδ(t)(1−g2)⋅[δ(t−τ)gδ(t−2τ)⋯] 对 h ( t ) h(t) h(t) 做傅里叶变换得 H ( ω ) e − i ω τ − g 1 − g e − i ω τ H(\omega)\frac{e^{-i \omega \tau}-g}{1-g e^{-i \omega \tau}} H(ω)1−ge−iωτe−iωτ−g
对 H ( ω ) H(\omega) H(ω) 求频谱响应可以发现它居然神奇的等于 1即 ∣ H ( ω ) ∣ 2 1 |H(\omega)|^2 1 ∣H(ω)∣21。
与梳妆滤波器类似我们通过 z 变换的逆变换得到 y ( t ) y(t) y(t) 的差分方程为 y ( t ) − g x ( t ) x ( t − τ ) g y ( t − τ ) y(t) -gx(t) x(t - \tau) gy(t - \tau) y(t)−gx(t)x(t−τ)gy(t−τ) y ( t ) y(t) y(t)的一种块状图实现方案为 其中 D τ ∗ s r D \tau * sr Dτ∗sr s r sr sr 为采样率。
Schroeder 混响算法
现在我们有了制造回声的梳妆滤波混响器和全通滤波混响器那么我们应该如何安排这些混响器以制造更加真实的混响效果呢
首先我们考虑一个问题我们到底要制造多少回声是每秒1000 个还是每秒10000 个为了回答这个问题先定义一个叫 “回声密度” 概念即每秒有几个回声Schroeder 认为每秒至少需要 1000 个回声为了得到高密度的回声他将 4 个 Comb Filter 先并列起来且每个 Comb Filter 的延迟 D D D 是不同的 为了更模拟更真实的混响Kahrs 提出了一种根据 RT60 设置 Comb Filter 中 g 的值即 R T 60 3 D T s log ( 1 / g ) 1 / g 1 0 3 D T s R T 60 g 1 0 − 3 D T s R T 60 (3) \begin{aligned} R T_{60}\frac{3 D T_{s}}{\log (1 / g)} \\ 1 / g10^{\frac{3 D T_{s}}{R T_{60}}} \\ g10^{\frac{-3 D T_{s}}{R T_{60}}} \\ \end{aligned} \tag{3} RT60log(1/g)3DTs1/g10RT603DTsg10RT60−3DTs(3) 其中 T s T_s Ts 为采样率根据 Comb Filter 的 D 和 RT60 的值我们就能算出 g 的值。
我们利用公式3对 4 个并行的 Comb Filter 设置不同的 g此外每隔一个 comb filter对结果乘上 -1 这样就能得到有正有负的回声这样真实多了
Schroeder 混响算法最终的结构如下图有 4 个 Comb Filter 后接 2 个 All-pass Filter。前面四个 Comb Filter 就像在做加法叠加回声的数量后面的 All-pass Filter 就像在做乘法进一步增加回声的数量。 其中Comb Filter 有以下特性
选择延迟时间的比例为1:1.5。选择没有公因数或除数的延迟时间。例如 31、37、41 等根据公式3设置 g 值
All-Pass Filter 具有以下特性。
选择比梳状滤波器短得多的延时。1mSec到5mSec。设置两个增益值相同0.5和0.707之间。
Schroeder 混响算法非常简单但效果也还不错以现在的视角来看它有很多可以改进的点包括
增加更多的平行的 Comb Filter。增加预梳理APF两个在 APF 的输入端两个 APF 在输出端。将两个 APF 改为嵌套形式的 APF增加一个预延时模块
总之Schroeder 第一次提出了对混响算法的实现方案开启了人们对混响算法的更多研究后续很多知名的混响算法都是基于 Schroeder 结构进行的改进例如 Freeverb 它算法的主要实现逻辑代码如下就是 Comb Filter APF 的组合
void revmodel::processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip)
{float outL,outR,input;int i;while(numsamples-- 0){outL outR 0;input (*inputL *inputR) * gain;// Accumulate comb filters in parallelfor(i0; inumcombs; i) {outL combL[i].process(input);outR combR[i].process(input);}// Feed through allpasses in seriesfor(i0; inumallpasses; i) {outL allpassL[i].process(outL);outR allpassR[i].process(outR);}// Calculate output REPLACING anything already there*outputL outL*wet1 outR*wet2 *inputL*dry;*outputR outR*wet1 outL*wet2 *inputR*dry;// Increment sample pointers, allowing for interleave // (if any)inputL skip; // For stereo buffers, skip 2inputR skip;outputL skip;outputR skip;}
}下面的视频是 freeverb 的算法效果展示 freeverb_video 总结
这篇文章中我们介绍了混响的声学现象以及数字混响的需求背景重点介绍了 Schroeder 混响算法的实现。
参考
声学测量里RT60里的指标含义是什么Natural Sounding Artificial Reverberation - 1962“Colorless” Artificial Reverberation - 1961如何理解离散傅里叶变换及Z变换Freeverb