音訊處理之回聲消除及除錯經驗

2021-08-20 13:02:54 字數 1831 閱讀 3880

本文講的回聲(echo)是指語音通訊時產生的回聲,即打**時自己講的話又從對方傳回來被自己聽到。回聲在固話和手機上都有,小時還可以忍受,大時嚴重影響溝通交流,它是影響語音質量的重要因素之一。可能有的朋友要問了,為什麼我打**時沒有聽見自己的回聲,那是因為市面上的成熟產品回聲都被消除掉了。回聲分為線路回聲(line echo)和聲學回聲(acoustic echo),線路回聲主要存在於固話中,是由於2-4線轉換引入的回聲,聲學回聲是由於空間聲學反射產生的回聲 。回聲消除(echo canceller, ec)是語音前處理的重要環節,下面主要講其基本原理和除錯中的一些經驗。

1,基本原理

1)自適應濾波器和自適應演算法

一般濾波器的係數是固定的,而自適應濾波器的係數是變化的,是依據自適應演算法來調整濾波器係數的。自適應濾波器的結構採用fir或iir均可,由於iir存在穩定性問題,因此一般採用fir。下圖是自適應濾波器的一般結構:

上圖中,x(k)為輸入訊號,y(k)為輸出訊號,d(k)為期望訊號,e(k)是d(k)和y(k)的誤差訊號。自適應濾波器的濾波器係數受誤差訊號e(k)控制,根據e(k)的值和自適應演算法自動調整。

2)回聲消除基本原理。

下圖是回聲消除基本原理的框圖:

處理過程如下:

a)     算近端遠端語音資料的energy,確定雙方是silent還是talk。

b)    遠端輸入經過自適應fir濾波器後就得到了近似於近端輸入的資料,並與近端輸入相減後得到了誤差e。誤差e作為自適應lms演算法的輸入在需要的時候去更新自適應fir濾波器的係數給後面遠端資料處理用。在需要的時候是指遠端talk近端silent的情況,其他情況(比如double silent / double talk)下不需要更新fir濾波器的係數。

c)     誤差e同時也會經過nlp(非線性處理)後產生舒適雜訊送給對方。

2,除錯

ec相對較難,要做的很好很不容易。在webrtc開源前主要是大公司和專業的演算法公司有好的實現方案,一般公司要想產品裡有ec就去買演算法庫。webrtc開源後一些核心的演算法(包括aec/ans/agc等)也隨之開源,這樣眾公司開始用webrtc裡的演算法,尤其是網際網路公司,aec等演算法基本都是用的webrtc的。

1)學習回聲消除的基本原理,涉及訊號處理知識(從固定係數濾波器到係數自適應濾波器)和高等數學知識(梯度)等。因為不是做演算法,掌握基本的就可以了。如果基礎紮實,當然搞得越明白越好了。

2)看演算法**。如果有實現的設計文件那是最好了,好多演算法實現有技巧,有設計文件的話能更好的幫助理解**。沒有只能硬著頭皮啃了。剛開始可能有些看不懂,多看幾遍,也許每一次都會多懂一些。

3)做個應用程式驗證演算法。這個應用程式輸入是近端和遠端的pcm檔案,把ec的輸出寫進乙個pcm檔案裡,看處理效果如何。這裡面也可以分幾小步:

a)     設latency為零,近端和遠端的pcm檔案相同,理論上輸出是全零資料。如果是這樣,恭喜你選擇的演算法有乙個好的base。如果不是那就需要去調演算法裡的一些係數了,這也許要調好多次,最終除錯結果要是演算法輸出基本聽不見回聲。

b)    設一定的latency,近端的pcm和遠端的資料一樣,但是近端的pcm資料相對遠端的有一定的delay,這個值跟設定的latency值是一樣的,這時理論上輸出還是全零資料。

c)    獲取實際產品上的近端和遠端pcm資料,可以近似得到近端和遠端的latency。把這幾個作為輸入,看演算法輸出,也要基本聽不見回聲。這步調好後演算法基本上就可以用了。

經過上面幾步後在真正產品上的ec除錯就算結束了。

大資料處理技術之冗餘消除

我們在分析資料的時候,需要對資料進行整理,這樣就能夠方便資料分析工作。當然,資料加工是資料分析工作之前的工作,而在大資料處理中有很多資料整理的技術,其中最常見的就是冗餘消除,那麼什麼是資料冗餘呢?在這篇文章中我們就詳細地給大家解答一下這個問題。而對於普通的資料傳輸和儲存,這就涉及到了乙個技術,那就是...

回溯法 批處理作業排程 回溯法之批處理作業排程

回溯法之批處理作業排程 1.問題描述 n個作業集合。每個作業先由機器1處理,再由機器2處理。作業i需要機器j處理的時間為mij mij機器1 機器2作業1 作業2作業3 對於乙個確定的作業排程,設fij 是作業i在機器j上完成的具體時間。所有作業在機器2上完成的具體時間 時刻 之和f稱為該作業排程的...

Python之異常及異常處理

在python中,萬物皆物件.所以異常在python中也是物件.當程式無法正常執行 時,就會丟擲乙個異常,程式就會執行回溯 traceback 來終止程式.但有時候這並 不是我們想要看到的,程式需要繼續執行下去,這時候就需要對異常進行處理.捕捉異常可以使用try except語句。try excep...