AEC (Acoustic Echo Canceller) 回音消除初探

AEC回声抑制算法,这个比较难,目前可以使用directsound进行处理,不过只能在xp下使用,别的系统不支持!
目前gips对本算法有出色的实现,skype就是使用的该引擎!
要想自己实现,恐怕很困难!
 

AEC 模块是 Microsoft DirectSound 底层结构的一部分。该组件包括下列特性和限制:

AEC只在不超过 25×15×9 英尺的小房间才会有效; 
AEC只对单声道有效,当输出是多个通道的立体声的时候,只有一个通道能够具有回波抵消的效果; 
AEC不能抵消来自其它声音源的声音,比如背景中收音机放出来的歌曲;
IDirectSoundFullDuplex8*      DirectSoundFD;//
IDirectSoundCaptureBuffer8*  DirectSoundCaptureBuf8;//捕捉缓冲区接口指针
IDirectSoundBuffer8*         DirectSoundBuf8;//回放缓冲区接口指针
IDirectSoundBuffer8*         pIUnkown;//回放缓冲区接口指针

extern "C" const GUID IID_IDirectSoundBuffer8 = {0x6825a449, 0x7524, 0x4d82,{ 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e}};
extern "C" const GUID GUID_DSCFX_MS_NS        = {0x11c5c73b, 0x66e9, 0x4ba1, {0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d}};
extern "C" const GUID GUID_DSCFX_CLASS_NS = {0xe07f903f, 0x62fd, 0x4e60, {0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5}};
extern "C" const GUID GUID_DSCFX_MS_AEC = {0xcdebb919, 0x379a, 0x488a, {0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40}};
extern "C" const GUID GUID_DSCFX_CLASS_AEC = {0xBF963D80L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
extern "C" const GUID DAlgorithm ={0x00000000,  0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};

//1.创建及初始化DirectSound
WAVEFORMATEX WaveDataFormat={WAVE_FORMAT_PCM, 1,8000,16000,2,16, 0};             
//回放缓冲区。render buffer
DSBUFFERDESC desc;
memset(&desc, 0, sizeof(desc)); 
desc.dwSize = sizeof(desc);
desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_GLOBALFOCUS;
desc.dwBufferBytes = 2000 * NUM_REC_NOTIFICATIONS;//待定
desc.dwReserved = 0;
desc.lpwfxFormat = &WaveDataFormat;
   

//捕捉缓冲区AEC和NS效果。
DSCEFFECTDESC efft[2];
memset(efft, 0, sizeof(efft));
//AEC效果
efft[0].dwSize = sizeof(efft[0]);
efft[0].dwFlags = DSCFX_LOCSOFTWARE;
efft[0].guidDSCFXClass = GUID_DSCFX_CLASS_AEC;
efft[0].guidDSCFXInstance = GUID_DSCFX_MS_AEC;
//NS效果
efft[1].dwSize = sizeof(efft[1]);
efft[1].dwFlags = DSCFX_LOCSOFTWARE;
efft[1].guidDSCFXClass = GUID_DSCFX_CLASS_NS;
efft[1].guidDSCFXInstance = GUID_DSCFX_MS_NS;
    
//捕捉缓冲区。capture buffer
DSCBUFFERDESC cdesc;
memset(&cdesc, 0, sizeof(cdesc));
cdesc.dwSize = sizeof(cdesc);
cdesc.dwFlags = DSCBCAPS_CTRLFX; 
cdesc.dwBufferBytes =  2000 * NUM_REC_NOTIFICATIONS;//待定
cdesc.lpwfxFormat = &WaveDataFormat;
cdesc.dwFXCount = 2;
cdesc.lpDSCFXDesc = efft;

HWND win = AfxGetApp()->m_pMainWnd->m_hWnd;
hr = DirectSoundFullDuplexCreate8(0, 0,&cdesc, &desc,win, 
DSSCL_PRIORITY,&DirectSoundFD, &DirectSoundCaptureBuf8,&DirectSoundBuf8, 0); 
DXTRACE_ERR( TEXT("DirectSoundFullDuplexCreate8"), hr );
//成功创建DirectSoundFD,DirectSoundCaptureBuf8,DirectSoundBuf8,均不为零。

if(!FAILED(hr))
    DirectSoundFD->QueryInterface(IID_IDirectSoundBuffer8, (void**)pIUnkown);
//发现上面的pIUnkown=0,查询失败,为什么?
    AfxMessageBox("失败");

时间: 2024-09-19 09:42:09

AEC (Acoustic Echo Canceller) 回音消除初探的相关文章

基于chrome的webrtc在web端能不能实现分辨率动态调整,回音消除等等?

问题描述 基于chrome的webrtc在web端能不能实现分辨率动态调整,回音消除等等? 基于chrome的webrtc在web端能不能实现分辨率动态调整,回音消除等等? 1.还是必须要经过中转服务器对媒体流进行处理,能不能在web段进行处理呢? 2.如果有中转服务器,可以对媒体流进行二次处理吗?比如二次编码,自适应编码? 3.视频传输机制,chrome有没有做?还是传输方面,服务器端还要进行优化?谢谢各位大神! 解决方案 分辨率调整,回音消除都是有的(最近google刚引入了一个新的AEC,

Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)

在一般的VOIP软件或视频会议系统中,假设我们只有A和B两个人在通话,首先,A的声音传给B,B然后用喇叭放出来,而这时B的MIC呢则会采集到喇叭放出来的声音,然后传回给A,如果这个传输的过程中时延足够大,A就会听到一个和自己刚才说过的话一样的声音,这就是回声,声学回声消除器的作用就是在B端对B采集到的声音进行处理,把采集到声音包含的A的声音去掉再传给A,这样,A就不会听到自己说过的话了.声学回声消除的原理我就不说了,这在网上有很多文档,网上缺少的是实现,所以,我在这把一个开源的声学回声消除器介绍

Android上用speex做回音消除

转自:http://blog.csdn.net/fireworkburn/article/details/12781985 Android上用speex做回音消除 2013-10-17 11:53  1. 问题     我们在做语音实时对讲的时候往往会碰到一个瓶颈,这个瓶颈就是在不戴耳机的情况下会有很大的回音,本文就讨论如何解决. 2.解决方式:     (1)其实有做了同一时间只有一端能够说或者听,类似于对讲机,这种虽然是实时的,但是体验不好,还不如微信:     (2)两边戴上耳机,这样也没

Speex 回音消除 在android 平台上 初见成效

也不知和上一篇,你们二位是同一位仁兄不,所以,还是分着转载吧! Speex 回音消除 在android 平台上 初见成效 搞了将近一个月的时间,将Speex的编码和解码做好了,发现还不错. 参考API,又尝试了回音消除,发现最新版还提供了用于在多线程中的playback()和capture(),有了这两个函数,就可以避免在线程中不能同步的问题. 结果,发现虽然进行了回音有了部分消除,但是,还是会一点啸叫以及回声,想来还是要做一点处理,譬如去噪,减小播放或者来音的增益. 在使用了speex提供的

【单独编译使用WebRTC的音频处理模块 - android】

更新 [2015年2月15日]     Bill 这段时间没有再关注 WebRTC 以及音频处理的相关信息,且我个人早已不再推荐单独编译 WebRTC 中的各个模块出来使用.实际上本文的参考价值已经很小了,甚至可能会产生误导.不删这篇文章的原因在于文后有很多读者的讨论,其中的一些仍具备一定的价值,请大家务必以批判和审慎的态度阅读文章.   [2014年5月14日]    昨天有幸在 Google 论坛里询问到 AECM 模块的延迟计算一事,Project member 说捣腾这个延迟实际上对 A

单独编译使用WebRTC的音频处理模块 - android

前言    最近一直在捣腾如何在android和iOS上使用Google的WebRTC--一个无疑大力推动了互联网即时通信以及VoIP发展的开源项目.    虽然WebRTC主要目标是为互联网提供高质量的富媒体即时通信,但其源码为C/C++所写,且其开发版中也包含对android 和 iOS 等移动设备的支持,因此对于如今飞速发展的移动互联网,WebRTC也能推波助澜大显神通.    WebRTC提供一套音频处理引擎VOE(本文不涉及视频处理引擎VIE),但VOE在 android 和 iOS 

Speex手册----编解码介绍

2.1 概念 Before introducing all the Speex features, here are some concepts in speech coding that help better understand the rest of the manual. Although some are general concepts in speech/audio processing, others are specific to Speex 在介绍Speex特性之前,为了便

webrtc的音频处理模块apm( audio processing)下载与编译出libwebrtc_audio_preprocessing.so

2017-05-22更新! http://pan.baidu.com/s/1nvbTcRf   jni修改后的代码,可以直接ndk-build出so文件!!!!!!!!   -------------------------------------------------------   webrtc代码在android和chromium项目中都有.但是android中的那个带有Android.mk,稍微修改下就能用ndk-build编译出libwebrtc_audio_preprocessin

VoIP技术之回声消除技术

"在PBX或局用交换机侧,有少量电能未被充分转换而且沿原路返回,形成回声.如果打电话者离PBX或交换机不远,回声返回很快,人耳听不出来,这种情况下无关紧要.但是当回声返回时间超过10ms时,人耳就可听到明显的回声了.为了防止回声,一般需要回声消除技术,在处理器中有特殊的软件代码监听回声信号,并将它从听话人的语音信号中消除.对于IP电话设备,回声消除技术是十分重要的,因为一般IP网络的时延很容易就达到40-50ms. " 一. 因特网语音通信中回声的特点 与传统电话相比,因特网上进行语音