android speex AEC 回音消除

android speex AEC 回音消除。

有时候喇叭声音会被mic录制进去,就会产生回音数据,这是非常让人头疼的,所以去回音在音视频应用中非常重要。

现在主流的回音消除手段有android自带api效果很好,如果其他平台就要使用c库了。有哪些c库具备这个功能webrtc 、 speex等。他们都是开源代码,而且后者还没有专利保护可以随意开鲁。
今天介绍的就是speex方法消除回声。

那么speex消除回声的原理是什么?

从通讯回音产生的原因看,可以分为声学回音(Acoustic Echo)和线路回音(Line Echo),相应的回声消除技术就叫声学回声消除(Acoustic Echo Cancellation,AEC)和线路回声消除(Line Echo Cancellation, LEC)。声学回音是由于在免提或者会议应用中,扬声器的声音多次反馈到麦克风引起的(比较好理解);线路回音是由于物理电子线路的二四线匹配耦合引起的(比较难理解)。

speex使用就是aec算法,下面就看看怎么实现speex库去回声的使用。

官网地址:
speex.org

这里不介绍集成的部分,网上有很多可以参考。

开始编码!

创建变量

    SpeexEchoState* m_pState;
    SpeexPreprocessState* st;
    int      m_nFrameSize=160;
    int      m_nFilterLen=m_nFrameSize*8;
    int      m_nSampleRate=8000;
    int 	 iArg;

初始化

        m_pState = speex_echo_state_init(m_nFrameSize, m_nFilterLen);
        if(m_pState == NULL)
            return -1 ;

        st = speex_preprocess_state_init(m_nFrameSize, m_nSampleRate);
        if(st == NULL)
            return -2 ;

        iArg = m_nSampleRate;
        speex_echo_ctl(m_pState, SPEEX_ECHO_SET_SAMPLING_RATE, &iArg);
        speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_ECHO_STATE, m_pState);

回声消除

        speex_echo_cancellation(m_pState, recordBuffer,
                                playBuffer, szOutBuffer);
        int flag=speex_preprocess_run(st, szOutBuffer);

recordBuffer 是mic录制声音
playBuffer 是扬声器播放声音
szOutBuffer 处理后数据

释放句柄

        speex_echo_state_destroy(m_pState);
        speex_preprocess_state_destroy(st);

完成!

如果对你有用记得点赞哦!!!.

猜你喜欢

转载自blog.csdn.net/mhhyoucom/article/details/105074601
今日推荐