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

huoppo01 huoppo01 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
本人经过一个多月的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);

...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
huoppo01
其它技术问题 3,881 成员 9,044 内容