WEBRTC——AGC API

语音信号处理入门webrtc无疑是最经典的算法。

一、WEBRTC框架

我们主要care 红框部分第3部分:

  1. SAC/iLBC Codec: 这个模块主要是编解码,iSAC/iLBC 是jips公司开发的,另外有我们熟悉的音频G711, G726,AAC, Opus 目前使用的最多也是Opus,几年前AAC也是很火的,你可以自己把AAC模块加入到WebRTC里面.其中WebRTC中使用的是Opus,后面的会详细讲解这块的知识。

  2. NetEQ for voice: NetEQ实际上是一个音频缓冲的buffer,用于做网络的适配。如我们做防止音频抖动,这里面涉及了很多相关的算法。

  3. Echo Canceler/ Noise Reduction: 这里面解决了很多做音频头疼的问题:回音消除,降噪等问题处理算法。回音消除是困扰很多公司的一个头疼的技术,但WebRTC里面提供了非常成熟,稳定的回音消除算法,值得好好研究,应用到自己的产品中。其实很多算法工程师做的也是利用像WebRTC一样的开源代码,自己调一些参数,来提高音频质量。

仓库 :https://github.com/webrtc-sdk/webrtc

二、AGC使用

dbfs 表示(full scale):

样本点幅度值 Sample 与分贝 dB 之间的关系,以 16bit 量化的音频采样点为例:dB = 20 * log10(Sample / 32768.0),(16bit-pcm编码)

核心参数:

复制代码
typedef struct {
  int16_t targetLevelDbfs;    // 目标音量
  int16_t compressionGaindB;  // 增益能力
  uint8_t limiterEnable;      // 压限器开关
} AliyunAgcConfig;

目标音量 - targetLevelDbfs:表示音量均衡结果的目标值,如设置为 1 表示输出音量的目标值为 - 1dB;

增益能力 - compressionGaindB:表示音频最大的增益能力,如设置为 10dB,最大可以被提升 10dB;

压限器开关 - limiterEnable:一般与 targetLevelDbfs 配合使用,compressionGaindB 是调节小音量的增益范围,limiter 则是对超过 targetLevelDbfs 的部分进行限制,避免数据爆音。

三、API使用

新版agc接口与旧版本区域在于,process拆分成了gain计算过程和aply gain的过程,两个函数。

  1. 增益表计算
cpp 复制代码
/**
 * digCompGaindB:表示音频最大的增益能力,如设置为 10dB,最大可以被提升 10dB;
 * targetLevelDbfs:表示音量均衡结果的目标值,如设置为 1 表示输出音量的目标值为 - 1dB;
 * limiterEnable:一般与 targetLevelDbfs 配合使用,compressionGaindB 是调节小音量的增益范围,limiter 则是对超过 targetLevelDbfs 的部分进行限制,避免数据爆音
 * analogTarget:
 */
int32_t WebRtcAgc_CalculateGainTable(int32_t* gainTable,       // Q16
                                     int16_t digCompGaindB,    // Q0
                                     int16_t targetLevelDbfs,  // Q0
                                     uint8_t limiterEnable,
                                     int16_t analogTarget)
  1. 增益计算
cpp 复制代码
// lowlevelSignal: 外部自定义使用 RMS 或峰值检测信号是否处于低电平,来置位该信号
int32_t WebRtcAgc_ComputeDigitalGains(DigitalAgc* stt,
                                      const int16_t* const* in_near,
                                      size_t num_bands,
                                      uint32_t FS,
                                      int16_t lowlevelSignal,
                                      int32_t gains[11])

增益计算会将输入一段音频拆分为10个子段,每段1ms(16k为例),每段上计算增益。

gain0:保存上一次agc处理的最后一段计算的增益

gain1~gain10:保存本次计算10段的增益

内部会先用传统算法做vad,计算语音和噪声能量的比值logratio,再用确定衰减系数decay。

  1. 增益应用
cpp 复制代码
/**
 * 增益应用函数
 * gains:上一步计算的音频增益
 * in_near:输入音频
 * out:输出音频
 */
int32_t WebRtcAgc_ApplyDigitalGains(const int32_t gains[11],
                                    size_t num_bands,
                                    uint32_t FS,
                                    const int16_t* const* in_near,
                                    int16_t* const* out)

增益应用到输入音频上,完成音频的自动增益控制。

相关推荐
智联视频超融合平台10 小时前
WebRTC + AI:实时音视频中嵌入神经网络推理的架构设计
人工智能·webrtc·实时音视频
P1Browser17 小时前
换了 IP 还是被关联:WebRTC 泄露本地 IP 的三种触发路径
网络协议·tcp/ip·webrtc
福大大架构师每日一题2 天前
pion/webrtc v4.2.22 最新发布:TCP mux 写缓冲区调整至 4 MB,补齐缺失媒体方向处理
tcp/ip·webrtc·媒体
学习FPGA的电气小兴兴3 天前
基于FPGA的CORDIC旋转模式实现sin和cos运算_采用EGo1板卡上板验证【FPGA数字信号处理第5讲】
fpga开发·信号处理·数字信号处理·verilog·cordic·ego1·fpga设计入门与提高
程序员老陆11 天前
WHIP 与 WHEP:WebRTC 直播的标准化入口与出口
ffmpeg·音视频·webrtc·whip·whep
流浪00115 天前
Linux系统篇34——信号(六):信号处理期间又来了怎么办?——sigaction、sa_mask、可重入函数与 volatile
linux·运维·面试·操作系统·信号处理·信号
科恒盛远15 天前
ZU902 FMC194 可编程宽带信号源实测
fpga开发·硬件工程·信号处理
联丰迅声16 天前
参数表上三个“dB”,选声学成像仪到底该盯哪个?
信号处理·传感器·工业自动化·mems·声学成像
expipi刘家伟16 天前
RFSOC 信号采集处理模块
信号处理·rfsoc·阵列信号采样
Lsir10110_17 天前
从按钮“点不动“讲起——深入理解 Qt 信号槽机制
开发语言·qt·信号处理