參考
"On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk"
"Multidelay Block Frequency Domain Adaptive Filter"
"Echo Canceler with Two Echo Path Models "
注:由于包含很多LaTeX公式凌彬,可能需要多次刷新或者使用google瀏覽器
大綱
包括小節(jié):1 信號(hào)模型弯淘、2 迭代公式推導(dǎo)、3 最優(yōu)學(xué)習(xí)率寇荧、4 量的估計(jì)刽脖、5 雙講分析羞海、6 代碼解析
speexdsp AEC 的三個(gè)主要設(shè)計(jì):
1)Multi-delay frequency domain adaptive filter,好處是:a)用來進(jìn)行低延遲自適應(yīng)曲管,b)可以為每個(gè)頻點(diǎn)單獨(dú)使用學(xué)習(xí)率
2)Two path model却邓,好處是:a)雙濾波器切換,避免雙講時(shí)發(fā)散
3)Optimal learning rate under noise:a)噪聲環(huán)境下能更好地控制學(xué)習(xí)率院水,b)避免雙講發(fā)散腊徙,對(duì)近端語音快速響應(yīng)
下面對(duì)“On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk”這篇論文(也就是上面的第三點(diǎn))進(jìn)行解析,并挑一些代碼中的技術(shù)點(diǎn)進(jìn)行梳理檬某。
噪聲環(huán)境下最優(yōu)NLMS學(xué)習(xí)率
1 信號(hào)模型
則撬腾,系統(tǒng)的誤差公式如下:
基于 NLMS 的迭代公式如下:
代入(1)式有:
記為第
次迭代后,濾波器權(quán)重第
個(gè)系數(shù)的估計(jì)誤差恢恼;并且民傻,對(duì)于理想濾波器有:
。
將的表達(dá)式代入(3)式中,并考慮到理想濾波器系數(shù)(聲學(xué)路徑)并不隨著時(shí)間發(fā)生較大變化饰潜,可以認(rèn)為
,得到:
接著定義在第 n 次迭代時(shí)和簸,濾波器失配度:
2 濾波器失配度的迭代公式推導(dǎo)
由失配度的定義和迭代公式(4)可得彭雾,在第 n+1 次迭代時(shí),濾波器的失配度為:
若我們作一個(gè)強(qiáng)假設(shè):遠(yuǎn)端信號(hào)和 近端語音
是互不相關(guān)的白噪聲锁保,假設(shè)給定
的條件下
的條件分布為
薯酝,則對(duì)
關(guān)于分布
求期望得:
其中:是近端語音信號(hào)得方差?
。
我們需要對(duì)(6)式做一些推導(dǎo):(為了簡(jiǎn)潔爽柒,將時(shí)間 n 略去)
先直接對(duì)絕對(duì)值的平方進(jìn)行展開:
其中:顯然就是時(shí)刻 n 的濾波器失配度
吴菠,
中有關(guān)
的一次項(xiàng)式的部分,在其取期望后為 0浩村,即:
余下的部分做葵,重新整理得:
再一次,在上式中心墅,對(duì)
得一次項(xiàng)取期望后為 0酿矢;
再對(duì)上式中子式進(jìn)行處理,其分子如下化簡(jiǎn):
其中 “交叉項(xiàng)” 為 0怎燥,因?yàn)榧僭O(shè)(遠(yuǎn)端)語音是白噪瘫筐,因此不相關(guān);為遠(yuǎn)端語音信號(hào)得方差铐姚。
再對(duì)中的分母改寫為:
又策肝,全部代入
子式得:
同理,對(duì)子式使用同樣得處理可得:
提取公因子隐绵,就得到了論文中的公式(6)之众。
3 最優(yōu)學(xué)習(xí)率
接下來,我們尋找在新的一輪迭代中依许,使得 濾波器失配度達(dá)到最小的學(xué)習(xí)率酝枢;由于上式
是一個(gè)關(guān)于學(xué)習(xí)率
的二次函數(shù),因而容易得到最小值點(diǎn)悍手,求導(dǎo)并令其為 0 得:
解方程得:
Observation:當(dāng)沒有近端語音時(shí)帘睦,即,此時(shí)(8)式退化成 NLMS 對(duì)應(yīng)的學(xué)習(xí)率坦康。
雖然我們得到了噪聲環(huán)境中的最優(yōu)學(xué)習(xí)率(8)式竣付,但是其中的失配度無法計(jì)算,因此我們需要進(jìn)一步將其變?yōu)榭晒烙?jì)的量滞欠。
3.1 得到可估計(jì)的學(xué)習(xí)率公式
繼續(xù)分析(8)式中的這一項(xiàng)古胆,其中左半邊
為濾波器的失配度,右半邊
顯然是遠(yuǎn)端信號(hào)能量的估計(jì);因此逸绎,這一整項(xiàng)似乎與 AEC 濾波后的遠(yuǎn)端信號(hào)殘留能量相關(guān)的某個(gè)量惹恃;下面我們證明,它的確就是遠(yuǎn)端信號(hào)的殘留能量的估計(jì)棺牧,推導(dǎo)過程如下:
其中:由語音是白噪聲這一假設(shè)可知 “交叉項(xiàng)” 為 0巫糙。
進(jìn)而有:
這里又用到了 殘差信號(hào) 與 遠(yuǎn)端殘留信號(hào) 的不相關(guān)性,得到總誤差的能量就等于 組成誤差的兩個(gè)分量的能量和
?颊乘。
結(jié)論:在以上的假設(shè)下参淹,理論上的最優(yōu)學(xué)習(xí)率?近似等于?殘留回聲 與 總誤差信號(hào) 的能量比。
在實(shí)際操作中乏悄,迭代第 n 步有:(其中分別是
在第 n 步得估計(jì))
4 量的估計(jì)
4.1 殘留回聲估計(jì)的上限
當(dāng)條件滿足時(shí)浙值,我就達(dá)到了統(tǒng)計(jì)意義上的收斂(此時(shí),濾波器在整體上達(dá)到了平穩(wěn)狀態(tài)檩小,但系數(shù)之間或有細(xì)微變化)开呐,在公式
中,令
规求,并用遠(yuǎn)端信號(hào)得方差
替代其估計(jì)
后负蚊,可解得:
因此,如果當(dāng)前濾波器失配度滿足上式(11)颓哮,則在統(tǒng)計(jì)意義下家妆,使用最優(yōu)學(xué)習(xí)率,將不再能改善濾波器失配度冕茅。最優(yōu)學(xué)習(xí)率為代入(11)式中伤极,考慮到誤差信號(hào)得方差
可以估計(jì)得很準(zhǔn)確,因此我們直接使用它得期望值代入姨伤,而殘留回聲方差
則用估計(jì)值
代入哨坪,即將
作為學(xué)習(xí)率代入(11)式得:
上式繼續(xù)整理,得到如下方程:
所以乍楚,殘差得 估計(jì)值 和 期望值 應(yīng)滿足:
因此当编,在達(dá)到平穩(wěn)后,殘留回聲的估計(jì)方差徒溪,不應(yīng)該大于 2 倍的真實(shí)方差忿偷,即不能高估這個(gè)方差超過 2 倍(3 dB)。
顯然臊泌,前面對(duì)近端語音和遠(yuǎn)端語音
的白噪聲假設(shè)是不合理的鲤桥;但是,我們可以到頻域進(jìn)行估計(jì)渠概,理由是:
a. 經(jīng)觀察茶凳,同一個(gè)頻點(diǎn)沿著時(shí)間軸上的相關(guān)性 比 時(shí)域數(shù)據(jù)的相關(guān)性要低嫂拴,這使得我們的假設(shè)在頻域更加可靠。
b. 在頻域贮喧,我們可以對(duì)每個(gè)頻點(diǎn)單獨(dú)計(jì)算最優(yōu)學(xué)習(xí)率:
4.2 殘留回聲的估計(jì)
a. 假設(shè)濾波器有一個(gè)和頻率無關(guān)的泄露系數(shù)筒狠,則可以通過下式來對(duì) 殘留回聲的方差 進(jìn)行估計(jì):
下面我們來證明(15)式的合理性, 顯然根據(jù)的白噪假設(shè)箱沦,有:
由前面關(guān)于殘留回聲功率的結(jié)論辩恼,并代入上式有:
在上式中,我們記饱普;我們注意到?
的分子和分母都是和濾波器權(quán)重的整體相關(guān)的一個(gè)值运挫,是關(guān)于 echo path 以及 echo path change 的一個(gè)量状共;而在實(shí)際中回聲路徑被認(rèn)為是緩慢變化的套耕,所以我們可以認(rèn)為?
是一個(gè)緩慢變化的量。而另一項(xiàng)
是語音的能量峡继,因而是變化迅速的冯袍。
該過程同樣也能說明頻域的學(xué)習(xí)率也能分成這兩個(gè)部分。
雖然在上式中對(duì)殘留回聲方差的估計(jì)碾牌,包含了不可計(jì)算的濾波器失配度康愤,但是從式子來看,
的確可是視為濾波器的 ERLE舶吗。并且作者給出了下圖征冷,說明
的倒數(shù) 與 ERLE近似程度。
使用上式來估計(jì)殘留回聲有兩個(gè)好處:
????????1)將殘留回聲的估計(jì)轉(zhuǎn)為對(duì)兩個(gè)量的估計(jì)誓琼,一個(gè)是變化緩慢 但不易估計(jì)的泄露系數(shù)检激,另一個(gè)是變化快速 但容易估計(jì)的回聲功率
。
????????2)在 double-talk 到來時(shí)腹侣,可以迅速做出反應(yīng):如下式的最優(yōu)學(xué)習(xí)率叔收,我們使用回聲的瞬時(shí)功率作為它的方差,同樣使用 誤差信號(hào)的瞬時(shí)功率
作為誤差信號(hào)的方差:
? ??????
????????如此,就將 學(xué)習(xí)率的自適應(yīng) 解耦成泄露系數(shù)?和 回聲功率與誤差功率之比 這兩部分,正是后者提供了對(duì) double-talk 的快速反應(yīng)能力硫眨。(而泄露系數(shù)需要較長(zhǎng)時(shí)間才能迭代到目標(biāo)值)
另外怎炊,系統(tǒng)初始化時(shí),濾波器系數(shù)為 0殿衰,所以?也是 0,因此最優(yōu)學(xué)習(xí)率總是 0;為了解決這個(gè)問題芝薇,考慮在初始化后使用固定的學(xué)習(xí)率(代碼中是0.25)進(jìn)行自適應(yīng)濾波,等到濾波器系數(shù)收斂到一定程度時(shí)作儿,再使用這里提出的自適應(yīng)學(xué)習(xí)率算法洛二。
4.3 泄露系數(shù)的估計(jì)
綜上,我們就將 殘留回聲方差估計(jì)的問題,轉(zhuǎn)為對(duì) 泄露系數(shù)的估計(jì)問題:
? ? 1)利用信號(hào)的非平穩(wěn)性
? ? 2)利用估計(jì)的回聲信號(hào) 和 誤差信號(hào) 之間的線性回歸值 來估計(jì)
? ? 3)基于的事實(shí)是:殘留的回聲 與 估計(jì)的回聲 是高度相關(guān)的晾嘶, 且估計(jì)的回聲 與 誤差信號(hào)中的噪聲 是無關(guān)的妓雾。
SpeexDSP 代碼中的計(jì)算過程:
? ? 1)先使用一階去 DC 濾波器 去除 估計(jì)的回聲功率 和 誤差功率譜 的 DC分量,得到 零均值的垒迂,代碼中使用遞歸平均來估計(jì)均值械姻,然后分別減去均值)
? ? 2)再使用下式計(jì)算平滑的相關(guān):
? ??
? ? 其中,是一個(gè)動(dòng)態(tài)的平滑系數(shù)机断,用于估計(jì)泄露系數(shù)楷拳,如下計(jì)算:
? ??,其中?
是一個(gè)基礎(chǔ)平滑系數(shù)
? ? 在 Speex 代碼中吏奸,和前面的學(xué)習(xí)率一樣欢揖,使用瞬時(shí)功率 代替估計(jì)式中的方差。
? ? 當(dāng)遠(yuǎn)端沒有信號(hào)時(shí)奋蔚,有 beta = 0她混, 所以?和
保持不變,即泄露系數(shù)保持不變泊碑,這樣到下一次遠(yuǎn)端有語音(回聲)過來時(shí)坤按,能有一個(gè)合理的初始值。
????3)最后將所有的頻點(diǎn)上的相關(guān)性加起來馒过,得到頻點(diǎn)無關(guān)的泄露系數(shù)的估計(jì):
? ??
5 雙講分析
分析前面的最優(yōu)學(xué)習(xí)率公式臭脓,可以發(fā)現(xiàn)該系統(tǒng)能夠處理 double-talk 場(chǎng)景:
????a. 當(dāng)近端語音突然出現(xiàn)時(shí), 公式(16)中的分母(瞬時(shí)功率)會(huì)陡然增大腹忽,從而使得學(xué)習(xí)率變得很欣蠢邸;這會(huì)持續(xù)到 double-talk 結(jié)束留凭;
? ? b. 假設(shè)近端沒有語音佃扼,但是有平穩(wěn)噪聲,則(16)中的分母保持不變蔼夜,此時(shí)學(xué)習(xí)率收到 回聲功率 和 泄露系數(shù)的影響:
? ? ? ? i)當(dāng)回聲功率增大時(shí)兼耀,學(xué)習(xí)率變大,使得收斂迅速求冷;
? ? ? ? ii)當(dāng)濾波器系數(shù)收斂時(shí)瘤运,泄露系數(shù)?變小,從而學(xué)習(xí)率變小匠题,使得收斂過程更平穩(wěn)拯坟;
? ? c. double-talk 時(shí),殘留回聲 與 誤差的相關(guān)性 很小韭山,從而保持學(xué)習(xí)率很小郁季,不會(huì)造成濾波器發(fā)散冷溃;
? ? d. Echo-path 發(fā)生變化時(shí),濾波器系數(shù)完全失效梦裂,殘留回聲 與 誤差有很大的相關(guān)性似枕,從而使得學(xué)習(xí)率 迅速達(dá)到 1,從而加快收斂年柠。
6 代碼解析
6.1 循環(huán)卷積到線性卷積
在代碼實(shí)現(xiàn)時(shí)凿歼,使用FFT計(jì)算卷積,會(huì)產(chǎn)生循環(huán)卷機(jī)效應(yīng)冗恨。為了看懂代碼答憔,非電子、信息掀抹、通信專業(yè)的工程師還是要搞清楚這一點(diǎn)虐拓,才能理解代碼,下面先來分析一下為什么出現(xiàn)循環(huán)卷積:
其中:為傅立葉變換渴丸,
為某一幀數(shù)據(jù)侯嘀,
為該時(shí)刻的濾波器權(quán)重另凌。
期望使用卷積定理的等價(jià)形式來計(jì)算時(shí)域卷積運(yùn)算(可參考任一本dsp方面的書籍)谱轨,對(duì)于離散傅立葉變換的特殊情況,我們將其展開:
其中等比數(shù)列計(jì)算為:
因此吠谢,只有當(dāng)時(shí)土童,才包含有效的計(jì)算,上
式為:
工坊,這是一個(gè)循環(huán)卷積献汗!見下面簡(jiǎn)單示例:
例如:當(dāng)時(shí),我們計(jì)算
的值有
王污,如下圖所示
與
的對(duì)齊情況:
這是一個(gè)非因果運(yùn)算罢吃,顯然我們的濾波器不允許這種情況發(fā)生,為了避免循環(huán)卷積昭齐,可以拼接前后兩幀數(shù)據(jù)尿招,并將權(quán)重的后半段置為 0 即可,多出來的 0 將不會(huì)產(chǎn)生有效的計(jì)算阱驾,如下圖所示就谜,產(chǎn)生的過程:
注意:利用計(jì)算卷積,實(shí)際上的計(jì)算過程永遠(yuǎn)都是循環(huán)卷積里覆,只不過在這里丧荐,我們通過將權(quán)重的后半段強(qiáng)行置 0 后,只有后半段的
在進(jìn)行有效的計(jì)算喧枷,而此時(shí)得到的結(jié)果恰好就是線性卷積的結(jié)果虹统。
(TODO)