一、回聲消除算法模型
先來分析下自適應回聲消除的主要組成部分,大體上可以把回聲消除模型分為兩個部分
- 橫向濾波器結構
- 濾波器系數自適應與步長控制
橫向濾波器用脈沖響應w(n)【有的地方也稱為回聲路徑】與遠端說話者信號u(n)卷積得到回聲估計,並用y(n)表示該估計。麥克風輸出信號做為期望響應d(n),從期望響應d(n)中減去濾波器的”合成回聲”,得到誤差信號e(n)。通過不斷的調整濾波器系數w(n)使誤差信號的均方值最小化,其結果就是:誤差信號為本地語音提供了一個近似的估計。這就是為什么這樣的結構能去掉回聲的原因。
二、LMS算法最優步長分析
下面我們重點說一下LMS濾波器系數自適應更新中的步長控制問題,也就是如何獲得最優步長的問題。我們首先把期望響應用向量的形式表示如下:
\[d(n) = {w^H}u(n) + v(n)\]
上式中,w是橫向濾波器的未知參數向量,v(n)為加性干擾噪聲。通過LMS濾波器計算得到的抽頭權向量是對w的估計,它們之間的失配用加權誤差向量
\[\varepsilon (n + 1) = w - \hat w(n)\]
來衡量,由橫向濾波器系數的的自適應更新機制
\[\hat w(n + 1) = \hat w(n) + \mu u(n)e(n)\]
可得
\[\varepsilon (n + 1) = \varepsilon (n) - \mu u(n)e(n)\]
如果我們對抽頭權向量n次迭代到n+1次迭代的抽頭權向量的增量變化最小為准則來選擇最優步長,即使
\[E\{ |\varepsilon (n + 1){|^2}\} - E\{ |\varepsilon (n){|^2}\} \]
達到最小,為求最優步長,將其展開,得到
\[E\{ |\varepsilon (n + 1){|^2}\} - E\{ |\varepsilon (n){|^2}\} = {\mu ^2}E\{ {e^2}(n)|u(n){|^2}\} - 2\mu E\{ e(n){\varepsilon ^T}(n)u(n)\} \]
設額外誤差向量(有的地方也稱為無干擾誤差,即假設沒有噪聲情況下的系數輸出誤差)與濾波器權值誤差向量之間的關系為
\[\xi (n) = {\varepsilon ^T}(n)u(n)\]
則
\[E\{ |\varepsilon (n + 1){|^2}\} - E\{ |\varepsilon (n){|^2}\} = {\mu ^2}E\{ {e^2}(n)|u(n){|^2}\} - 2\mu E\{ e(n)\xi (n)\} \]
對上式兩邊求導,並置導數為0,很容易就可以得到最優步長為
\[{\mu _{opt}}(n) = \frac{{E\{ e(n)\xi (n)\} }}{{E\{ {e^2}(n)|u(n){|^2}\} }}\]
又因為額外誤差可以視為系統輸出誤差與加性干擾噪聲之差
\[\xi (n) = e(n) - v(n)\]
再假設加性干擾噪聲信號與額外誤差信號相關獨立,則最優步長可以寫為
\[{\mu _{opt}}(n) \approx \frac{{E\{ e(n)\xi (n)\} }}{{|u(n){|^2}E\{ {e^2}(n)\} }} = \frac{{E\{ {e^2}(n)\} - E\{ {v^2}(n)\} }}{{|u(n){|^2}E\{ {e^2}(n)\} }}\]
可以看出,當噪聲信號不存在時,LMS算法的最優步長等於固定步長的NLMS算法
三、NLMS算法最優步長分析
下面再分析下NLMS濾波器的最優步長,NLMS橫向濾波器系數的的自適應更新機制為
\[w(n + 1) = w(n) + \frac{\mu }{{|u(n){|^2}}}u(n)e(n)\]
兩邊減去w,整理可得
\[\varepsilon (n + 1) = \varepsilon (n) - \frac{\mu }{{|u(n){|^2}}}u(n)e(n)\]
我們同樣對抽頭權向量n次迭代到n+1次迭代的抽頭權向量的增量變化最小為准則來選擇最優步長,即使
\[E\{ |\varepsilon (n + 1){|^2}\} - E\{ |\varepsilon (n){|^2}\} = {\mu ^2}E\left\{ {\frac{{|e(n){|^2}}}{{|u(n){|^2}}}} \right\} - 2\mu E\left\{ {\frac{{e(n)\xi (n)}}{{|u(n){|^2}}}} \right\}\]
最小,按上面分析LMS濾波器時的思路進行求導並整理,最終得到NLMS的最優步長為
\[{\mu _{opt}} = \frac{{E\{ e(n)\xi (n)/|u(n){|^2}\} }}{{E\{ |e(n){|^2}/|u(n){|^2}\} }}\]
為了簡化最優步長的計算,我們假設從一次迭代到下一次迭代的輸入信號能量的波動足夠小,以滿足以下近似
\[E\{ e(n)\xi (n)/|u(n){|^2}\} = E\{ e(n)\xi (n)\} /E\{ |u(n){|^2}\} \]
和
\[E\{ |e(n){|^2}/|u(n){|^2}\} = E\{ |e(n){|^2}\} /E\{ |u(n){|^2}\} \]
則最優步長可以重寫為
\[{\mu _{opt}} = \frac{{E\{ e(n)\xi (n)\} }}{{E\{ |e(n){|^2}\} }}\]
又因為加性干擾噪聲信號與額外誤差信號相關獨立,再次重寫最優步長
\[{\mu _{opt}} = \frac{{E\{ e(n)\xi (n)\} }}{{E\{ |e(n){|^2}\} }} = \frac{{E\{ [\xi (n) + v(n)]\xi (n)\} }}{{E\{ |e(n){|^2}\} }} = \frac{{E\{ |\xi (n){|^2}\} }}{{E\{ |e(n){|^2}\} }} = \frac{{E\{ |{\varepsilon ^T}(n)u(n){|^2}\} }}{{E\{ |e(n){|^2}\} }}\]
如果我們接下來假設輸入信號u(n)的頻譜中,每個頻點分別對加權誤差向量頻譜的對應頻點的影響都是相同的,那么
\[E\{ |{\varepsilon ^T}(n)u(n){|^2}\} \approx E\{ |{\varepsilon ^T}(n){|^2}\} E\{ |u(n){|^2}\} \]
最終得到的最優步長可以近似為
\[{\mu _{opt}} = \frac{{E\{ |{\varepsilon ^T}(n)u(n){|^2}\} }}{{E\{ |e(n){|^2}\} }} \approx \frac{{E\{ |{\varepsilon ^T}(n){|^2}\} E\{ |u(n){|^2}\} }}{{E\{ |e(n){|^2}\} }}\]
細心的朋友可能已經看出來了,這個結論與Speex回聲消除原理深度解析一文中的最優步長結論意義上可以認為是相同的(采用的符號表示不同,不影響理解),這說明無論從哪個角度分析,在抽頭權向量均方偏差最小的約束准則下,得到的最優步長的結論都是一樣的。
四、改進思路
既然原理已經分析清楚了,現在再來看看,針對這個原理的Speex實現,可以有哪些改進的思路。本人水平有限,這里先分享出來,歡迎各位朋友批評指正不足之處!
- 最優初始值問題,Speex雖然采用了MDF做為長延時濾波,但本質上仍然是時域濾波原理,只是在頻域做罷了。那么為了盡可能的在啟動時快速收斂,濾波器權向量的初始值問題就不好簡單的用0來初始化。
- 回聲對每個頻點的影響是不同的,不能用一個泄露因子來表示,如果在頻域進行分段處理,每段采用不同的泄露因子,應是可行的一個思路
- 沒有考慮不同揚聲器到麥克風回聲路徑的非線性差異。這個差異在手機端效果效果很明顯,如果對遠端參考信號做非線性處理,可以弱化這個影響。