单通道语音增强之维纳滤波(四)

4.1 维纳滤波算法在工程中的应用

  维纳滤波的思想,除了被应用在语音增强领域,还在其他工程领域,比如图像增强、飞机盲着陆、地震数据处理、抗多址干扰盲检测等领域都有所应用。维纳滤波这种以最小均方误差的准则进行线性滤波的方法,在很多对干扰信号的进行处理的工程领域都表现出了十分不错的性能。因此,对于维纳滤波的学习,我认为不应该只是停留在学术领域,不应该只是回顾、比较一些在学术领域大名鼎鼎的维纳滤波算法就行了,我们还需要从实际的工程角度出发,去看看维纳滤波在具体的工程项目中是如何去实现的。所以,在维纳滤波的最后这个专题中,我想从具体的工程实例出发,进一步地对维纳滤波算法进行分析。

4.2 工程应用实例

  在这一节中,我要介绍的是欧洲电信标准化协会(ETSI)于2007年提出的一套应用于分布式语音识别系统( Distributed Speech Recognition System)的标准ETSI ES 202 050 V1.1.5。这套标准包含的算法有很多,包括前端特征提取算法、附加参数提取算法、低传输速率的特征压缩算法、传输错误保护算法、通道错误缓解的解码算法以及一些用于后端基音提取、基音平滑和语音合成的算法。其中,前端特征提取算法部分,采用了维纳滤波的方法来实现对语音信号的降噪预处理,以提高后端语音识别的鲁棒性和准确率。接下来,我就将对该标准中的维纳滤波降噪部分进行详细地理论分析和实验测试。

这里写图片描述
图一 降噪算法整体架构

  图一便是ETSI ES 202 050 V1.1.5标准中,应用于前端特征提取的降噪算法架构,整套算法的核心思想采用的是我在专题(三)中介绍的基于先验信噪比的维纳滤波算法,只不过在ETSI的这套降噪算法中,算法的作者利用了两级维纳滤波进行改进,并在增益函数的求解过程中加入简单的迭代思想,以得到更好的增益函数估计值。此外,作者还利了用Mel域三角滤波器组将维纳滤波系数转换到与语音感知相关的Mel域,然后再转换到时域对信号进行滤波,不仅充分考虑了人耳的听觉特性,还进一步减少了滤波器的抽头数,大大降低的运算量,可以很好地满足信号的实时性处理。为了方便分析,且便于比较ETSI标准中改进后的维纳滤波算法的性能好坏,我这里就只整理出了一级维纳滤波的算法(因为第二级滤波的方法基本是一样的,只是进行了简单的级联和增益控制而已),并对其降噪的性能进行简单地实验测试。

4.2.1 算法的基本原理

这里写图片描述

