webRTC中语音降噪模块ANS细节详解(一)

ANS(adaptive noise suppression) 是webRTC中音频相关的核心模块之一,为众多公司所使用。从2015年开始,我在几个产品中使用了webRTC的3A(AEC/ANS/AGC)模块。以前仅仅是使用,对其中的算法原理只是初步了解。近半年来,我利用业余时间在看着《语音增强:理论与实践》和《实时语音处理实践指南》这两本书,对降噪算法有了更深的理解,同时又对ANS的代码进行了调试,基本掌握了算法实现。我想把我对ANS的理解写出来。由于内容细节较多,就出一个系列吧。webRTC中的ANS是基于维纳滤波来降噪的,本篇就先讲讲维纳滤波的基本原理。

 

如图1所示,输入信号y(n)经过一个滤波器后产生一个输出信号x(n),希望x(n)尽量逼近期望信号d(n)。这可以通过计算估计误差e(n)并使其最小化来实现,能够最小化这个估计误差的最优滤波器叫做维纳滤波器。

webRTC中语音降噪模块ANS细节详解(一)

通常维纳滤波器为线性的,且是FIR滤波器,因为FIR滤波器是稳定的,以及它是线性的方便计算。因而滤波器输出x(n)可以写成式1:

webRTC中语音降噪模块ANS细节详解(一)                                                       (1)

其中h(k)为滤波器系数,M为滤波器个数,即是M阶的滤波器。x(n)可以改写成式2:

webRTC中语音降噪模块ANS细节详解(一)                                                                                               (2)

其中h为M行1列的滤波器系数向量,y为M行1列的包括过去M个样本的输入向量。h和y表示如下:

webRTC中语音降噪模块ANS细节详解(一)

所以webRTC中语音降噪模块ANS细节详解(一)是一个实数值。

估计误差e(n)可以表示如式3:

webRTC中语音降噪模块ANS细节详解(一)                                                                     (3)

为了找到最优的滤波器系数,得求估计误差的统计均方值,即式4:

webRTC中语音降噪模块ANS细节详解(一)                                                                                                   (4)

其中E[•]表示期望。因为

webRTC中语音降噪模块ANS细节详解(一)

所以

webRTC中语音降噪模块ANS细节详解(一)

 令

webRTC中语音降噪模块ANS细节详解(一)

从而得到式5:

webRTC中语音降噪模块ANS细节详解(一)                                                             (5)

展开后得到如下系列式子:

 webRTC中语音降噪模块ANS细节详解(一)

因为

webRTC中语音降噪模块ANS细节详解(一)

所以

webRTC中语音降噪模块ANS细节详解(一)

定义webRTC中语音降噪模块ANS细节详解(一)表示两个输入值之间的自相关,n表示序列差。所以:

webRTC中语音降噪模块ANS细节详解(一)

再定义webRTC中语音降噪模块ANS细节详解(一)表示输入值和期望输出值之间的互相关,n表示序列差。所以:

 webRTC中语音降噪模块ANS细节详解(一)

所以上面式子5可以改写成式子6

webRTC中语音降噪模块ANS细节详解(一)      (6)

展开后得式7:

 webRTC中语音降噪模块ANS细节详解(一)                                 (7)

再改写成如下形式,得到式8:

webRTC中语音降噪模块ANS细节详解(一)                                                 (8)

上面的式8是有限脉冲响应滤波器。再来考虑一种双边的无限脉冲滤波器,形式如式9:

webRTC中语音降噪模块ANS细节详解(一)                                                        (9)

则式8可写成式10:

webRTC中语音降噪模块ANS细节详解(一)                                              (10)

写成卷积形式,得到式11:

webRTC中语音降噪模块ANS细节详解(一)                                                                                         (11)

对两边做傅里叶变换,时域卷积变成频域就是乘积,所以得到式12:

webRTC中语音降噪模块ANS细节详解(一)                                                                                      (12)

其中webRTC中语音降噪模块ANS细节详解(一)是输入的自功率谱,自功率谱等于自相关的傅里叶变换。webRTC中语音降噪模块ANS细节详解(一) 是输入与输出的互功率谱,互功率谱等于互相关的傅里叶变换。所以得到式13:

webRTC中语音降噪模块ANS细节详解(一)                                                                                                  (13)

上式就是频域维纳滤波器的一般形式。

 

如果要把维纳滤波用到语音降噪上,图1中的y(n)就是带噪语音信号,x(n)就是纯净语音信号。假设n(n)表示噪声信号,如果只考虑加性噪声,则带噪语音信号、纯净语音信号和噪声信号的关系如下:y(n) = x(n) + n(n),做傅里叶变换后的表达式如下:

webRTC中语音降噪模块ANS细节详解(一)

 假设噪声与语音不相关且具有零均值,则

 webRTC中语音降噪模块ANS细节详解(一)

 webRTC中语音降噪模块ANS细节详解(一)

其中webRTC中语音降噪模块ANS细节详解(一)表示纯净语音的自功率谱,webRTC中语音降噪模块ANS细节详解(一)表示噪声的自功率谱。

webRTC中语音降噪模块ANS细节详解(一)webRTC中语音降噪模块ANS细节详解(一)带入式13可得式14:

webRTC中语音降噪模块ANS细节详解(一)                                                                               (14)

如果定义webRTC中语音降噪模块ANS细节详解(一)为频点为webRTC中语音降噪模块ANS细节详解(一)时的先验信噪比(prior SNR,表示纯净语音和噪声的功率比值,后验信噪比(post SNR)表示带噪语音和噪声的功率比值) ,则式14可以表示为式15:

webRTC中语音降噪模块ANS细节详解(一)                                                                                          (15)

式15就是维纳滤波器的通用的表示形式,是用先验信噪比来表示的。webRTC里的ANS就是基于这个表达式做语音降噪的。下篇将讲ANS的处理流程以及语音信号在时域和频域相互转换时的一些细节。

 

上一篇:HLS与WebRTC,哪种技术能带来最佳的实时视频流体验?


下一篇:硬核讲解:编译webrtc协议为什么需要turn服务器?