基于Speex的声学回声消除

本文介绍了如何利用Speex库进行声学回声消除,通过创建回声消除器状态对每帧进行处理,结合预处理器以改善声音效果。在严格同步条件下,效果良好,但在不同步情况下效果会下降。提高采样率可以一定程度上提升处理效果。
摘要由CSDN通过智能技术生成
               

        所谓声学回声消除,是为了解决VoIP(网络电话)中这样一个问题:即A与B进行通话,A端有麦克风和扬声器分别用来采集A的声音和播放B的声音,B端有麦克风和扬声器分别用来采集B的声音和播放A的声音,很明显,由于声音传播的特性,A端的麦克风在采集A的声音的同时,也采集到了A端扬声器播放的来自B的声音,也就是A端采集到的声音是一个混合的声音,这个声音通过网络发给B时,B就不仅能听到A的声音,也能听见B前几秒自己的声音,这就是在B端听到了B自己的回声,同理在A端也可以听到A自己的回声,这显然不是我们想要的。

        声学回声消除一般可以通过硬件和软件分别实现,目前来说,硬件实现比较简单,软件实现较难,这里的难并不是说回声消除算法很难,而是在应用算法时的实时同步问题很难,目前软件实现较好的应该是微软,但似乎也对硬件配置和操作系统有要求。而Speex提供了声学回声消除算法库,本文就简单用Speex对一段录音进行回声消除,当然这不是实时处理的。

        Speex中回声消除API封装在语音处理API中,在最新版本的Speex中将语音处理相关的API独立封装成libspeexdsp。

        应用Speex回声消除API流程很简单:包含相关头文件——创建回声消除器状态——对每帧进行回声消除——销毁回声消除器状态。一般可以与Speex中的预处理器一起使用,已达到较好的声音效果,应用预处理器API的流程也很简单:包含相关头文件——创建预处理器状态——对每帧进行预处理——销毁预处理器状态。当然可以设置预处理器状态,在此我们使用默认设置。可以看到两者流程相同,因而写成一个CSpeexEC类,这是一个开源的回声消除器,对其中的两个函数调用做了稍微的修改。原文参见http://www.360doc.com/content/11/1008/18/11192_154383516.shtml,原文所用speex版本是1.1.9,我们用的是speex-1.2beta3-win32,执行预处理和回声消除的函数进行了更新。

1、speexEC.h

       

#ifndef SPEEX_EC_H#define SPEEX_EC_H#include #include /*在项目属性里设置VC++目录的包含目录和库目录分别为speex库中的include和lib,我用的是speex-1.2beta3-win32*/#include #include class CSpeexEC{
    public: CSpeexEC(); ~CSpeexEC(); void Init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值