图二 ETSI标准的第一级维纳滤波算法

  如图二所示,在ETSI标准的第一级维纳滤波算法中,首先通过Spectrum Estimation 模块来计算输入帧的功率谱, 然后PSD Mean模块对前后帧之间的功率谱取均值得到时间平滑后的功率谱。同时,VADNest模块会对输入的每一帧语音信号进行监测,判定当前帧是语音帧还是纯噪声帧,如果是噪声帧就进行噪声估计,如果是语音帧就采用前面帧估计的噪声值。接下来,根据PSD Mean模块的输出和VADNest模块的输出,在Wiener filter Design模块中,完成对线性频率滤波器系数的计算,然后用Mel Filter-Bank(梅尔滤波器组)进行滤波,得到Mel-Warped维纳滤波系数,最后再进行Mel IDCT(梅尔逆变换)得到Mel-Warped维纳滤波器的时域冲击响应,并由Apply Filter模块对滤波器冲击响应和输入语音信号进行时域卷积,从而实现整个维纳滤波过程。第二级维纳滤波降噪的步骤和第一级降噪是基本相同的,最大的不同是在求完Mel尺度各子带滤波系数后,会通过一个Gain Factorization模块中对系数进行了增益处理,对SNR较低的信号帧利用增益处理作更深度的噪声消除,而对SNR较高的信号帧则通过减小滤波系数增益以减低滤波器影响,从而降低噪声消除深度。通过这样的处理,进一步降低了噪声信号的幅度,同时尽可能保留语音信号,有利于提高识别的准确率。另外,在第二级维纳滤波的最后还有一个OFF模块,该模块通过一个衰减滤波器用来消除直流分量。当然,如果我们只采用第一级滤波的话,就需要把这个OFF模块加在第一级维纳滤波的最后,来构成完整的一级降噪算法。

  接下来,我就针对整个算法最核心的部分,也就是维纳滤波算法的增益函数求解部分进行分析,下面就是其相关的C语言源代码。其中,PSDMeaned是平滑后的输入信号幅度谱,noiseSE是估计的噪声幅度谱,denSigSE是增强后的信号幅度谱,W是频域维纳滤波增益函数。

    /*-------------------------------------------
	 * VAD based Noise Estimation (in magnitude)
	 *-------------------------------------------*/
	//NS_NB_FRAME_THRESHOLD_NSE=100
	//NS_LAMBDA_NSE=0.99
	//lambdaNSE 是噪声的平滑因子
	if (nbFrame < NS_NB_FRAME_THRESHOLD_NSE)                     
		lambdaNSE = 1 - 1 / (X_FLOAT32)nbFrame;
	else
		lambdaNSE = NS_LAMBDA_NSE;

	if (flagVAD == 0)//只在无语音帧更新噪声
	{
		for (i = 0; i < NS_SPEC_ORDER; i++)
		{
			noiseSE[i] = lambdaNSE * noiseSE[i] + (1 - lambdaNSE) * PSDMeaned[i];
			if (noiseSE[i] < NS_EPS) noiseSE[i] = NS_EPS;
		}
	}


	/*--------------------------------------------------*
	 *      noise suppression filter calculation        *
	 *--------------------------------------------------*/
	 
	for (i = 0; i < NS_SPEC_ORDER; i++)//NS_SPEC_ORDER=65,i为频率索引
	{
		
		/*NS_BETA = 0.98,采用判决引导的方法计算先验信噪比*/
		NSX->SNRpost = (PSDMeaned[i] / noiseSE[i]) - 1;
		SNRprio = NS_BETA * (denSigSE[i] / noiseSE[i]) + (1 - NS_BETA) * max(0, NSX->SNRpost);

		/*计算基于先验信噪比的增益函数*/
		W[i] = SNRprio / (1 + SNRprio);

		/*利用一次迭代重新计算增益函数,可以得到更精准的先验信噪比估计值*/
		SNRprio = W[i] * PSDMeaned[i] / noiseSE[i];//计算新的先验信噪比
		SNRprio = max(SNRprio, NS_RSB_MIN);//设置先验信噪比的下限
		W[i] = SNRprio / (1 + SNRprio);//得到新的增益函数估计值
		denSigSE[i] = W[i] * nSigSE[i];//计算得到增强后的信号幅度谱,留作下一帧用
	
	}

  在ETSI标准中的这套维纳滤波算法,它跟我们之前介绍的维纳滤波算法还是有很大不同的。它先是在频域去计算增益函数,然后再根据增益函数值去设计一个17抽头的滤波器,来实现时域的滤波。因此,可以说这套维纳滤波算法是基于频域维纳滤波思想的时域实现方法。为了求得最后的17个时域滤波器系数,该算法也是大费周折,从频域到梅尔域,再到时域,融入了人耳听觉特性(梅尔滤波器组滤波),才得到最后的17个时域滤波器系数。

  接下来详细介绍一下ETSI算法计算滤波器系数的整个过程,首先对256个点(对200个采样点加窗处理后,然后补56个0,称为处理帧,而采样帧帧长为80个点)做傅里叶变换并求其幅值,去除重复的部分,还剩129个点,紧接着进行PSD平滑,得到65个点,也就是说每一处理帧只得到了频域的65个增益函数值。接下来,变换到梅尔域,并利用20个梅尔滤波器进行滤波得到20个增益系数,随后进行梅尔逆离散余弦变换回到时域,得到时域的20个维纳滤波器系数,最后在Apply Filter模块,对20个维纳滤波器系数进行镜像处理并截断,才得到最终的17个时域滤波器系数。由此可见,这里运用到的维纳滤波,跟我们的前面提到的所有维纳滤波算法还是有很大不同的,不过,虽然它实现的方式有些不同,但是其核心思想没有变,其本质还是基于先验信噪比的增益函数求解思想(Scalart算法,1996)。因此,不拘泥于算法本身,能够灵活运用,才算得上是算法界的集大成者。另外,还有一点需要说明,ETSI的这套算法每帧采200个点(重叠120个点)进行分析,计算出17个时域滤波器的系数,但是只对每一个处理帧的前80个点进行卷积运算,输出80个点的滤波结果。这便是典型的用非因果方法来实现的非因果解的维纳滤波器,所以相较于因果方法近似的非因果解,其更加准确,性能也会更好。

4.2.2 算法的实验测试

  接下来,我们进行实验测试算法的性能,从NOIZEUS语音库中,摘取一段采样率为8kHz的纯净语音,并与白噪声混成0dB和15dB的两段带噪语音。利用ETSI的降噪算法进行降噪处理,并与维纳滤波专题(三)中介绍的无约束的基于先验信噪比的维纳滤
波算法(Scalart, P. 1996)进行比较,得到其时域波形图如下所示。当然,为保证对比的公平性,两者都采用无语音帧进行噪声更新的方法来估计噪声。

这里写图片描述
图三 纯净语音信号时域波形图

这里写图片描述
图四 两种算法0dB和15dB增强后语音的时域波形图

  图三是纯净语音信号的时域波形图,图四是ETSI算法和Scalart算法对0dB和15dB带噪语音进行增强后的语音时域波形图,其中左上角为Scalart算法增强后的0dB带噪语音,右上角为ETSI算法增强后的0dB带噪语音,左下角为Scalart算法增强后15dB带噪语音,右下角为ETSI算法增强后的15dB带噪语音。从上面的实验波形图可以看出,在低信噪比的情况下(0dB),ETSI算法可以抑制更多的噪声,但是也带来了语音信号的消除,语音失真更大。主观听音测试发现,ETSI算法增强后的0dB语音,相比于Scalart算法,听起来更加舒适,残留噪声也不会像Scalart算法那样刺耳,但是可以明显地感觉到语音音量的降低和语音信号的失真。在高信噪比的情况下(15dB),ETSI算法和Scalart算法的噪声抑制能力不相上下,语音失真程度也基本差别不大,主观听音测试发现,ETSI算法增强后的语音更加自然雄浑,残留噪声更加舒适自然,基本不会察觉,而Scalart算法增强后的语音相对来说,更加尖锐,残留噪声也比较明显。因此,虽然取自相同的算法思想,但ETSI的这种处理方式,以及其与梅尔滤波相结合的时域滤波方法,具有更好的效果,尤其是在高信噪比的情况下,但它也有其需要改进的地方,比如说在低信噪比下出现的语音幅值降低的问题。总之,“算法没有上限,只有一步步地完善。”,致所有像我一样的算法工作者。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值