求解speex AEC回音消除模块的正确使用方法

huoppo01 2011-09-22 02:32:01
本人经过一个多月的speex AEC回音消除模块的研究,
通过调整其主要API函数的参数方式均没有得到良好的效果,
目前经过回音消除模块以后的声音质量比之前的声音质量有严重的下降!

请教高手:

第一步:讲解自己的研究项目:
1,通过filter的方式实现了两个过滤器:
audio send filter 与audio recv filter
2.两者的功能:
audio send filter 主要是讲接收来的音频数据在播放之前传送给audio recv filter
recv filter在收到该音频数据后作为回音消除的参数数据
3.本机麦克风的音频数据在获取到之后,会更具recv filter接收到的数据做一个回音消除:

目前将主要的源代码放到下面:
希望高手指正!并且支招:

回音消除模块的初始化

m_sampRate = 44100;
_speex_aec = speex_echo_state_init(m_sampRate/50, m_sampRate/5);
_speex_preprocess = speex_preprocess_state_init(m_sampRate/50, m_sampRate);
speex_echo_ctl(_speex_aec, SPEEX_ECHO_SET_SAMPLING_RATE, &m_sampRate);
speex_preprocess_ctl(_speex_preprocess, SPEEX_PREPROCESS_SET_ECHO_STATE, _speex_aec);


pSample->GetPointer(&pBuff);
lSize = pSample->GetActualDataLength();
m_cirMicBuf.Push(pBuff, lSize);
ZeroMemory(pBuff, lSize);
int i = 0;
int iMicLen = m_cirMicBuf.Len();
int iRecvLen = m_cirRecvBuf2.Len();
while (m_cirMicBuf.Len() >= m_sampRate/50 &&
m_cirRecvBuf2.Len() >= m_sampRate/50 && (m_sampRate/50) * i < lSize)
{
m_cirMicBuf.Pop((PBYTE)buf_in, m_sampRate/50);
m_cirRecvBuf2.Pop((PBYTE)buf_out, m_sampRate/50);

speex_echo_cancellation(_speex_aec, buf_in, buf_out, outbuf);
speex_preprocess_run(_speex_preprocess, outbuf);
memcpy(pBuff + (m_sampRate/50) * (i++), outbuf, m_sampRate/50);
}
m_cirMicBuf.Reset();
m_cirRecvBuf1.Reset();
m_OutputPin.Deliver(pSample);

...全文
1083 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
99263 2011-10-16
  • 打赏
  • 举报
回复
44100不知道行不行,我看demo都是8000采样的。
huoppo01 2011-09-29
  • 打赏
  • 举报
回复 1
郁闷啦,要被开除了!!!!
huoppo 2011-09-22
  • 打赏
  • 举报
回复
请高手来帮个忙呀,给点意见与建议了...
这个项目真的很急,都托了两个月了,在弄下去有点说不过去了吧!!!!!
这个搞不好我就得卷铺盖走人啦!
huoppo 2011-09-22
  • 打赏
  • 举报
回复
还望适当的给你提示或者意见什么的!!!!
高手!!!!!!
huoppo 2011-09-22
  • 打赏
  • 举报
回复
高手你在哪里!我们家族老大亲自出马了!!
huoppo02 2011-09-22
  • 打赏
  • 举报
回复
顶!!!!!
huoppo02 2011-09-22
  • 打赏
  • 举报
回复
帮顶!!!!!!
huoppo02 2011-09-22
  • 打赏
  • 举报
回复
帮顶求高手解答!!!
有知道的朋友邮箱:huoppo@126.com
huoppo01 2011-09-22
  • 打赏
  • 举报
回复
有研究过speex AEC的高手进来讲解吗
huoppo01 2011-09-22
  • 打赏
  • 举报
回复
为帮助各位看清源代码:
m_cirMicBuf与m_cirRecvBuf2是两个循环的缓冲buffer
分别用来存储每一个传输数据时的音频数据
m_cirMicBuf为从本机麦克风所获取的音频数据(用作回音消除的参考源)
m_cirRecvBuf2为本机接收来的音频数据(用作回音消除的模板)
huoppo01 2011-09-22
  • 打赏
  • 举报
回复
我输入的音视频的采样率都是44100的,我有用过8000的试过但是根本运行不了的。
不清楚speex的API是否支持44100在网上都没有找到这方面的信息!
就想叫yoko 2011-09-22
  • 打赏
  • 举报
回复
帮顶。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