webrtc 的回声抵消(aec、aecm)算法主要包括以下几个重要模块:回声时延估计;NLMS(归一化最小均方自适应算法);NLP(非线性滤波);CNG(舒适噪声产生)。一般经典aec算法还应包括双端检测(DT)。

考虑到webrtc使用的NLMS、NLP和CNG都属于经典算法范畴,故只做简略介绍,本文重点介绍webrtc的回声时延估计算法,这也是webrtc回声抵消算法区别一般算法(如视频会议中的算法)比较有特色的地方。

1) 回声时延估计
回声延时长短对回声抵消器的性能有比较大的影响(此处不考虑pc上的线程同步的问题),过长的滤波器抽头也无法实际应用,因此时延估计算法就显得比较重 要了。常用且容易想到的估计算法是基于相关的时延估计算法(学过通信原理的应该不会陌生),另外相关算法在语音编码中也得到广泛的应用,如 amr系列,G.729系列 ,G.718等编码器。在语音信号自相关求基音周期时,由于编码器一般按帧处理,帧长度一般是10或20ms,在该时延范围内搜索基音周期运算量较小,然 而对于回声抵消的应用场合,延时搜索范围比较大,带来很高的运算复杂度。在手持终端设备上,我们需要考虑移动环境的变化对算法性能的影响,比如时延是否随 机变化,反射路径线性还是非线性,以及运算量(电池)是否符合要求,则更为复杂。

回到webrtc的回声时延估计,它采用的是gips首席科学家Bastiaan的算法。下面介绍一下该算法的主要思想:

设1表示有说话音,0表示无说话音(静音或者很弱的声音),参考端(远端)信号x(t)和接收端(近端)信号y(t)可能的组合方式有以下几种:(0,0),(0,1),(1,0),(1,1),(0,0)表示远 端和近端都是比较弱的声音,(1,1)表示远端和近端都是比较强的声音,webrt的c代码默认其它两种情况是不可能发生的。设在时间间隔p上,即 p=1,2,…,P,  频带q,q=1,2,…,Q上,输入信号x加窗(如汉宁窗)后的功率谱用Xw(p,q)来表示,对每个频带中的功率谱设定一个门限 Xw(p,q)_threshold, 如果 Xw(p,q)  >= Xw(p,q)_threshold  ,   则Xw(p,q) =1;如果 Xw(p,q) <    Xw(p,q)_threshold  ,   则Xw(p,q) =0;同理,对于信号y(t),加窗信号功率谱Yw(p,q)和门限Yw(p,q)_threshold,如果 Yw(p,q) >= Yw(p,q)_threshold   ,   则Yw(p,q) =1;如果 Yw(p,q) < Yw(p,q)_threshold ,        则Yw(p,q) =0;考虑到实际处理的方便,在webrtc的c代码中,将经过fft变换后的频域功率谱分为32个子带,这样每个特定子带 Xw(p,q)的值可以用1个比特来表示,总共需要32个比特,只用一个32位数据类型就可以表示了。

webrtc对参考信号定义了75个32位binary_far_history的数组存放历史远端参考信号,定义了16个32位binary_near_history的数组存放历史近端参考信号,最近的值都放在下标为0的数组中,使用binary_near_history[15] 的32位bit与binary_far_history数组中75个32位bit分别按位异或,得到75个32位比特数据,32位bit的物理意义是近似 地使用功率谱来统计两帧信号的相关性。统计32位结果中的1的个数存于bit_counts中,接下来用对bit_counts进行平滑防止延时突变,得 到mean_bit_count,可以看出  mean_bit_count 越小,则表明近端数据与该帧的远端数据越吻合,两者的时延越接近所需要的延时数值,用 value_best_candidate表示。剩下的工作是对边界数值进行保护,如果value_best_candidate接近最差延时(预设), 则表明数值不可靠,这时不更新延时数据;如果数据可靠,则进一步使用一阶markvo模型,比照上一次时延数据确定本次最终的更新时延 last_delay。

Bastiaan的专利本身要比现有的c代码实现更为复杂,比如在异或的时候(0,0),(0,1),(1,0),(1,1)四种组合可以附加代价函数,而c代码相当于默认给(0,0),(1,1)附加权值为1,给(0,1),(1,0)附加权值为0;另外c代码算法是按帧顺序依次对远端和近端数组异或,实际应用时也可以每隔1帧或2帧做异或,这样可以扩大搜索范围。

总的来说webrtc的时延估计算法复杂度比求相关大大简化,尤其适用于移动终端等对运算量比较敏感的场合进行回声消除。针对实际应用场合,算法还有提升的空间。

2) NLMS(归一化最小均方自适应算法

LMS/NLMS/AP/RLS等都是经典的自适应滤波算法,此处只对webrtc中使用的NLMS算法做简略介绍。设远端信号为x(n),近段信号为d(n),W(n),则误差信号e(n)=d(n)-w'(n)x(n)  (此处‘表示转秩),NLMS对滤波器的系数更新使用变步长方法,即步长u=u0/(gamma+x'(n)*x(n));其中u0为更新步长因 子,gamma是稳定因子,则滤波器系数更新方程为 W(n+1)=W(n)+u*e(n)*x(n);  NLMS比传统LMS算法复杂度略高,但收敛速度明显加快。LMS/NLMS性能差于AP和RLS算法。

