Speex回声消除原理解析
来源:互联网 发布:免费网络加速器下载 编辑:程序博客网 时间:2024/04/29 09:20
这里假设读者具有自适应滤波器的基础知识。Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比。最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下,下面会用到的。
对于长度为N的NLMS滤波器,误差信号定义为期望信号与估计信号之差,表示如下:
则,滤波器的系数更新方程为:
设滤波器的系数误差为:
且期望信号为本地(近端)语音+残余回声
则滤波器的系数更新方程可以重写为
如果每个时刻的失调定义为:
那么,在每一步的迭代中,滤波器的失调可表示如下:
假设远端信号与近端信号为白噪声,且不相关。
为近端语音信号的方差,则失调的更新方程为
这里失调函数
为凸函数,对它关于步长求导,并置导数为0,可得:
最终推出最优步长为:
大家别看最下面的那个分母
式子挺长,其实意义很明确,可以近似理解为残余回声的方差,于是输出信号的方差为:近端语音的方差+残余回声的方差,用式子表示如下
最终,导出最优步长:
上面的分析是在时域,基于NLMS,可以看到:最优步长等于残余回声方差与误差信号方差之比。其中误差的方差比较好求,残余回声的方差比较难求。下面我们看下上面的结论在频域中如何解决,Speex中在频域的自适应算法为:MDF(multidelay block frequency domain)自适应滤波。
在频域中,设k为频率索引,字母(ell)为帧索引,上面的结论转换到频域,结果如下:
那么,在频域如何求残余回声的方差呢,我们可以定义一个泄露系数,表示回声相对于远端信号的泄露程度,这时残余回声表示为
根据泄露系数求出残余回声,就可以得到最优步长
也就是说,根据泄露系数,可以估计出远端信号的残余回声,进而可以得到最优步长,那么,带来另一个问题,这里的泄露系数如何估计呢?确定泄露系数的过程,其实就是一元线性回归分析中确定回归系数的过程,具体可以看下回归分析的内容。
这里, 是通过递归平均处理方法得到每个频点的自相关、输入信号与误差信号的互相关。最终得到泄露系数,具体实现可以参考speex 的代码实现,相关参数可以参考后面给出来参考论文。
Speex的回声消除原理已经分析完了,最终得出结论是:只有改与泄露系数相关部分的代码,才是对效果影响最大的地方,因为根据泄露系数,最终会估计出滤波器的最优步长。
参考论文:On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk
- Speex回声消除原理解析
- [投稿] Speex回声消除原理深度解析
- Speex 回声消除
- Speex 之回声消除
- speex回声消除
- Speex 回声消除
- Speex回声消除器
- speex 回声消除
- speex 回声消除(2)
- speex回声消除功能测试
- speex 回声消除的用法
- speex 回声消除的用法
- Speex 回声消除接口介绍
- Speex回声消除代码分析
- Speex回声消除代码分析
- speex 回声消除(1)
- Android移植Speex回声消除
- Speex 回声消除流程分析
- python采用pika库使用rabbitmq总结,多篇笔记和示例
- Python高级特性:迭代器和生成器 -转
- Docker: vmware企业级docker镜像私服--Harbor的搭建
- hashMap和hashTable的区别
- Customizing docker
- Speex回声消除原理解析
- ArrayAccess、trait新特性写接口
- Python后端相关技术/工具栈
- android 4.4.2 开发环境
- 模仿qq空间,图片根据容器缩放,不会压缩变形
- Python代码注释应该怎么写?
- luogu1084疫情控制-二分+倍增+贪心
- 两个实用的Python的装饰器
- Python面试题目--汇总