speex回声消除

来源:互联网 发布:防泄密软件dlp 编辑:程序博客网 时间:2024/04/24 15:17

同类产品:

1. speex

2. intel IPP库中的回声消除算法: 仅适用于通用cpu,不开源。据说里面的回声消除算法效果也没有speex好。

3. conatus(深圳市科莱特斯科技(www.conatus-tech.com))貌似网站己经访问不了了。公司己经倒闭了?

4. spririt(俄罗斯)

5. octastic

6. gips(瑞典)

7. fortemedia,美国

ref:

1. 解密回声消除技术之一(理论篇)

2. 解密回声消除技术之二(应用篇)

3. Speex 回声消除

4. Echo Cancellation Demystified by Alexey Frunze (介绍的算法与speex不同,但原理适用)(作者是spririt工程师,当然现在己经跳槽了。)点击打开链接

使用方法 (according the its user manual)(old, before 1.2 b2)

1. include <speex/speex_echo.h>

2. 创建一个echo_state:

SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);

frame_size是每次处理的数据大小。filter_length也称tail_length,自适应滤波器长度。推荐的长度大概的回声时延的3分之一.  遗留问题:filter_length还需要根据场景调整吗?

3. 将数据fed给AEC

speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame);

当本地没说话,只有对端放音的时候,AEC比较容易收敛。当本地语音合入会,对AEC的运行己经产生了干扰。

4. 为进一步提高性能,可以在初始化阶段将AEC与预处理算法关联起来。

speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_ECHO_STATE,echo_state);

但这个对于非speex的codec是否起作用呢?

5. AEC可以被销毁与重置

speex_echo_state_destroy(echo_state);

speex_echo_state_reset(echo_state);

新使用方法(1.2 beta2)

1. 每次放音时,调用speex_echo_playback(echo_state, echo_frame);
每次收音时,调用speex_echo_capture(echo_state, input_frame, output_frame);

这样就不需要自己来维持input_frame与echo_frame的对应关系了。但当可以保证input_frame与echo_frame的实时性的场景,估计是第一种方法还更好一些。

注意事项

1. 收发必须严格同步。

2. 收发时延尽量的小。

3. filter_length并非越长越好。过长可能导致难以收敛,AEC不起作用。

4. speex使用的是线性自适应滤波器,对于非线性失真引入的信号畸变抵抗力差,因此应该尽量避免saturation/clipping.

工具

从1.2 b2开始,随源代码提供了一个octave工具w echo_diagnostic.m。需要在编译时,定义宏DUMP_ECHO_CANCEL_DATA,这样speex AEC会将过程中的ne/fe/output数据记录在log里s (aec_rec.sw aec_play.sw and aec_out.sw)。然后在octave中执行

echo_diagnostic(’aec_rec.sw’, ’aec_play.sw’, ’aec_diagnostic.sw’, 1024); // 1024 is the filter_length that can be changed.

即可对算法性能进行诊断。

算法实现

to be continued.


0 0
原创粉丝点击