WebRTC中AECM算法简介

2023-11-13

1,算法介绍以及整体框架

1.1算法整体框架

AECM 属于 WebRTC 语音处理引擎(Voice Engine)的子模块,是为移动设备专门设计的回声消除处理模块,其内部有根据芯片类型进行汇编指令级的特殊优化。AECM 的主体工程文件可以从 WebRTC 工程根目录下的modules/audio_processing/aecm 子目录找到,包含 delay_estimator.cdelay_estimator_wrapper.c、aecm_core.c、aecm_core_c.c、echo_control_mobile.c 这五个回声消除的核心功能的 c 语言实现文件,其中 delay_estimator.c、delay_estimator_wrapper.c 用于回声时延的精确估计,aecm_core.c、aecm_core_c.c 则是回声消除的核心工作流程,包括将远端信号从缓冲区中取出、将信号转换到频域 、远端信号对齐、自适应滤波器更新以及回声消除等功能,echo_control_mobile.c 则是对核心功能的一层包装,它提供对外直接调用的接口函数,其 中 常 用 函 数 有 五 个 : WebRTCAecm_Create用于为核心数据结构分配内存,WebRTCAecm_Init 用于核心数据结构以及部分函数指针的初始化 ,WebRTCAecm_BufferFarend用于向回声消除模块写入远端信号,WebRTCAecm_Process 用于写入向回声消除模块写入近端信号并同时得到处理完成后的输出信号。WebRTCAecm_Free 在整个回声消除工作完成后释放内存,其中WebRTCAescm_Process 是回声消除算法的主体部分的入口,由它的内部包装了核心功能的调用。

1.2 工作流程

从图可以看到,AECM模块的自适应滤波、滤波器系数的更新以及回声消除工作都在频域进行,然后将处理后的频域信号变换到时域后直接输出。

在这里插入图片描述

从上一小节的介绍可知,AECM回声消除的主体功能都由WebRTCAecm_Process 函数内部调用,因此可以通过一步步分析其调用链来查看和分析 AECM 的核心工作流程。下图为 WebRTCAecm_Process 函数调用链示意图,其中横向箭头表示函数间嵌套调用,纵向箭头表示函数内顺序调用或处理过程,整个调用链比较复杂,因此笔者选择其中比较重要的几个函数和处理过程进行简要分析。

在这里插入图片描述

2,回声时延估计

WebRTCAecm_Process 只是一个上层的包装函数,它内部有一个容量为 4000 的环形缓存,用来缓存输入的远端信号,然后由传入的时延估计参数 msInSndCardBuf 计算出远端信号缓存的初始读取位置 readpos 用来完成远端信号和近端信号的初步对齐:
r e a d p o s = m s I n S n d C a r d B u f 1000 ∗ f ∗ 75 % readpos = \frac{msInSndCardBuf}{1000 }*f*75 \% readpos=1000msInSndCardBuff75%
其中 f 为抽样频率。当远端信号缓存中的数据未达到初始读取位置 readpos 时,则直接将输入近端数据复制到输出并直接返回;当缓存数据量达到 readpos,则在缓存中将数据从 readpos 处读取一帧出来并和当前近端信号帧后输入 WebRTCAecm_ProcessFrame 函数。由于 readpos 的存在,导致后续处理过程的远端信号和近端信号之间始终有长度为readpos 的时间差,从而使两个信号之间完成初步的对齐。

WebRTCAecm_ProcessFrame 的主要功能则是将传入的远端帧和近端帧数据分别存储到两个环形队列缓存中,根据上一帧计算的回声时延得到与当前近端帧相对应的远端帧在缓存中的位置,然后按照 64 个采样点为单位分块(Block),将指向每一个近端和远端数据块的指针输入 WebRTCAecm_ProcessBlock。

在 WebRTCAecm_ProcessBlock 中的处理过程依次按顺序有 10 个调用或处理过程,这里选取比较重要的几个过程进行阐述和分析。

2.1 将输入远、近端信号变换到频域

