基于MCRA-OMLSA的语音降噪(一):原理

前面的几篇文章讲了webRTC中的语音降噪。最近又用到了基于MCRA-OMLSA的语音降噪,就学习了原理并且软件实现了它。MCRA主要用于噪声估计,OMLSA是基于估计出来的噪声去做降噪。类比于webRTC中的降噪方法,也有噪声估计(分位数噪声估计法)和基于估计出来的噪声降噪(维纳滤波),MCRA就相当于分位数噪声估计法,OMLSA就相当于维纳滤波。本文先讲讲怎么用MCRA和OMLSA来做语音降噪的原理,后续会讲怎么来做软件实现。

一, MCRA

MCRA的全称是Minima Controlled Recursive Averaging(最小值控制的递归平均),是cohen提出的一种常用的噪声估计方法,具体见论文《Noise Estimation by Minima Controlled Recursive Averaging for Robust Speech Enhancement》。 从名字就可看出这个方法主要包括两部分,最小值控制和递归平均。 最小值控制用来算语音存在概率,递归平均用来做噪声估计,即基于语音存在概率做噪声估计。先定义一些名称,然后分别看这两部分。用l表示第l帧,k表示第k个频点,Y(k, l)表示带噪语音第l帧的第k个频点的幅度谱,N(k, l)表示噪声第l帧的第k个频点的幅度谱,S(k, l)表示干净语音第l帧的第k个频点的幅度谱,H0(k, l)表示第l帧的第k个频点上只有噪声,H1(k, l)表示第l帧的第k个频点上有语音。P(H1(k, l) | Y(k, l)) 表示第l帧的第k个频点上是语音的概率,P(H0(k, l) | Y(k, l)) 表示第l帧的第k个频点上是噪声的概率,显然P(H0(k, l) | Y(k, l)) + P(H1(k, l) | Y(k, l)) = 1。

1,  用最小值控制来算语音存在概率

前面的文章( webRTC中语音降噪模块ANS细节详解(四) )讲过webRTC的ANS是基于似然比等来算语音存在概率。而这里是用最小值控制来算语音存在概率,即基于当前带噪语音的能量谱与指定长度帧内带噪语音的能量谱的最小值的比值来计算,具体如下:

1)  对带噪语音的能量谱做频域平滑和时域平滑

从上式可见,平滑窗的长度是奇数(2w + 1),系数是b(i)。

其中,αs (0 < αs < 1)是平滑因子。

2)  搜索能量谱最小值

定义Smin(k, l)和Stmp(k, l),并对它们初始化如下:

然后按频点从第一帧开始逐帧比较:

当到第L帧后:

后面以L帧为一个周期,重复上面两步,得到这个周期内的Smin(k, l)和Stmp(k, l)。搜索窗的帧长度L会影响到噪声的跟踪速度,一般按照经验选0.5s~1.5s左右。

3)  计算语音存在概率

定义Sr(k, l)为当前帧相应频点的能量谱与最小值的比值,即

再定义二值I (k, l)如下:

最终语音存在概率通过下式得到:

其中,αp (0 < αp < 1)是平滑因子。此处的p(k, l)就是P(H1(k, l) | Y(k, l))。为书写方便,下文用p表示P(H1(k, l) | Y(k, l)),用1-p表示P(H0(k, l) | Y(k, l))。

2,  用递归平均来估计噪声

通常认为噪声都是加性噪声,所以有下式:

定义σ(k, l)表示第l帧的第k个频点上的噪声能量谱。这里噪声更新的思路如下:当语音不存在时更新噪声的估计,当语言存在时用前一帧的噪声估计值作为当前噪声的估计值,表示如下式:

 

其中,αd (0 < αd < 1)是平滑因子。

所以噪声能量谱的估计如下式(p = P(H1(k, l) | Y(k, l)),为语音存在概率):

αd是tuning出来的,每个频点上的语音存在概率是上面基于最小控制的方法算出来的,上一帧估计出来的噪声能量谱σ(k, l-1)和当前帧的带噪语音的能量谱均已知,这样当前帧的估计出来的噪声的能量谱就可求出了。

通常令

这样上式就可写成下式:

 

这就是噪声估计的数学表达式。

二, OMLSA

噪声估计出来后就要基于它做降噪了。这里用的是OMLSA(Optimally Modified Log-Spectral Amplitude Estimator,最优修正的对数幅度谱估计),依旧是cohen提出来的,论文是《Optimal Speech Enhancement Under Signal Presence Uncertainty Using Log-Spectral Amplitude Estimator》。OMLSA是MMSE-LSA的改进算法,目的是得到增益gain。算法推导有些复杂,这里只给出gain的表达式,如下:

其中

Gmin为预先设定的值,p(k, l)是语音存在概率。这里

,

ξ(k, l)是先验性噪比,γ(k, l)是后验性噪比。先验性噪比和后验性噪比在文章(webRTC中语音降噪模块ANS细节详解(一) )中讲过。后验性噪比的计算基于上面用MCRA估计出来的噪声,

,

先验性噪比计算依旧用文章( webRTC中语音降噪模块ANS细节详解(三) )中提到的DD方法,表达式如下: 

 

其中,αSNR (0 < αSNR < 1)是平滑因子。

G(k, l)得到后,降噪后干净语音的每个频点的幅度谱可通过下式得到:

S(k, l) = G(K, l)Y(k, l)

以上就是基于MCRA-OMLSA的语音降噪原理。这里需要指出的是噪声估计和语音降噪相对独立,有不同的组合方式来降噪,比如MCRA也可以和维纳滤波结合来降噪。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目前,语音降噪算法有很多种。频谱减法有原理简单、容易实现的优点,是 语音降噪的常用算法。但是频谱减法也有如下两个缺点:一是频谱减法性能的好 坏主要依赖于噪声估计,而噪声估计又依赖于端点检测算法。在噪声水平强度高 时,一般的端点检测算法会失效,无法检测出信号中噪声帧的具体位置,从而影 响了噪声估计值的准确性;二是带噪信号经过频谱减法降噪后,由于在谱减时减 去的是同一噪声估计值,就使得信号会随机出现分离的谱区,这些谱区就形成了 容易让人耳听觉疲惫的“音乐噪声”。 针对频谱减法上述的两个缺点,本文对其进行了改进。第一:为了使得噪声 端点检测算法在噪声水平高时也能获得正确的检测,我们求带噪信号的幅度值均 值,并根据这个均值与带噪信号开始数帧的幅度均值大小来判断带噪信号是以噪 声开始还是以带噪语音信号开始。然后根据连续两帧信号的差值的变化来判断噪 声帧和语音帧的起始位置,同时我们在判断的同时把得到的均值做为噪声估计值, 这样既考虑到了连续前后两帧信号的相关性又能够衰减噪声。除此之外,基于本 文改进的噪声端点检测方法的噪声估计值能够在整个带噪语音信号上快速的更新 噪声估计值,提高频谱减法的实时处理能力。第二:为了减少频谱减法所引入的 音乐噪声,我们实现了用 LMS 算法在时域上进行语音增强,来处理谱减后的降噪 信号。LMS 算法能够在降低噪声水平的同时把音乐噪声转换为能量更低的白噪声, 减少了音乐噪声对人耳的刺激,有助于提高处理后的音频的语音质量,提高主客 观评价效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值