



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个开源的声学回声消除器收藏 前段时间,搞了一阵声学回声消除,非常郁闷,因为没有成功,但可以说学到一点东西吧,至少理论上懂了一点。为什么需要声学回声消除呢?在一般的VOIP软件或视频会议系统中,假设我们只有A和B两个人在通话,首先,A的声音传给B,B然后用喇叭放出来,而这时B的MIC呢则会采集到喇叭放出来的声音,然后传回给A,如果这个传输的过程中时延足够大,A就会听到一个和自己刚才说过的话一样的声音,这就是回声,声学回声消除器的作用就是在B端对B采集到的声音进行处理,把采集到声音包含的A的声音去掉再传给A,这样,A就不会听到自己说过的话了。声学回声消除的原理我就不说了,这在网上有很多文档,网上缺少的是实现,所以,我在这把一个开源的声学回声消除器介绍一下,希望对有些有人用,如果有人知道怎么把这消除器用的基于实时流的VOIP软件中,希望能一起分享一下。这个声学回声消除器是一个著名的音频编解码器speex中的一部分,1.1.9版本后的回声消除器才起作用,以前版本的都不行,我用的也是这个版本,测试表明,用同一个模拟文件,它有效果比INTEL IPP库4.1版中的声学回声消除器的还要好。先说编译。首先,从上下载speex1.1.9的源代码,解压,打开speexwin32libspeex中的libspeex.dsw,这个工作区里有两个工程,一个是libspeex,另一个是libspeex_dynamic。然后,将libspeex中的mdf.c文件添加到工程libspeex中,编译即可。以下是我根据文档封装的一个类,里面有一个测试程序: /file name: speexEC.h#ifndef SPEEX_EC_H#define SPEEX_EC_H#include #include #include speex/speex_echo.h#include speex/speex_preprocess.h class CSpeexECpublic:CSpeexEC();CSpeexEC();void Init(int frame_size=160, int filter_length=1280, int sampling_rate=8000);void DoAEC(short *mic, short *ref, short *out);protected:void Reset();private:bool m_bHasInit;SpeexEchoState*m_pState; SpeexPreprocessState*m_pPreprocessorState;int m_nFrameSize;int m_nFilterLen;int m_nSampleRate;float* m_pfNoise;#endif/fine name:speexEC.cpp#include SpeexEC.hCSpeexEC:CSpeexEC()m_bHasInit= false;m_pState= NULL;m_pPreprocessorState= NULL;m_nFrameSize= 160;m_nFilterLen= 160*8;m_nSampleRate= 8000;m_pfNoise= NULL;CSpeexEC:CSpeexEC()Reset();void CSpeexEC:Init(int frame_size, int filter_length, int sampling_rate)Reset();if (frame_size=0 | filter_length=0 | sampling_rate=0)m_nFrameSize =160;m_nFilterLen = 160*8;m_nSampleRate = 8000;elsem_nFrameSize =frame_size;m_nFilterLen = filter_length;m_nSampleRate = sampling_rate;m_pState = speex_echo_state_init(m_nFrameSize, m_nFilterLen);m_pPreprocessorState = speex_preprocess_state_init(m_nFrameSize, m_nSampleRate);m_pfNoise = new floatm_nFrameSize+1;m_bHasInit = true;void CSpeexEC:Reset()if (m_pState != NULL)speex_echo_state_destroy(m_pState);m_pState = NULL;if (m_pPreprocessorState != NULL)speex_preprocess_state_destroy(m_pPreprocessorState);m_pPreprocessorState = NULL;if (m_pfNoise != NULL)delete m_pfNoise;m_pfNoise = NULL;m_bHasInit = false;void CSpeexEC:DoAEC(short* mic, short* ref, short* out)if (!m_bHasInit)return;speex_echo_cancel(m_pState, mic, ref, out, m_pfNoise); speex_preprocess(m_pPreprocessorState, (_int16 *)out, m_pfNoise);可以看出,这个回声消除器类很简单,只要初始化一下就可以调用了。但是,要注意的是,传给回声消除器的两个声音信号,必须同步得非常的好,就是说,在B端,接收到A说的话以后,要把这些话音数据传给回声消除器做参考,然后再传给声卡,声卡再放出来,这有一段延时,这时,B再采集,然后传给回声消除器,与那个参考数据比较,从采集到的数据中把频域和参考数据相同的部分消除掉。如果传给消除器的两个信号同步得不好,即两个信号找不到频域相同的部分,就没有办法进行消除了。测试程序:#define NN 160void main()FILE* ref_fd, *mic_fd, *out_fd;short refNN, micNN, outNN;ref_fd = fopen (ref.pcm, rb);/打开参考文件,即要消除的声音mic_fd = fopen (mic.pcm, rb);/打开mic采集到的声音文件,包含回声在里面out_fd = fopen (echo.pcm, wb);/消除了回声以后的文件CSpeexEC ec;ec.Init();while (fread(mic, 1, NN*2, mic_fd) fread(ref, 1, NN*2, ref_fd); ec.DoAEC(mic, ref, out); fwrite(out, 1, NN*2, out_fd); fclose(ref_fd); fclose(mic_fd); fclose(out_fd);以上的程序是用文件来模拟回声和MIC,但在实时流中是大不一样的,在一般的VOIP软件中,接收对方的声音并传到声卡中播放是在一个线程中进行的,而采集本地的声音并传送到对方又是在另一个线程中进行的,而声学回声消除器在对采集到的声音进行回声消除的同时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发展新质生产力的时代价值
- 医患关系论文精要2000字
- 青年在新质生产力发展中的行动路径
- 劳模工匠讲新质生产力
- 2025年输血学ABO血型配型技术应用模拟测试卷答案及解析
- 2025年耳鼻喉科常见耳疾诊治知识竞赛试卷答案及解析
- 2025年眼科常见疾病的诊断与治疗综合测试卷答案及解析
- 2025年康复医学评估工具运用考试答案及解析
- 乏燃料后处理新质生产力
- 关于感恩节的幼儿园主题活动方案
- 房屋归属权协议书范本(标准版)
- 鼻腔冲洗护理技术团体标准解读
- GB/T 41130-2021展览场馆安全管理基本要求
- 湘美版美术一年级上册全册课件
- 环境经济学(张)课件
- 人才管理-人才选用育留课件
- 成功八步课件
- 玉石床垫讲稿课件
- 初中音乐七年级上册第一单元 红岩魂走进歌乐山
- 栈桥修复方案(全文)
- 某五星级酒店单项工程经济指标
评论
0/150
提交评论