频域变换的主要实现过程在函数 TimeToFrequencyDomain 内部,它使用快速傅里叶变换将远端信号和近端信号变换到频域。在进行频域变换的时也是使用的定点数计算,输出信号频域表示也是采用定点数的形式。算法内部默认使用长度为 128 点 FFT 且不可更改。考虑到 FFT 可能会引起的印谱泄露和栅栏效应[49],AECM 在变换之前对时域信号采用加汉宁窗的方法缓解这一效应。汉宁窗也成升余弦窗,长度为 N 的离散汉宁窗为:
W H n = 1 2 ( 1 − c o s [ 2 Π N n ] ) , n = 1 , 2 , 3 , . . . . . , N − 1 W_{Hn}= \frac{1}{2}(1-cos[\frac{2Π}{N}n]),n=1,2,3,.....,N-1 WHn=21(1cos[N2Πn]),n=1,2,3,.....,N1
同时注意到,传入此函数数据为单个数据块,长度为 64,但是 FFT 运算的长度却是128即两个数据块,这是因为这里运用了重叠保留法(overlap-save)的技巧来处理线性卷积和周期卷积的问题。由数字信号处理基本理论可知,时域的卷积运算可以通过使用傅里叶变换将信号转换到频域,并利用频域的乘法计算后将结果用逆傅里叶变换转换到时域来代替。然而通过这种频域乘法的方法计算的卷积称为周期卷积,而在时域直接计算的卷积称为线性卷积,这两种卷积计算的结果有一定差异,但是它们的前边一部分是相同的。因此可以通过延长输入信号并取卷积计算的一部分作为结果,从而使周期卷积的结果等于线性卷积,这就是重叠保留法的原理。在 AECM 中具体实现过程为,将当前输入的数据块缓存起来,然后将上一次缓存的数据块与当前的数据块一起进行 FFT得到长度为 128 的频谱 X_k​。由于 FFT 的对称特性,所以只取变换结果的前 65 个频点取模后作为一个频域数据块输出。

2.2 计算回声时延并对齐远端频域数据块

回声时延的计算主要实现在函数 WebRTCAecm_DelayEstimatorProcessFix 内部,它首先从远端频域数据块的 65 个频点中选取序号为 12~43 的 32 个频点,将这 32 个频点值的均值作为门限 H,然后将这它们依次与门限值比较进行二值化,从而将每一个远端频域数据块转换为一个 32 位的无符号整型:
H = 1 32 ∑ i = 32 43 X i H = \frac{1}{32}\sum^{43}_{i=32} X_i H=321i=3243Xi

