WebRTC提供一套音频处理引擎,

包含以下算法:

AGC自动增益控制(Automatic Gain Control)

ANS噪音抑制(Automatic Noise Suppression)

AEC是声学回声消除(Acoustic Echo Canceller for Mobile)

VAD是静音检测(Voice Activity Detection)

这是一套非常经典,以及值得细细品阅学习的音频算法资源。

在前面分享的博文,也有提及音频相关知识点。

一些算法优化的知识点,由于历史的原因,

WebRTC的实现已经不是当下最优的思路。

但也是非常经典的。

例如:

AGE算法中的WebRtcSpl_Sqrt  快速开平方的实现。

可以采用如下汇编函数替换之:

static float fast_sqrt(float x) {
float s;
#if defined(__x86_64__)
__asm__ __volatile__ ("sqrtss %1, %0" : "=x"(s) : "x"(x));
#elif defined(__i386__)
s = x;
__asm__ __volatile__ ("fsqrt" : "+t"(s));
#elif defined(__arm__) && defined(__VFP_FP__)
__asm__ __volatile__ ("vsqrt.f32 %0, %1" : "=w"(s) : "w"(x));
#else
s = sqrtf(x);
#endif
return s;
}

现代很多cpu 汇编指令已经支持开平方的快速实现,

经过测试比对确实会比WebRtcSpl_Sqrt 快不少的。

关于开平方的快速实现,详情可以看下:

https://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi

做算法优化的同学,就放过开平方吧。

每个算法有两个基本指标,

性能,效果。

WebRTC 着力于音频通信,所以它对性能的要求是极高的。

而算法的性能的优化,绝大多数情况的思路,都是特例化。

以前在公司开技术分享会的时候,也分享过。

也就一句话,越靠近CPU,性能越快。

也就是除非要不得以,请不要写到硬盘上,然后再读上来。

因为硬盘离CPU太远了。

所以优化的思路也就非常明显了。

从快到慢的介质分别是

CPU的寄存器 -> CPU的缓存 -> 内存空间 -> 硬盘空间(磁盘)

所以 尽可能地要使用上层的资源,能用寄存器就用寄存器,

能往CPU的资源上靠,就要把算法数据结构和资源做得更加紧凑。

关于CPU的相关资源:

https://www.cpuid.com/softwares/cpu-z.html

可以下一个CPU-Z 查看一下。

抽丝剥茧,一定要了解CPU的结构性能信息。

然后对症下药,尽可能符合CPU的口味。

科普下算法优化的思路:

1.尽可能多用局部变量,编写最短,最有效的闭合函数。

为了编译处理的时候,能最终用上寄存器,去缓存。

2.尽可能少调用函数,参数最好是指针或引用传递,这样能减少拷贝,

当然,可以的话参数要尽可能地少。

3.处理的数据尽可能紧凑且少,数据对齐很大程度上,

就是为了符合CPU的喜好,用上它的缓存。

4.尽可能顺序读写,也是为了用上缓存资源

5.计算降级,一般情况下乘法比加法耗时,除法比乘法耗时。

浮点比整形耗时。

所以将乘法降为加法,将除法降为乘法,浮点降为整形(定点化)。

这一条大多数朋友若是不清楚为什么,可以移步资源:

https://github.com/ARM-software/CMSIS_5

阅读其中的一些实现,你会找到具体原因的。

这里就不展开了。

6.能用内存的,就不要用磁盘,我想这个没必要多解释了。

7.当然如果能用特定算法思路数据接口进行优化也是可以的,例如查表之类的。

好像有点跑题了,回到主题上。

抽空把以上提及的几个算法整理成

单文件实现的方式,并附加示例代码。

便于学习或者工程化之用。

相关项目地址:

https://github.com/cpuimage/WebRTC_AECM

https://github.com/cpuimage/WebRTC_NS

https://github.com/cpuimage/WebRTC_VAD

https://github.com/cpuimage/WebRTC_AGC

路漫漫其修远兮,一条道走到黑。

用cmake即可进行编译示例代码,详情见CMakeLists.txt。

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

WebRTC 音频算法 附完整C代码的更多相关文章

  1. 音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

  2. mser 最大稳定极值区域(文字区域定位)算法 附完整C代码

    mser 的全称:Maximally Stable Extremal Regions 第一次听说这个算法时,是来自当时部门的一个同事, 提及到他的项目用它来做文字区域的定位,对这个算法做了一些优化. ...

  3. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  4. 音频自动增益 与 静音检测 算法 附完整C代码【转】

    转自:https://www.cnblogs.com/cpuimage/p/8908551.html 前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用 ...

  5. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  6. 基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...

  7. 自动曝光修复算法 附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...

  8. 磨皮美颜算法 附完整C代码

    前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...

  9. 图片文档倾斜矫正算法 附完整c代码

    2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 ...

随机推荐

  1. python虚拟环境--virtualenv

    virtualenv 是一个创建隔绝的Python环境的工具.virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包. 安装 pip install virtu ...

  2. CWMP开源代码研究——stun的NAT穿透

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 参考: http://www.cnblogs.com/myblesh/p/6259765.htm ...

  3. React-Native(四):React Native之View学习

    React Native实现以下布局效果:携html5(http://m.ctrip.com/html5/) 基于HelloWord修改项目代码: /** * Sample React Native ...

  4. Spring(3)——装配 Spring Bean 详解

    装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...

  5. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  6. Spring-cloud (一):Eureka注册中心搭建

    前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...

  7. rocketmq番外篇(一):开发命令行

    匠心零度 转载请注明原创出处,谢谢! 说在前面 虽然是以rocketmq引出的开发命令行,但是任何java应用如果需要都可以借鉴引用,也是通用技术. 主题 rocketmq使用例子 Apache Co ...

  8. js 一些基础的理解

    javascript(JS)的组成? DOM 文档对象模型 BOM 浏览器对象模型 ECMAScript javascript(JS)在页面中处理了什么事情? 特效交互 数据交互 逻辑操作 常见特效的 ...

  9. Git的安装和使用(托管至GitHub的方法)

    一.下载Git 1.下载 下载地址: https://git-scm.com/download/win 根据你的操作系统选择32位或者64位 2.安装过程一路next 3.检验安装是否成功 在桌面点击 ...

  10. Codeforces Round #460 D. Karen and Cards

    Description Karen just got home from the supermarket, and is getting ready to go to sleep. After tak ...