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)并使其最小化来实现,能够最小化这个估计误差的最优滤波器叫做维纳滤波器。

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

                                                       (1)

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

                                                                                               (2)

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

所以是一个实数值。

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

                                                                     (3)

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

                                                                                                   (4)

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

所以

从而得到式5:

                                                             (5)

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

因为

所以

定义表示两个输入值之间的自相关,n表示序列差。所以:

再定义表示输入值和期望输出值之间的互相关,n表示序列差。所以:

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

      (6)

展开后得式7:

                                 (7)

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

                                                 (8)

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

                                                        (9)

则式8可写成式10:

                                              (10)

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

                                                                                         (11)

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

                                                                                      (12)

其中是输入的自功率谱,自功率谱等于自相关的傅里叶变换。 是输入与输出的互功率谱,互功率谱等于互相关的傅里叶变换。所以得到式13:

                                                                                                  (13)

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

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

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

其中表示纯净语音的自功率谱,表示噪声的自功率谱。

带入式13可得式14:

                                                                               (14)

如果定义为频点为时的先验信噪比(prior SNR,表示纯净语音和噪声的功率比值,后验信噪比(post SNR)表示带噪语音和噪声的功率比值) ,则式14可以表示为式15:

                                                                                          (15)

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

webRTC中语音降噪模块ANS细节详解(一)的更多相关文章

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

    上篇(webRTC中语音降噪模块ANS细节详解(一))讲了维纳滤波的基本原理.本篇先给出webRTC中ANS的基本处理过程,然后讲其中两步(即时域转频域和频域转时域)中的一些处理细节. ANS的基本处 ...

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

    上篇(webRTC中语音降噪模块ANS细节详解(二))讲了ANS的处理流程和语音在时域和频域的相互转换.本篇开始讲语音降噪的核心部分,首先讲噪声的初始估计以及基于估计出来的噪声算先验信噪比和后验信噪比 ...

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

    上篇(webRTC中语音降噪模块ANS细节详解(三))讲了噪声的初始估计方法以及怎么算先验SNR和后验SNR. 本篇开始讲基于带噪语音和特征的语音和噪声的概率计算方法和噪声估计更新以及基于维纳滤波的降 ...

  4. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  5. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  6. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  7. angular-ngSanitize模块-$sanitize服务详解

    本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块. 要学习这个服务,先要了解另一个指令: ng-bing-html. 顾名思义,ng-bind-html和 ...

  8. angular-ngSanitize模块-linky过滤器详解

    本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个 ...

  9. 在ASP.NET 5应用程序中的跨域请求功能详解

    在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...

随机推荐

  1. Wiring in Spring: @Autowired, @Resource and @Inject 区别

    refer:https://www.baeldung.com/spring-annotations-resource-inject-autowire 主要是查找顺序不一致: @Resource Mat ...

  2. linnux安装多台redis

    安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar xzvf redis-4.0.8. ...

  3. pixhawk入门

    PX4 是软件名称,代码约30万行 Pixhawk是硬件名称 MissionPlanner是地面站名称 常见术语: WP:Way Point 航电 geofence:地理围栏 Rally Point: ...

  4. MySQL-SQL基础1

    p.p1 { margin: 0; font: 11px Menlo; background-color: rgba(128, 128, 128, 0.5); min-height: 13px } p ...

  5. 【Office Excel】vlookup函数的反向查找实例教程,不只是正向查找,还可以反向查找,实例讲解

    VLOOKUP 反向查询 众所周知,vlookup只能从左向右查找,而不能从右至左的反向查找.为此高手们设计了一个让无数新手迷惑的公式.今天优爱酷将彻底帮同学们解开这个迷团. [例]如下图所示要求根据 ...

  6. aes加解密后续问题contentType不是application/json时候后台解析请求对象request

    一.post请求的三种content-type 1.application/x-www-form-urlencoded 主要用于如下:1.1: 最常见的POST提交数据方式.1.2:原生form默认的 ...

  7. 动态拼接表达式——Expression

    我们在项目中会遇到以下查询需求吗? 比如需要查询出满足以下条件的会员: 条件组一:30-40岁的男性会员 条件组二:20-30岁的女性会员 条件组三:60-80岁性别未知的会员 条件组内是并且关系,但 ...

  8. sort-uniq-tr-cut命令 对文件处理相关操作

    目录: 一.sort命令 二.uniq命令 三.tr命令 四.cut命令 五.eval命令 一.sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 语法格式 sort [选项] ...

  9. 洛谷P1088——火星人(全排列+数学模拟)

    题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...

  10. 彻底解决Hive小文件问题

    最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...