声学回声消除原理

【01】回声信号的产生
回声消除不仅仅是算法调试,更多的是工程设计的调试。

 

上图中第一行为近端信号 s(n),已经混合了近端人声和扬声器播放出来的远端信号,黄色框中已经标出对齐之后的远端信号,其语音表达的内容一致,但是频谱和幅度(明显经过扬声器放大之后声音能量很高)均不一致,意思就是:参考的远端信号与扬声器播放出来的远端信号已经是“貌合神离”了,与降噪的方法相结合也是不错的思路,但是直接套用降噪的方法显然会造成回声残留与双讲部分严重的抑制。接下来,我们来看看 WebRTC 科学家是怎么做的吧。
【02】算法流程
流程为三个步骤:
时延的产生和作用:
参考信号因为反射叠加和衰减会产生时延,估计参考信号和回收信号之间的时间延迟量。将参考信号和mic信号进行时间上的对其。算法核显是衡量参考信号和近端mic信号之间的相似度,寻找相似度最高时对应的时间差。 常用算法为广义互相关、二源谱统计法(webrtc)
线性自适应滤波:
消除线性回声,以x(n)为远端参考信号,经过一个传输信道w(n),得到一个回声信号的估计值y(n),同时近端麦克风采集的信号的d(n)。因为参考信号经过信道加权得到所以称为线性自适应滤波。自适应是因为需要不断的调整滤波器系数也就是w(n)。为了评估回收信号的估计值我们定义损失函数为估计值和真实值的差值,也就是 e(n)=d(n)-y(n),也就是  e(n)=d(n)-w(n)x(n)。
其中n是表示任意shape的矩阵,对于 d(n) 和 x(n)来说就是一段语音信号(已知),对于w(n)来说就是同shape的矩阵(未知),以n为5*5为例,w就表示为[w1、w2、w3....w25]的权向量。损失函数为均方误差(二次函数)也就是开口向上的关于w的凸函数:
迭代的方式就是给一组初始w=0,从零点开始左右滑动,滑动方向是梯度下降的方向,也就是斜率大于0说明函数递增那么w左滑才能使e(n)更小,斜率小于0说明函数递减那么w右滑才能使得e(n)更小。所以w的滑动公式为:
w(i+1) = w (i) - 斜率*学习率 
其中斜率就是e(n)对w求导,因为x(n)和d(n)已知,所以这一部分是个常数。给定一个学习率,求出斜率不断使得w左右滑动直到e(n)达到最小而收敛(指定e(n)为常数极小值以判断收敛)。注意随机梯度下降是每次求斜率随机取一个样本进行计算,经典梯度下降是取所有样本进行计算。
非线性处理:
消除非线性残留回声。包含两部分:
残留回声信号:根据误差信号和参考信号的相关性、相干性、短时能量等参数来判断当前单双讲状态以及残留回声量,得到衰减系数。相两个相关性大小比值可以判断是单讲还是双讲。给一个衰减系数阈值当衰减系数大于阈值说明衰减得不够小任然可以听到,则 衰减系数乘误差信号就可以得到残留回声,后续减掉这个残留回声即可
非线性处理:进一步抑制残留的可感知小回声。
 
【03】算法细节
单讲和双讲的,为什么单讲时滤波加自适应、双讲是只滤波?
首先滤波就是在现有的信道估计w(n)情况下对参考信号x(n)进行估计,而自适应则是通过参考信号和mic信号进行参数w(n)的更新。
单讲:只有远端单讲,这个阶段的参考信号和mic信号没有近端语音,适合快速收敛进行回声信道估计。这个时候执行滤波加自适应。
双将:使用已经收敛的自适应滤波对远端参考信号进行估计,然后mic信号直接减去回收信号的估计值即可。这个时候只执行滤波不执行自适应,防止近端讲话对模型w(n)产生影响。
为什么需要自适应:
因为近端设备位置移动、环境变换造成回声传输信道的变更,回声信道变化所以信道估计w(n)也需要一直变换,需要在每次传输信道变化后都快速收敛。
如何检测单讲和双讲:
回声估计信号和对端参考信号和近端mic输入一次判断相关性。
延迟估计:
早先webrtc使用声纹对比在频域上通过时间的滑动来打分,找出打分最高部分则任务已经对齐但是检测效果和速度都不理想:
后来使用nlms来实现延迟估计:
算法能够估计512毫秒内的延迟,利用窗口和移动得到5个128毫秒的采样片段,每个128毫秒之间有32毫秒的重叠。每一块先16k下采样到4k,然后5块片段分别和
matlab的lms算法:
参考文档:
其中rrin为参考信号,ssin为期望信号,需要在单讲时获取纯净无近端mic输入的信号,这样才能得到回声传输信道w(n)一个比较好的估计。
注意为什么卷积计算 RRin(1,i-N+1:i)表示取第 i-N ~ i 一共 N 个列,这个N就是滤波器阶数,至少N个点参与计算也就是说允许的时延是有限的。如果时延越长则滤波器的长度就必须越长。
matlab的nmls算法:
对于lms算法,如果 x(n)太大会造成梯度放大,而x(n)太小会造成收敛速度太慢。
WebRTC的算法:
时延估计:
算法会缓存参考信号512毫秒内的音频数据,利用窗口和移动得到5个128毫秒的采样片段,每个128毫秒之间有32毫秒的重叠。每一块先16k下采样到4k,然后5块片段分别和1块mic信号进行对比(利用二元谱),如果相似则这两片128的采样片段就认为是对齐了,则计算出时延。这样就把时延缩短到了128毫秒内。此时nmls就不需要设置过大的阶数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值