網(wǎng)站設(shè)計(jì)公司 北京點(diǎn)擊器
系列文章目錄
- Delay Line 簡介及其 C/C++ 實(shí)現(xiàn)
- LFO 低頻振蕩器簡介及其 C/C++ 實(shí)現(xiàn)
- 【音效處理】Delay/Echo 簡介
- 【音效處理】Vibrato 簡介
文章目錄
- 系列文章目錄
- 一、混響
- 二、人工混響
- 三、數(shù)字混響算法
- 3.1 混響的脈沖響應(yīng)信號(hào)
- 3.2 RT60
- 3.3 Schroeder 混響算法
- 3.3.1 梳妝濾波(Comb Filter)混響器
- 3.3.2 全通濾波(All-Pass Filter,APF)混響器
- Schroeder 混響算法
- 總結(jié)
- 參考
一、混響
混響是一種自然發(fā)生的聲學(xué)現(xiàn)象。在房間中放置一個(gè)揚(yáng)聲器用于發(fā)聲,放置一個(gè)麥克風(fēng)用于收集聲音。當(dāng)聲音與墻壁或者其他材料相遇時(shí),聲音發(fā)生反射,因此麥克風(fēng)收集到的信號(hào),除了揚(yáng)聲器到麥克風(fēng)的徑直路徑外,還有很多其他方式到達(dá)的聲音,如下圖所示。
由于聲波的傳播距離稍長,反射的聲波到達(dá)我們耳朵的時(shí)間會(huì)比直達(dá)的聲波晚一點(diǎn)。聲波的振幅會(huì)弱一點(diǎn),因?yàn)閴γ鏁?huì)吸收一些聲音的能量。根據(jù)房間的大小,時(shí)間和振幅的差異是不同的。這就是為什么我們可以在音樂廳里比在客廳里更容易分辨出反射效果。
在一個(gè)足夠大的房間里,反射會(huì)重復(fù)許多次,然后一系列延遲和衰減的聲波,這被稱為回聲,到達(dá)我們的耳朵。這就是我們?nèi)绾胃惺艿揭粋€(gè)房間的“空間感”
二、人工混響
對人工混響的需求首先出現(xiàn)在錄音廣播和音樂背景下,在錄音室錄制的聲音往往過于 “干” 了,缺乏音樂表演所需的音樂廳聲學(xué)效果。早在 20 世紀(jì) 20 年代,混響是通過將 “干” 的錄音室信號(hào)發(fā)送到一個(gè)混響環(huán)境中,通常是一個(gè)專門建造的回音室,來人為地制造混響。人們在浴室唱歌時(shí)會(huì)感覺更有效果,浴室、衛(wèi)生間等可以認(rèn)為就是一種回音室。
雖然回音室可以產(chǎn)生高質(zhì)量的混響,但它們的物理性質(zhì)通常限制了它們在錄音室和廣播場合的使用。它們通常很難甚至不可能運(yùn)輸,對外部的聲學(xué)或機(jī)械干擾很敏感,并且需要專門的知識(shí)來維護(hù)和調(diào)音。相比之下,由計(jì)算過程產(chǎn)生的人工混響具有便利性、便攜性和可重復(fù)性,并允許自動(dòng)化(記錄、編輯和回放混響器控制參數(shù)隨時(shí)間變化的情況)。這促使人們研究數(shù)字合成高質(zhì)量混響的方法。
三、數(shù)字混響算法
由于數(shù)字處理設(shè)備和計(jì)算機(jī)技術(shù)的發(fā)展,人們能夠完成復(fù)雜的模擬,找到自然產(chǎn)生混響的數(shù)字解決方案。這個(gè)混響問題的最早的數(shù)字解決方案是由貝爾電話實(shí)驗(yàn)室的Manfred Schroeder在1961年建立的(Schroeder)。這個(gè)解決方案被稱為 Schroeder 的混響器,它是本文的重點(diǎn),將在下面的章節(jié)中詳細(xì)說明。
3.1 混響的脈沖響應(yīng)信號(hào)
為了研究混響器的工作原理,我們首先要了解聲音在房間中的發(fā)射性質(zhì)。
上圖是某個(gè)房間的脈沖響應(yīng)信號(hào),從圖中可以觀察到:
- 直達(dá)聲以直線路徑傳播,是第一個(gè)到達(dá)聽眾耳朵的聲波。
- 離散的早期反射在直達(dá)聲到達(dá)后 80ms 內(nèi)進(jìn)入聽眾耳朵。
- 接下來的后期混響包含了成千上萬的緊密間隔的回聲,但需要超過80毫秒的時(shí)間來建立,然后逐漸消失。
下圖是兩個(gè)真實(shí)環(huán)境的脈沖響應(yīng):
總的來說,reverb 信號(hào)可以分為三個(gè)部分:pre-delay、early reflections 和 late reverberation,因此一種可行 reverb 模型為:
3.2 RT60
不同的空間、場所有著不同的混響,如何區(qū)分混響的不同呢?有一個(gè)重要的指標(biāo):混響時(shí)間(Reverberation Time),也叫 RT60,具體的定義是指聲場衰減 60 dB 所用的時(shí)間,單位為「秒」。通俗的說就是,你在一個(gè)房間里,“啊”的大叫了一聲,這一聲“啊”的分貝衰減了 60db 所花費(fèi)的時(shí)間。
有些研究給出了 RT60 估計(jì)模型,例如在公式【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} RT60?=0.5SR?ARAve?VR??(1)
其中
- V R V_R VR? 表示房間體積(立方英寸)
- S R S_R SR? 表示房間表面積(平方英寸)
- A R A v e A_{R A v e} ARAve? 表示平均吸收系數(shù)
不同的材料有著不同的吸收系數(shù),例如墻面、瓷磚、沙發(fā)、床等都有著不同吸收系數(shù),你需要單獨(dú)計(jì)算這些物品的面積,加權(quán)求平均得到平均吸收系數(shù)。
幾乎所有的混響插件都會(huì)有混響時(shí)間的參數(shù)控制,我們在分析各類算法時(shí),重要的一點(diǎn)是知道哪些參數(shù)控制這混響時(shí)間。
3.3 Schroeder 混響算法
現(xiàn)在讓我們回到 1960s,跟著 Schroeder 的論文來窺探當(dāng)時(shí)是如何創(chuàng)造出第一個(gè)混響算法的,相關(guān)論文有兩篇:
- “Colorless” Artificial Reverberation - 1961
- Natural Sounding Artificial Reverberation - 1962
3.3.1 梳妝濾波(Comb Filter)混響器
作者首先想 “咦,這個(gè)混響不就是聲音在空間中不斷的碰撞,產(chǎn)生很多回聲的過程嗎?那我搞一個(gè)系統(tǒng)讓它產(chǎn)生很多很多回聲就可以了”,于是乎,作者發(fā)明了第一個(gè)混響器:梳妝濾波混響器。淺淺地用公式描述下推導(dǎo)過程。假定 h ( t ) h(t) h(t) 是這個(gè)系統(tǒng)的單位沖擊響應(yīng),如果只有一個(gè)回聲的情況,那么:
h ( t ) = δ ( t ? τ ) h(t) = \delta(t - \tau) h(t)=δ(t?τ)
其中 δ ( t ) \delta(t) δ(t) 為狄拉克函數(shù)(即理想的沖擊信號(hào)), τ \tau τ 為回聲的延遲時(shí)間。 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ωtdt=e?iωτ
那么多個(gè)回聲,且回聲音量以指數(shù)函數(shù)衰減的 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 表示衰減系數(shù),對上述的 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} a=e?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(ω)?=a+ga2+g2a3+?=ga+g2a2+g3a3+??
你看, g H ( ω ) gH(\omega) gH(ω) 是一個(gè)等比數(shù)列,我們用等比數(shù)列求和公式對 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?gaa?=1?ge?iωτe?iωτ?(2)
H ( ω ) H(\omega) H(ω) 就是該系統(tǒng)的傳遞函數(shù),我們計(jì)算它的頻譜響應(yīng)來觀察該系統(tǒng)對頻率的影響:
∣ 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}{1+g^{2}-2 g \cos \omega \tau} .\\ \end{aligned} ∣H(ω)∣2?=∣1?ge?iωτ∣2∣e?iωτ∣2?=∣1?g(cos(ωτ)?isin(ωτ))∣2∣cos(ωτ)?isin(ωτ)∣2?=1+g2?2gcosωτ1?.?
當(dāng) ω = 2 n π / τ \omega=2 n \pi / \tau ω=2nπ/τ 時(shí), ∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2 有最大值:
H max ? = 1 1 ? g H_{\max }=\frac{1}{1-g} Hmax?=1?g1?
當(dāng) ω = ( 2 n + 1 ) π / τ \omega=(2n+1) \pi / \tau ω=(2n+1)π/τ 時(shí), ∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2 有最小值:
H min ? = 1 1 + g H_{\min }=\frac{1}{1+g} Hmin?=1+g1?
∣ H ( ω ) ∣ 2 |H(\omega)|^{2} ∣H(ω)∣2整體呈現(xiàn)一種周期性,像是梳子一樣,因此名為 “梳妝濾波器”,畫圖的話長這樣:
那么在具體代碼中如何實(shí)現(xiàn)梳妝濾波混響器呢?我們現(xiàn)在從公式(2)中知道了轉(zhuǎn)換函數(shù),Z變換的逆變換,令 z = e i ω z=e^{i\omega} z=eiω 有:
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?τ)?
根據(jù) y ( t ) y(t) y(t) 就能很容易得到塊狀圖了:
3.3.2 全通濾波(All-Pass Filter,APF)混響器
Schroeder 還發(fā)明了全通濾波(All-Pass Filter,APF)混響器,它不會(huì)對頻率產(chǎn)生任何影響,其頻譜響應(yīng)是一條筆直的線。它的沖擊響應(yīng)信號(hào)為:
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(ω) 求頻譜響應(yīng)可以發(fā)現(xiàn)它居然神奇的等于 1,即 ∣ H ( ω ) ∣ 2 = 1 |H(\omega)|^2 = 1 ∣H(ω)∣2=1。
與梳妝濾波器類似,我們通過 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)的一種塊狀圖實(shí)現(xiàn)方案為:
其中 D = τ ? s r D = \tau * sr D=τ?sr, s r sr sr 為采樣率。
Schroeder 混響算法
現(xiàn)在我們有了制造回聲的梳妝濾波混響器和全通濾波混響器,那么我們應(yīng)該如何安排這些混響器以制造更加真實(shí)的混響效果呢?
首先,我們考慮一個(gè)問題:我們到底要制造多少回聲?是每秒1000 個(gè)?還是每秒10000 個(gè)?為了回答這個(gè)問題,先定義一個(gè)叫 “回聲密度” 概念,即每秒有幾個(gè)回聲,Schroeder 認(rèn)為每秒至少需要 1000 個(gè)回聲,為了得到高密度的回聲,他將 4 個(gè) Comb Filter 先并列起來,且每個(gè) Comb Filter 的延遲 D D D 是不同的:
為了更模擬更真實(shí)的混響,Kahrs 提出了一種根據(jù) RT60 設(shè)置 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 / g=10^{\frac{3 D T_{s}}{R T_{60}}} \\ g=10^{\frac{-3 D T_{s}}{R T_{60}}} \\ \end{aligned} \tag{3} RT60?=log(1/g)3DTs??1/g=10RT60?3DTs??g=10RT60??3DTs???(3)
其中 T s T_s Ts? 為采樣率,根據(jù) Comb Filter 的 D 和 RT60 的值,我們就能算出 g 的值。
我們利用公式(3)對 4 個(gè)并行的 Comb Filter 設(shè)置不同的 g,此外每隔一個(gè) comb filter,對結(jié)果乘上 -1 這樣就能得到有正有負(fù)的回聲,這樣真實(shí)多了:
Schroeder 混響算法最終的結(jié)構(gòu)如下圖,有 4 個(gè) Comb Filter 后接 2 個(gè) All-pass Filter。前面四個(gè) Comb Filter 就像在做加法,疊加回聲的數(shù)量,后面的 All-pass Filter 就像在做乘法,進(jìn)一步增加回聲的數(shù)量。
其中,Comb Filter 有以下特性:
- 選擇延遲時(shí)間的比例為1:1.5。
- 選擇沒有公因數(shù)或除數(shù)的延遲時(shí)間。例如 31、37、41 等
- 根據(jù)公式(3)設(shè)置 g 值
All-Pass Filter 具有以下特性。
- 選擇比梳狀濾波器短得多的延時(shí)。1mSec到5mSec。
- 設(shè)置兩個(gè)增益值相同:0.5和0.707之間。
Schroeder 混響算法非常簡單,但效果也還不錯(cuò),以現(xiàn)在的視角來看它有很多可以改進(jìn)的點(diǎn),包括:
- 增加更多的平行的 Comb Filter。
- 增加預(yù)梳理APF(兩個(gè)在 APF 的輸入端,兩個(gè) APF 在輸出端)。
- 將兩個(gè) APF 改為嵌套形式的 APF
- 增加一個(gè)預(yù)延時(shí)模塊
總之,Schroeder 第一次提出了對混響算法的實(shí)現(xiàn)方案,開啟了人們對混響算法的更多研究,后續(xù)很多知名的混響算法都是基于 Schroeder 結(jié)構(gòu)進(jìn)行的改進(jìn),例如 Freeverb 它算法的主要實(shí)現(xiàn)邏輯代碼如下,就是 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(i=0; i<numcombs; i++) {outL += combL[i].process(input);outR += combR[i].process(input);}// Feed through allpasses in seriesfor(i=0; i<numallpasses; 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
總結(jié)
這篇文章中,我們介紹了混響的聲學(xué)現(xiàn)象,以及數(shù)字混響的需求背景,重點(diǎn)介紹了 Schroeder 混響算法的實(shí)現(xiàn)。
參考
- 聲學(xué)測量里RT60里的指標(biāo)含義是什么?
- Natural Sounding Artificial Reverberation - 1962
- “Colorless” Artificial Reverberation - 1961
- 如何理解離散傅里葉變換及Z變換
- Freeverb