zoukankan      html  css  js  c++  java
  • 使用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执行过程中的同步问题。 
    这些,我会在以后的文章中在讨论。 

  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/myitm/p/2113087.html
Copyright © 2011-2022 走看看