如何使用Speex中的AEC模塊,提高聲音質量?

在Speex(www.speex.org)的最新版本中,開始集成了迴音消除的模塊,而回音消除一直是Voip之中亟待解決的主要問題。
很多朋友和我說speex的aec模塊的效能並不好,我們先來看一下speex的aec的api調用方式。

/*
*創建AEC對象
*/
SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);

frame_size 的取值最好是一個編碼的frame大小, 在低帶寬條件下,一般延遲20ms,而大小爲160
filter_length,最好是房間內反射時間的1/3
如: 一個房間的反射時延爲300ms
那麼這個filter_length就最好是100ms(這個長度又被稱爲tail length).

而其中filter_length的設定是一個關鍵。

/*
*執行AEC
*/
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);

其中:
input_frame: 就是被聲卡捕捉到的聲音
echo_frame: 是由揚聲器播放出的聲音,這個聲音是需要從 input_frame中抵消的聲音.

output_frame 是處理完以後輸出的聲音

residue是一個可選參數,如果不使用可以將之設置爲NULL, 也可以通過preprocessor 來控制

問題的關鍵是 處理input和echo 之間的關係,
也就是說在捕捉到的信號和播放的信號之間的延遲必須足夠的小,纔可以提高效率.

writetosndcard(echo_frame, frame_size)
readfromsndcard(input_frame, frame_size)
speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)
如果你想要儘可能的減小信號中的迴音,那麼可以將residue這個參數設置爲噪音參數.

我相信在大多數情況下,都是因爲聲音捕捉和聲音播放之間的同步問題沒有處理好,導致的音頻質量下降。

/*
*銷燬和復位
*/
speex_echo_state_destroy(echo_state);

speex_echo_state_reset(echo_state);
不再複述了!

說明:
據說在Speex的最新的1.2beta版本上,Speex提供了可選擇的,簡化的API,來提高echo執行過程中的同步問題。
這些,我會在以後的文章中在討論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章