Speex回聲消除原理深度解析


  這里假設讀者具有自適應濾波器的基礎知識。Speex的AEC是以NLMS為基礎,用MDF頻域實現,最終推導出最優步長估計:殘余回聲與誤差之比。最優步長等於殘余回聲方差與誤差信號方差之比,這個結論可以記下,下面會用到的。

  對於長度為N的NLMS濾波器,誤差信號定義為期望信號與估計信號之差,表示如下:

\[e(n) = d(n) - \hat y(n) = d(n) - \sum\limits_{k = 0}^{N - 1} {{{\hat w}_k}(n)x(n - k)} \]

  則,濾波器的系數更新方程為:

\[{\hat w_k}(n + 1) = {\hat w_k}(n) + \mu \frac{{e(n){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }} = {\hat w_k}(n) + \mu \frac{{(d(n) - \sum\nolimits_i {{{\hat w}_i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}\]

  設濾波器的系數誤差為:

\[{\delta _k}(n) = {\hat w_k}(n) - {w_k}(n)\]

  且期望信號為本地(近端)語音+殘余回聲

\[d(n) = v(n) + \sum\nolimits_k {{w_k}(n)x(n - k)} \]

  則濾波器的系數更新方程可以重寫為

\[{\delta _k}(n + 1) = {\delta _k}(n) + \mu \frac{{(v(n) - \sum\nolimits_i {{\delta _i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}\]

  如果每個時刻的失調定義為:

\[\Lambda (n) = \sum\nolimits_k {\delta _k^*(n){\delta _k}(n)} \]

  那么,在每一步的迭代中,濾波器的失調可表示如下:

\[\Lambda (n + 1) = \sum\limits_{k = 0}^{N - 1} {|{\delta _k}(n) + \mu \frac{{(v(n) - \sum\nolimits_i {{\delta _i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}{|^2}} \]

  假設遠端信號與近端信號為白噪聲,且不相關。

  \[\sigma _v^2 = E\{ |v(n){|^2}\} \]

  為近端語音信號的方差,則失調的更新方程為

\[E\{ \Lambda (n + 1)|\Lambda (n),x(n)\}  = \Lambda (n)\left[ {1 - \frac{{2\mu }}{N} + \frac{{{\mu ^2}}}{N} + \frac{{2{\mu ^2}\sigma _v^2}}{{\Lambda (n)\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}} \right]\]

  這里失調函數

\[E\{ \Lambda (n + 1)|\Lambda (n),x(n)\} \]

  為凸函數,對它關於步長求導,並置導數為0,可得:

\[\frac{{\partial E\{ \Lambda (n + 1)\} }}{{\partial \mu }} = \frac{{ - 2}}{N} + \frac{{2\mu }}{N} + \frac{{2\mu \sigma _v^2}}{{\Lambda (n)\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }} = 0\]

  最終推出最優步長為:

\[{\mu _{opt}}(n) = \frac{1}{{1 + \frac{{\sigma _v^2}}{{\Lambda (n)/N\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}}}\]

  大家別看最下面的那個分母

\[\Lambda (n)/N\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} \]

  式子挺長,其實意義很明確,可以近似理解為殘余回聲的方差,於是輸出信號的方差為:近端語音的方差+殘余回聲的方差,用式子表示如下

\[\sigma _e^2(n) = \sigma _v^2(n) + \sigma _r^2(n)\]

  最終,導出最優步長:

\[{\mu _{opt}}(n) = \frac{1}{{1 + \frac{{\sigma _v^2}}{{\sigma _r^2(n)}}}} = \frac{1}{{\frac{{\sigma _r^2(n) + \sigma _v^2}}{{\sigma _r^2(n)}}}} \approx \frac{{\sigma _r^2(n)}}{{\sigma _e^2(n)}}\]

\[{\mu _{opt}}(n) = \min \left( {\frac{{\hat \sigma _r^2(n)}}{{\hat \sigma _e^2(n)}},1} \right)\]

  上面的分析是在時域,基於NLMS,可以看到:最優步長等於殘余回聲方差與誤差信號方差之比。其中誤差的方差比較好求,殘余回聲的方差比較難求。下面我們看下上面的結論在頻域中如何解決,Speex中在頻域的自適應算法為:MDF(multidelay block frequency domain)自適應濾波。

  在頻域中,設k為頻率索引,字母(ell)為幀索引,上面的結論轉換到頻域,結果如下:

\[{\mu _{opt}}(k,\ell ) \approx \frac{{\sigma _r^2(k,\ell )}}{{\sigma _e^2(k,\ell )}}\]

  那么,在頻域如何求殘余回聲的方差呢,我們可以定義一個泄露系數,表示回聲相對於遠端信號的泄露程度,這時殘余回聲表示為

\[\sigma _r^2(k,\ell ){\rm{ = }}\hat \eta (\ell )\hat \sigma _{\hat Y}^2(k,\ell )\]

  根據泄露系數求出殘余回聲,就可以得到最優步長

\[{\mu _{opt}}(n) = \min \left( {\hat \eta (\ell )\frac{{|\hat Y(k,\ell ){|^2}}}{{|E(k,\ell ){|^2}}},{\mu _{\max }}} \right)\]

  也就是說,根據泄露系數,可以估計出遠端信號的殘余回聲,進而可以得到最優步長,那么,帶來另一個問題,這里的泄露系數如何估計呢?確定泄露系數的過程,其實就是一元線性回歸分析中確定回歸系數的過程,具體可以看下回歸分析的內容。

\[\hat \eta (\ell ) = \frac{{\sum\nolimits_k {{R_{EY}}(k,\ell )} }}{{\sum\nolimits_k {{R_{YY}}(k,\ell )} }}\]

\[{R_{EY}}(k,\ell ) = (1 - \beta (\ell )){R_{EY}}(k,\ell ) + \beta (\ell ){P_Y}(k){P_E}(k)\]

\[{R_{YY}}(k,\ell ) = (1 - \beta (\ell )){R_{YY}}(k,\ell ) + \beta (\ell ){P_Y}(k){({P_Y}(k))^2}\]

\[\beta (\ell ) = {\beta _0}\min (\frac{{\hat \sigma _Y^2(\ell )}}{{\hat \sigma _e^2(\ell )}},1)\]

  這里, 是通過遞歸平均處理方法得到每個頻點的自相關、輸入信號與誤差信號的互相關。最終得到泄露系數,具體實現可以參考speex  的代碼實現,相關參數可以參考后面給出來參考論文。
  

  Speex的回聲消除原理已經分析完了,最終得出結論是:只有改與泄露系數相關部分的代碼,才是對效果影響最大的地方,因為根據泄露系數,最終會估計出濾波器的最優步長。

 

參考論文:On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM