1. 程式人生 > >轉載_關於AEC演算法的幾點思考

轉載_關於AEC演算法的幾點思考

一年前我剖析過開源的AEC演算法,文章連結是語音增強和語音識別;時隔這麼長時間,再過來看這個演算法,略有體會,以下有幾點個人思考:

AEC演算法的主要目的是自身音源消除,對於手機或者pc這類的通話場景,這類場景和音響場景稍有差異,兩者遇到的主要問題會有些差異;

對於視訊通話這類場景,兩個通訊終端的時鐘偏斜和漂移是不定的,而音箱場景這個是可以在硬體上加以解決的,但是音箱場景的非線性失真卻比通訊場景嚴重的,功率放大模組非線性器件帶來的諧波失真,在室內四個方向都發聲,是得卷積失真,多次反射回聲,聲音突變等會加劇問題處理的複雜性;

當前絕大部分的AEC演算法基本都基於頻域分塊處理方法,基於LMS/NLMS、RLS(recursive least square), APA(Affine Projection Algorithm)自適應處理方法。

LMS演算法主要的作用消除線性回聲部分,也就是參考訊號x中可以經過線性疊加的方式獲得麥克風採集到的回聲訊號的估計值,上述公式中的h是濾波器係數,

mumu

是步長因子;e是誤差訊號;

LMS演算法對輸入訊號的頻譜和功率敏感,步長因子的選取直接影響收斂速度和穩定性,對於穩定性要求步長因子小於輸入訊號協方差矩陣的跡導數(實際中很少計算,採用定長步長),

對於要求高的場景會選擇根輸入訊號的功率對步長進行歸一化,即NLMS演算法,

β是歸一化的步長因子,。為了防止分母為零,加小數a,得如下:

這樣收斂速度和輸入訊號的功率絕對值無關。但是這兩種演算法在輸入訊號相關性很高時,收斂速度都會較慢。RLS演算法準則是最小均分誤差。其收斂速度塊,是用於非穩態訊號。其演算法實現如下:

思考1:

1.步長因子$mu$如何選擇?理想的步長因子是:

但是實際上

h^h^

是未知的,這也意味這步長因子是無法直接求出的,有些演算法直接選擇了定長的步長因子(針對場景調節一個因子),但如果步長因子過大,則收斂的速度相應變快,直觀的感受是當音樂突然變化(鼓聲起)等時,能夠快速壓制,這也容易造成過沖,使得失調反而變大,這是因為誤差訊號的估計並不是每時每刻都很準,尤其在double-talk出現時更是如此;在音箱場景中不宜採用固定步長因子的,音箱場景涵蓋的過於複雜,不像通訊場景可以得到一個收斂延遲和壓制效果較為滿意的均衡點。這個步長因子應該根據採集到的參考訊號x以及誤差訊號e之間關係變化,當然為了防止抖動,對其自身的平滑還是需要。可以從x的時間序列得到輸入訊號的變化,這個變化是源頭上可以反映參考訊號變動的,另外誤差訊號e是另一個指標來反映,儘管e能夠加速收斂過程,當e失調時也該適當的增加mu,這樣mu可以看成是一個和x序列以及e序列相關的變數;以下是通過演算法來跟新步長因子$\mu$(\$lambda$)的方法。

由於觀測訊號和濾波器係數都是分塊(重疊相加法或重疊保留法均可實現)方法,這就為實時性提供了保障。在LMS方法做或許的非線性濾波時系步長的更新也可以採用這裡的方法。

此外還有基於貝葉斯網路的理論計算LMS方法中步長的選擇的。

2.關於誤差訊號,LMS消除的是線性部分,得到的是殘餘線性部分和非線性部分之和,非線性部分來源於外接的噪聲,參考源的卷積響應以及喇叭或者傳輸路徑帶來的非線性,對於從四面八方接收訊號場景而言,非線性還是比較明顯,所以必須引入非線性處理方法,有最小均放誤差方法,但是這一方法並不好,實際上webrtc就是採用這個準則,尤其是在double-talk發生時更是如此。這個方法認為,如果能夠消除噪聲,則得到的最終能量值將最小,這在同一時刻只有一方說話時是成立的,但是當雙方都在說話時,使用誤差能量最小這一準則顯然不適用,這就是很多人會提到的吞字(英文文獻裡稱之為clipping)現象。只有把字吞掉,能量才會小,這樣這個沒有double-talk檢測演算法必然的結果。

3.所以針對非線性訊號(NL-processing),非線性問題在有些文獻中又被稱為REC(residual echo control),這些

,需要一個方法把非線性部分消掉而不損傷double-talk時發生“誤殺現象”,首先談如何消掉非線性部分,可以將原始訊號x通入濾波器中,使用濾波器來近似非線性響應函式,這樣也會得到非線性估計,實際上最早開始部分提到的誤差訊號e是減去了線性和非線性部分得到的誤差訊號,濾波器係數可以通過最小能量均分來做為準則進行平滑。非線性部分目前來說算是各個AEC最大的差異體現吧,通常希望濾波器階數較高,能夠處理較長的時間長度(即訊號經過多次反射到達的場景)。比較有名的處理的濾波器是volterra 濾波器,使用一階,二階和三階濾波器來去除非線性部分,但隨著階數的增加,計算量也呈現指數方式增加,其一階的表示式如下:

二階的表示如下:

則誤差訊號可以表示為:

則濾波器的係數跟新方式如下:

這裡就涉及到三個步長跟新的速率了,,當0<$\alpha$<2時,是收斂的。

4.自適應演算法的迭代跟新,這要通過DTD(double-talk detection)來區別對待,實際中發現確實是有用的,可以降低對語音的損傷,但是還不夠,最好是一個比較調節而不是檢測到DTD條件時當即停止相關係數的跟新。DTD檢測演算法有能量演算法,還有基於幾個訊號綜合的互功率譜估計,也有直接通過訊號的互相關性估計。

5.端到端的處理

對於ASR而言,AEC是為了獲得近端的人聲特徵(MFCC或者FBANK),傳統的AEC(場景電話,VOIP之類)得到近端訊號給人耳聽的,它們主要是使用頻域特徵做自適應濾波,如果我們的AEC目的是給機器聽的(ASR),可不可以直接在多維的MFCC、FBANK特徵域裡做自適應濾波處理,直接得到近端訊號的MFCC或者FBANK特徵?