基于Speex的声学回声消除

        所谓声学回声消除,是为了解决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++目录
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值