B i = c ( u ) = { 0 , X i − 22 < H 1 , X i − 22 ≥ H B_i=c(u)=\begin{cases} 0,X_{i-22}<H\\ 1, X_{i-22}≥H\end{cases} Bi=c(u)={0Xi22<H1Xi22H

其中 Xi 是远端频域块的第 i 个频点值,Bi 为二值化后的第 i 位二进制。将二值化后的 32位整型插入远端二值化整型缓存的最前端,其他数据依次后移,整个过程如下图所示。

在这里插入图片描述

在此之后,用相同的方法计算当前近端频域数据块的二值化整型 Db,然后遍历远端二值化整型缓存。将近端二值化整型与缓存中第 i 个历史数据 Xbi相做异或运算得到 di,取缓存中 di 最小的那个整型,它所代表的远端数据块与当前近端数据块的频谱差异最小,然后根据其在缓存中的位置来计算回声时延 delay,单位为 ms:
d i = D b 异 或 X b i , i = a r g { m i n { d 1 , d 2 , d 3 , . . . . d M } } d_i = D_b异或X_{bi},i=arg \{ min \{d_1,d_2,d_3,....d_M\}\} di=DbXbi,i=arg{min{d1,d2,d3,....dM}}

d e l a y = i ∗ N f ∗ 1000 delay = \frac{i*N}{f}*1000 delay=fiN1000

其中 M 为缓存长度,f=8000 或 16000 为抽样频率,N=64 为数据块长度。完成时延的计算后,紧接着会调用 WebRTCAecm_AlignedFarend 函数并传入时延 delay。该函数的功能为根据时延从远端的历史缓存中取出对应的远端频域数据块并返回,从而完成远端数据块和近端数据块的对齐。

从时延计算算法的流程可以看到,这里的远端二值化整型缓存长度 M 的大小决定了内部时延计算的最大范围。为了提高运算效率,内部的默认值设置为 10,因此如果抽样频率 f=16000Hz,那么的时延计算范围仅为 0 ~ 40 ms。根据 4.1 小节的分析,智能终端设备的回声时延范围 100~400ms,远远超出这里的计算范围。因此这里的回声时延计算以及远、近端数据块的对齐是以 WebRTCAecm_Process 函数中传入 msInSndCardBuf 时延估计参数为前提的,是在其基础上的一种更加精细的小范围内对时延的计算和对齐。如果 msInSndCardBuf 不准确,则将直接影响在这里回声时延计算的效率和准确性。

2.3 语音活动检测(VAD)

AECM 在 WebRtcAecm_CalcEnergy 函数中对远端信号进行 VAD。AECM 中远端信号的 VAD 有两个目的:第一个是判定远端信号中是否含有语音,将一个块内远端信号的以 2 为底的对数域能量值 E l o g E_{log} Elog 与判决门限 T1 的值进行比较,如果 E 大于 T1 则认为远端信号中存在语音,反之则认为远端语音不存在;另一个目的是控制滤波器系数的更新,对远端频谱的每个频点的值,在该点对应频域点的幅值设置一个门限 T2,在系数更新时会进行判决,只有当该点频域幅度值大于 T2 才会对该点的滤波器系数进行系数更新。

除了利用远端信号对数域能量值 Elog 进行 VAD,WebRTCAecm_CalcEnergy 还根据该值计算并保存了一些用于后续计算的能量中间状态值,如远端能量最大值 E m a x E_{max} Emax、和远端能量最小值 E m i n E_{min} Emin,其迭代计算规则如下:

在这里插入图片描述

其中 E m a x E_{max} Emax E m i n E_{min} Emin的初始值分别设置为-32767 和 32767。

3, 滤波器步长计算及系数更新

AECM 的滤波器系数更新采用的是频域变步长 NLMS 算法。在更新滤波器之前首先根据计算得带的时延通过调用函数 WebRTCAecm_CalcStepSize 计算以 2 为底的负对数域步长 mu,如果 VAD 的结果为不存在语音,则将步长设置为 0。然后将步长参数和远、近端频域数据块传入 WebRTCAecm_UpdateChannel 函数进行滤波器系数的更新。需要注意的是,AECM 内部默认采用双滤波器的结构进行系数更新。关于具体的更新算法可以参考 NLMS 算法的详细阐述,这里重点只介绍步长的计算方法。

根据上一小节中计算的能量中间状态值 E m a x E_{max} Emax ​和 E m i n E_{min} Emin ,负对数域的步长 mu 的计算式
如下:
m u = μ m i n − 1 − ( μ m i n − μ m a x ) E l o g − E m i n E m a x − E m i n mu = \mu_{min}-1-(\mu_{min}-\mu_{max}) \frac{E_{log}-E_{min}}{E{max}-E_{min}} mu=μmin1(μminμmax)EmaxEminElogEmin
其中 μ m a x μ_{max} μmax​和 μ m i n μ_{min} μmin​ 都是常数,分别是负对数域步长的最大值和最小值,AECM 内分别设定为 1 和 10。

4,后续处理步骤

3.1 NLP(非线性滤波)

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

3.2 CNG(舒适噪声产生)

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

这些操作都是对回声消除之后信号的修饰和完善,可以进一步提高通信质量。但是这些处理不是本文讨论的重点,因此在这里不做详细说明。

总结:在移动终端,由于回声时延很大程度上取决于设备的硬件或者操作系统设置,而 WebRtc 只是一个应用框架,它没有办法获知这些先验知识,因此它将问题交给应用开发人员,要求传入回声时延估计参数 msInSndCardBuf,然后由 AECM 内部在这个基础上进行回声时延的精确计算,因此传入的时延估计参数的准确性将影响到AECM 时延计算的效率和准确性。综上所述,传入参数 msInSndCardBuf 的值会根据设备的变化以及时延的波动而变化。

需要AECM源码可在下方评论或私信我!!!

参考文献:

  1. 《基于WebRtc的智能门禁系统回声消除方案,王亚楼》
  2. 《VoIP中一种基于WebRTC的回声消除改进算法,姚力》
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC中AECM算法简介 的相关文章

  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • WebRTC - 禁用所有音频处理

    我目前正在尝试通过 webrtc 获得尽可能干净的音频通道 通过 getUserMedia mediaconstraints 对象 我设置了以下选项 constraints audio mandatory echoCancellation
  • 在网络浏览器中实现一个好的 redis 客户端需要什么?

    之前已经有人问过这个问题我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗 https stackoverflow com questions 5759120 can i connect directly to
  • 适用于高带宽应用的 WebRTC 数据通道

    我想通过 WebRTC 数据通道发送单向流数据 并且正在寻找最佳配置选项 高带宽 低延迟 抖动 以及其他人在此类应用程序中的预期比特率的经验 我的测试程序发送 2k 的块 使用 2k 的 bufferedAmountLowThreshold
  • 使用 django 通道将 webRTC 视频流发送到服务器

    我正在尝试创建一个用 django 编写的人脸检测 Web 应用程序 该应用程序是这样工作的 用户导航到该 url 相机在客户端计算机上启动 然后将每一帧发送到服务器进行人脸检测 然后将处理后的帧显示在网页上 我知道我无法使用 opencv
  • 我们可以将多个 html5

    我有两个视频 一个用于流式传输我的webcam另一个共享我的桌面屏幕 窗户 我需要合并这两个媒体流合而为一 这样我就可以将其另存为 mp4 文件并广播它WebRTC 我能够将两者结合起来VIDEO 流 标签通过将它们限制为DIV tag d
  • 部署站点后,我无权访问 navigator.mediaDevices。我该如何解决?

    我目前正在尝试使用 WebRTC api 并让一切在本地运行 当我部署到surge sh我无法访问navigator mediaDevices目的 我该如何解决这个问题 以下代码行是我遇到问题的地方 const stream await n
  • 如何使用 MediaRecorder 作为 MediaSource

    作为学习 WebRTC 的练习 我试图并排显示本地网络摄像头和网络摄像头的延迟播放 为了实现这一目标 我尝试将记录的 blob 传递到 BufferSource 并使用相应的 MediaSource 作为视频元素的源 the ondataa
  • SignalR WebRTC WebSocket 已处于 CLOSING 或 CLOSED 状态

    我想测试运行 SignalR 和 WebRTC 的最简单实现 我将代码托管在https github com foyzulkarim WebRtc https github com foyzulkarim WebRtc 我制作了两个不同的文
  • WebRTC 无法从 USB 输入设备获取视频源(readyState 转为结束)

    我正在尝试使用 WebRTC 在屏幕上显示视频输入作为实时源 我不想进行任何点对点通信或类似的事情 只是显示视频源 我的代码对于我的笔记本电脑集成网络摄像头工作得很好 但是当我连接外部视频输入设备 在本例中是一台旧摄像机 使用 StarTe
  • 移动浏览器将以及何时支持 getUserMedia?

    我使用 前沿 HTML5 WebRTC API 编写了一个 Web 应用程序 请参阅下面的代码 这适用于 Chrome v20 启用了 MediaStream 标志 和最新的 FF Nightly 版本 17 0a1 创建了 media n
  • 是否可以从具有跨源数据的元素中捕获?

    我在 webRTC 文档中找到了这个简单的脚本 我尝试运行它 但似乎我遗漏了一些东西 const leftVideo document getElementById leftVideo const rightVideo document g
  • 独立移动应用程序上的 WebRTC

    我知道WebRTC是为浏览器设计的 但是可以直接在移动应用程序上使用WebRTC库吗 Thanks 截至5月14日here https github com pchab AndroidRTC是一个android项目 使用WebRTC效果很好
  • 如何运行媒体流

    我创建了一个网络摄像头流 navigator getUserMedia video true function stream videoTag src window URL createObjectURL stream videoTag p
  • 使用 Docker 的 mediasoup v3

    我正在尝试运行一个2docker 中的 WebRTC 示例 使用 mediasoup 当我在一组实例上进行视频通话时 我想运行两台服务器 我的错误 你有没有看到这个错误 createProducerTransport null 错误 由于地
  • Libsourcey 缺少 -fPIC 编译错误

    我正在尝试运行 LibSourcey 以使用 Webrtc 流服务器 问题是我似乎无法让它发挥作用 我努力在我的 Ubuntu 16 04 上 cmake 该项目 cmake 文件中的正则表达式 但现在它已修复 我实际上遇到的问题是编译时的
  • MediaStream 未处理的承诺拒绝:[object DOMError](在 Safari 11 中)

    在下面初始化 WebRTC 的方法中 我在 Safari Tech Preview 11 中遇到了未处理的承诺拒绝 具体来说 当我分配MediaStream像这样的视频元素 video srcObject event stream 堆栈跟踪
  • 无需画布/显示器即可拍摄隐形 WebRTC/视频照片

    我读了拍摄静态照片 https developer mozilla org en US docs Web API WebRTC API Taking still photos来自 MDN 的描述如何从网络摄像头捕获照片 使用视频元素和med
  • 使用 HTML5 或 Javascript 的 P2P 视频会议

    我正在尝试使用 html5 和 javascript 构建视频会议 直到现在我能够流式传输我的相机捕获并将其显示在画布上 这是代码
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s

随机推荐

  • ts中异步等待目标生成的办法

    async promise setimeout配合就行 其它有sleep的语言更简单 异步等待对象的生成 对象生成完成返回生成的对象 param getter 对象的获取函数 param checkSize 检查粒度 ms param ti
  • Python+OpenCV利用KNN背景分割器进行静态场景行人检测与轨迹跟踪

    前言 视频图像中的目标检测与跟踪 是计算机视觉的基础课题 同时具有广泛的应用价值 视觉目标 单目标 跟踪任务就是在给定某视频序列初始帧的目标大小与位置的情况下 预测后续帧中该目标的大小与位置 本篇文章介绍静态场景的目标检测与跟踪 主要思路
  • 三自由度焊接机器人设计(毕业设计说明书(论文)+12份CAD图纸、装配图、零件图)

    中文摘要 随着工业水平的发展 重要的大型焊接结构件的应用越来越多 其中大量的焊接工作必须在现场作业 如集装箱波纹板焊接机器人 大型舰船舱体 甲板的焊接 大型球罐 储罐 的焊接等 而这些焊接场合下 焊接机器人要适应焊缝的变化 才能做到提高焊接
  • 以SQLyog 为例连接数据库时出现1045错误时我的解决途径

    前言 这种解决方式除了能对遇到相同问题的readers提供帮助之外 当你今后在学习工作中使用其他软件再遇到类似问题时 希望也能想到这种思路并解决问题 第一步 启动SQLyog点击连接时出现如下错误 图1 第二步 检查我的mysql安装目录的
  • 关于glob.glob遍历文件

    我们经常会看到别人用glob 但是用glob时格式写的不规范往往会给人造成困扰 我们经常会有这个疑问 这到底是在遍历哪一层路径呢 下面我们就几种常见的glob用法给出总结 import glob 1 fdirs glob glob C Us
  • 将获取到的时间戳变成Date或者String 格式

    https blog csdn net u012031380 article details 52885120 1 时间戳的定义 时间戳是指文件属性里的创建 修改 访问时间 数字时间戳技术是数字签名技术一种变种的应用 在电子商务交易文件中
  • C++socket编程(三):3.3 bind端口

    在socket编程中 我们要用到bind绑定socket套接字 用上了你前面的逻辑创建的socket 如下代码 绑定 用bind绑定 绑定哪一个端口 if bind sock sockaddr saddr sizeof saddr 0 pr
  • 设计一个学生类Student,包括数据成员:姓名、学号、二门课程(面向对象程序设计、高等数学)的成绩。

    1 设计一个学生类Student 包括数据成员 姓名 学号 二门课程 面向对象程序设计 高等数学 的成绩 2 创建一个管理学生的类Management 包括实现学生的数据的增加 删除 修改 按课程成绩排序 保存学生数据到文件及加载文件中的数
  • 蓝桥杯题库 算法提高非vip部分(C++、Java)代码实现(301-400)

    文章目录 ADV 301 字符串压缩 cpp java ADV 302 秘密行动 cpp java ADV 303 数组求和 cpp java ADV 304 矩阵转置 cpp java ADV 305 输出二进制表示 cpp java A
  • ad域下发策略_AD域部署软件自动下发

    今天介绍如何使用组策略自动将程序分发到客户端计算机或用户 您可以通过以下方法使用组策略分发计算机程序 创建一个共享网络文件夹 将您要分发的 Microsoft Windows 安装程序包 msi 文件 放入此文件夹 对该共享设置权限以允许访
  • (elementui-图片预览)el-dialog+el-image图片显示问题

    项目场景 有一个修改的页面 这个页面有个预览按钮 其实点击图片使用v viewer已经实现了预览的功能了 现在做的是另一套方案 el image中预览图片 问题描述 当el dialog el image是直接写在addOrupdate v
  • boost升压电路解析

    1 boost拓扑 基本原理 1 1 电路接好 C上已经有电压 1 2 Q导通 电感储能 1 3 Q关断 电感释放能量 再次向C充电 使其高于Vi Vo Vin 1 D 极性相同 升压 2 元器件 开关管Q 储能电感L 整流二极管D 防止环
  • 单反相机的照片删了如何恢复

    单反相机的照片删了如何恢复 单反相机照片 视频等数据一般都储存在内存卡里 这是可以恢复的 当然 前提是没有被新数据覆盖 如果需要恢复的话 通常也都需要借助数据恢复软件 失易得数据恢复 进行修复 大部分软件在操作时都 第一步 打开 失易得数据
  • 如何利用J-Link烧写进行程序烧写

    1 准备工作 1 1硬件准备 准备一个烧写器 如下图所示 1 2软件准备 需要JLink软件安装包和驱动 如下图所示 JLink 652e rar为软件安装包 ST LINK V2 zip为驱动文件 首先安装J Link软件 解压第一个压缩
  • STM32小知识

    为什么电压常见3v3和5v 因为早期单片机用的都是TTL电平 TTL电平信号规定 5V等价于逻辑 1 0V等价于逻辑 0 采用二进制来表示数据时 这样的数据通信及电平规定方式 被称做TTL 晶体管 晶体管逻辑电平 信号系统 这是计算机处理器
  • css修饰边框为虚线,css如何设置虚线边框css虚线样式?css设置虚线边框的方法示例...

    首页 gt web前端 gt css教程 gt 正文 css如何设置虚线边框 css设置虚线边框的方法示例 原创2018 10 在网页布局中 有时候为了整体网页的美观可能需要设置虚线边框 那么虚线边框怎么设置呢 本篇文章就来给大家介绍一下如
  • arduino下载库出错_纯干货!关于Arduino 库在多种操作系统安装使用最详细、最全面的指南及常见问题解决办法!...

    什么是Arduino 库 Arduino库是一种共享开源代码 如设备驱动程序或常用实用程序函数 的最方便方式 Arduino 库是这个开源平台最大的特色之一 正是有了海量的Arduino开源库 让你无需花时间去了解和学习处理器底层的驱动程序
  • vue动态样式通过计算属性绑定的方法

    div class fayuan item typeName div
  • 超点图论文网络环境配置

    超点图环境配置 前言 一 检查环境情况并安装 1 检查是否安装有NVIDIA驱动 2 检查是否安装cuda 3 检查是否安装pytorch 4 安装相应库文件 二 常见问题 1 输入nvcc报错 总结 前言 提示 本文参照文章进行配置 环境
  • WebRTC中AECM算法简介

    1 算法介绍以及整体框架 1 1算法整体框架 AECM 属于 WebRTC 语音处理引擎 Voice Engine 的子模块 是为移动设备专门设计的回声消除处理模块 其内部有根据芯片类型进行汇编指令级的特殊优化 AECM 的主体工程文件可以