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. Python 中的json模块dumps参数详解

    1.什么是JSON 维基百科中的定义: JSON(JavaScript Object Notation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计.轻量级的资料交换语言,该 ...

  2. 【php】PHP中file_get_contents()与file_put_contents()函数细节详解

    file_get_contents函数 一般的也就是使用file_get_contents($url),但是关于这个函数还有很多没有注意到的地方. 先看关于手册: file_get_contents( ...

  3. obs-studio 二次封装(十)SDK 中添加降噪模块

    目录 介绍 添加降噪模块 介绍 在obs-studio封装(九)https://blog.csdn.net/lcalqf/article/details/111999838  ,分析了降噪实现过程,具 ...

  4. python xlrd课程_python中xlrd模块的使用详解

    一.xlrd的安装 打开cmd输入pip install xlrd安装完成即可 二.xlrd模块的使用 下面以这个工作簿为例 1.导入模块 import xlrd 2.打开工作薄 # filename ...

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

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

  6. python中selenium模块驱动谷歌详解

    python中selenium模块驱动谷歌详解 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中 ...

  7. python中xlrd模块的使用详解

    python中xlrd模块的使用详解 两个问题: 什么是xlrd模块? 为什么使用xlrd模块? 1.什么是xlrd模块? python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读 ...

  8. Burp Suite中Intruder模块的使用详解

    Burp Suite中Intruder模块的使用详解 Intruder(入侵者) Target(目标) Attack Target Positions(位置) Payload Positions Pa ...

  9. python怎么横着输出_对python3中, print横向输出的方法详解

    对python3中, print横向输出的方法详解 Python 2 : print打印的时候,如果结尾有逗号,打出来时候不会换行.但是在python3里面就不行了. Python3: 3.0的pri ...

最新文章

  1. DW数据仓库与ODS的区别
  2. 计算机实验11公式与函数,《大学计算机基础》实验报告十一——Excel2003公式与函数的应用.doc...
  3. 优化定制化abap代码必须遵守的经典黄金规则
  4. django项目简单调取百度翻译接口
  5. 台式机计算机删除,电脑c盘满了怎么清理 电脑c盘可以删除哪些文件
  6. NickLee.FortuneBase数据库sql server版工具篇
  7. yield next和yield* next的区别
  8. 初中计算机ppt教案,初中计算机ppt教案.doc
  9. 搜索表单制作语法:强大的搜索功能
  10. 通用权限底层研究:强大的分页功能
  11. 旋转矩阵(Rotation matrix):旋转轴与旋转角 ( axis and angle )
  12. 调用Python的PyAutoGUI模块中的doubleClick函数无反应
  13. 微信小程序,获取农历日期方法
  14. Spark worker内存不足导致任务失败,报错Likely due to containers exceeding thresholds, or network issues
  15. PowerVR开发工具和SDK 2020 Release 1发布啦!
  16. 「镁客早报」微软总市值超过苹果亚马逊;Linux内核出现漏洞
  17. 【WIN10安装】拒绝第三方软件,纯净官网系统,U盘安装教程
  18. 牙齿间隙变大怎么办_牙缝大怎么办?
  19. linux dp接口显示,DP接口无法输出2K甚至1080分辨率·「已解决」
  20. 产品安全设计十大原则

热门文章

  1. ArcGIS提取图斑四至点,可不再是四至范围哦
  2. Fuzz测试之libfuzzer高频报错问题FAQ
  3. python且的表示_五种Python 的转义表示法
  4. REDMI K30 5G 刷EU版 magisk
  5. wireshark 过滤 post 请求
  6. eureka配置账号密码才能访问
  7. HealthKit 从健康app中获取步数信息
  8. java怎么把整数转成小数_Java - 常规 - 字符串转换为整数或小数
  9. java别踩白块_jquery之别踩白块游戏的简单实现
  10. 一个淘宝客劫持木马的分析