另外值得一提的是webrtc使用了分段块频域自适应滤波(PBFDAF)算法,这也是自适应滤波器的常用算法。自适应滤波的更多资料可以参考simon haykin 的《自适应滤波器原理》。

3) NLP(非线性滤波)

webrtc采用了维纳滤波器。此处只给出传递函数的表达式,设估计的语音信号的功率谱为Ps(w),噪声信号的功率谱为Pn(w),则滤波器的传递函数为H(w)=Ps(w)/(Ps(w)+Pn(w))。

4)CNG(舒适噪声产生)

webrtc采用的舒适噪声生成器比较简单,首先生成在[0 ,1 ]上均匀分布的随机噪声矩阵,再用噪声的功率谱开方后去调制噪声的幅度。

总的说来,webrtc的aec算法简单、实用、易于商业化,另一方面猜测c代码还有所保留。

由于工作需要,最近一直在研究WebRTC里的AEC算法。根据源码里面的fullaec.m文件,总体来说,我认为该AEC算法是属于分段快频域自适应滤波算法,Partioned block frequeney domain adaPtive filter(PBFDAF)。具体可以参考Paez Borrallo J M and Otero M G

使用该AEC算法要注意两点:

1)延时要小,因为算法默认滤波器长度是分为12块,每块64点,按照8000采样率,也就是12*8ms=96ms的数据,而且超过这个长度是处理不了的。

2)延时抖动要小,因为算法是默认10块也计算一次参考数据的位置(即滤波器能量最大的那一块),所以如果抖动很大的话找参考数据时不准确的,这样回声就消除不掉了。

转载自WebRTC中文社区(原文出处

【转帖】WebRTC回声抵消模块简要分析的更多相关文章

  1. webrtc 的回声抵消(aec、aecm)算法简介(转)

    webrtc 的回声抵消(aec.aecm)算法简介        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS(归一化最小均方自适应算法) ...

  2. 拓展 - Webrtc 的回声抵消(aec、aecm)算法简介

    webrtc 的回声抵消(aec.aecm)算法简介 原文链接:丢失.不好意思        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS( ...

  3. 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)

    单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 说实话很不想写这篇文章,因为这和我一贯推崇的最好全部编译并使用w ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...

  5. RxJava && Agera 从源码简要分析基本调用流程(2)

    版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qclo ...

  6. Android 5.1 Settings源代码简要分析

    转载请注明出处,谢谢~http://blog.csdn.net/u011974987/article/details/51004854. 概述: 先声明:本人工作快两年了,仍是菜鸟级别的.羞愧啊!曾经 ...

  7. 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)

    单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件) 单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件) webrtc的音频处理模块分为降噪ns,回音消除aec,回声 ...

  8. 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件)

    webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到 ...

  9. libco协程原理简要分析

    此文简要分析一下libco协程的关键原理. 在分析前,先简单过一些协程的概念,以免有新手误读了此篇文章. 协程是用户态执行单元,它的创建,执行,上下文切换,挂起,销毁都是在用户态中完成,对linux系 ...

随机推荐

  1. Devstack单节点环境实战配置

    本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...

  2. nginx分布式实例入门操作

    本文目的 前段时间学习WCF已经渐入佳境,完成了既定学习目标,转入分布式系统学习.本文技术路线是: 采用wcf实现分布式服务端和客户端,客户端部署于本地主机,nginx和WCF部署于虚拟机端(分别是三 ...

  3. SElinux(转)

    转自:http://www.361way.com/rh134-selinux/4653.html RH134小结(四)初识SElinux 2015年8月2日admin发表评论阅读评论   一.SEli ...

  4. python学习1-字符串数字基本运算以及if条件和while循环

    python学习1-字符串数字基本运算以及if条件和while循环 字符串表达形式共四种: name = "string" name = 'string' name = " ...

  5. Window下,前后端分离项目,登录权限验证中的,Redis相关操作

    [1]官网下载Redis(解压版) https://redis.io/download [2]切换到目录下打开DOS,执行指令启动Redis redis-server.exe redis.window ...

  6. Dede没见过的漏洞

    payload:plus/search.php?keyword=xxx&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&am ...

  7. MySQL中查询所有数据库占用磁盘空间大小

    查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), ...

  8. PHP Catchable fatal error: Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct()

    laravel 项目的根目录下 运行composer update之后,报了包含 PHP Catchable fatal error: Argument 2 passed to Illuminate\ ...

  9. drop database出现1010

    > drop database glc; ERROR (HY000): Error dropping database (can't rmdir './glc/', errno: 17) Fri ...

  10. 【JZOJ5431】序列操作

    description 一开始有n个非负整数hi,接下来会进行m次操作,第i次操作给出一个数c[i],要求你选出c[i]个大于零的数并将它们减去1. 问最多可以进行多少轮操作后无法操作(即没有c[i] ...