小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Computer & DL
  4. 语音处理学习笔记
  5. 正文

WebRTC中AGC模块分析(上)

2019年8月12日 7016点热度 4人点赞 4条评论

拖了快一个月了,终于有时间来将所研究的WebRTC中的自动增益控制(AGC)模块的内容进行下系统的整理。目前个人了解的还很初步,有很多东西还没有研究透彻,所以这部分分析整理可能会比较浅薄,后续随着研究的深入,内容会不断完善。

本次先更新第一部分,包括WebRTC的AGC模块的介绍、框图、函数关系图和函数功能介绍等。下一期更新具体的函数原理内容。

1.AGC模块的简介和性能结果

WebRTC的音频处理模块分为语音活动检测(VAD)、降噪(NS和NSX)、回音消除(AEC)、回声控制(AECM)和音频增益(AGC)等5个部分。本次我要介绍的是其中的自动增益控制(AGC)部分,其代码主要位于WebRTC的modules\audio_processing\agc\legacy中。

什么时候用得到增益控制呢?实际上,当对语音的响度进行调整的需要时,就要做语音自动增益(AGC)算法处理,平时的语音聊天都会用到这个算法。

最简单的方法就是对所有的音频采样乘上一个增益系数,由于人的听觉对所有频率的感知不是线性的,所以会导致这样处理以后,听起来有的频率增强了、有的频率削弱了,导致了语音失真的方法。所以,要让整个频段听起来响度增益都是相同的,就必须在遵循响度曲线基础上,在响度这个尺度做增益,即按照响度曲线对语音的频率进行加权。

本工程以10ms为单位对语音进行模拟和数字增益的自适应调整。增益的调整仅在语音活动期间进行,语音的长度必须依照程序中所给的长度(8000Hz时为80个点,16000Hz、32000Hz和48000Hz为160个点)。本程序必须在进行回声消除后,在近端麦克风信号进行调用。

在这里介绍的时候,我以Github上的工程(https://github.com/cpuimage/WebRTC_AGC)为例进行讲解WebRTC中AGC的过程。

该方法的效果,如图1.1所示。

图1.1 语音效果图像

2.AGC的整体框图和函数关系图

2.1 AGC模块整体框图

图2.1 AGC模块整体框图

2.2 AGC模块函数关系图

表2.1 AGC模块函数关系图
表2.2 AGC模块函数功能解释
表2.3 其它相关函数功能及解释

2.4 使用到的常量

1.全通滤波器因子:

static const uint16_t kResampleAllpass1[3] = {3284, 24441, 49528};

static const uint16_t kResampleAllpass2[3] = {12199, 37471, 60255};

2.AGC的四种工作模式

表2.4 AGC的四种工作模式

2.5 使用到的结构体

    WebRtcAgc_config是配置targetLevelDbfs和compressionGaindB用于调节agc的动态范围。

typedef struct {
    int16_t targetLevelDbfs;    // default 3 (-3 dBOv)
    int16_t compressionGaindB;  // default 9 dB
    uint8_t limiterEnable;      // default kAgcTrue (on)
} WebRtcAgcConfig;
typedef struct {
    int32_t downState[8];
    int16_t HPstate;
    int16_t counter;
    int16_t logRatio;           // log( P(active) / P(inactive) ) (Q10)
    int16_t meanLongTerm;       // Q10
    int32_t varianceLongTerm;   // Q8
    int16_t stdLongTerm;        // Q10
    int16_t meanShortTerm;      // Q10
    int32_t varianceShortTerm;  // Q8
    int16_t stdShortTerm;       // Q10
} AgcVad;  


typedef struct {
    int32_t capacitorSlow;
    int32_t capacitorFast;
    int32_t gain;
    int32_t gainTable[32];
    int16_t gatePrevious;
    int16_t agcMode;
    AgcVad vadNearend;
    AgcVad vadFarend;
#ifdef WEBRTC_AGC_DEBUG_DUMP
    FILE* logFile;
    int frameCounter;
#endif
} DigitalAgc;

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: AGC WebRTC 自动增益控制 语音处理
最后更新:2019年8月12日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • zxchaobin

    作者你好,最近在看webrtc_agc,在vad之前首先进行了downsampleBy2,将16kHz或8kHz都降到4kHz。downsampleBy2函数用到了全通滤波器因子,请问这部分是什么意思,它是如何实现降采样的呢?
    万分感谢!

    2019年9月3日
    回复
    • 小奥

      @zxchaobin AGC这部分其实我看过去蛮久的了,虽然是8月份发到博客上。我刚刚稍微看了下代码,感觉这部分之所以要进行下采样可能与WebRTC中VAD的下采样有异曲同工之妙。具体我再研究下回复你。

      2019年9月3日
      回复
  • 匿名

    请问targetLevelDbfs的具体含义是什么?平均值的意思吗?

    2020年8月7日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    搜索
    欢迎关注我的个人公众号
    最新 热点 随机
    最新 热点 随机
    DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
    奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
    2010 S.V Beijing Travel Ready:Ticket Java语言程序设计(进阶)(第一章)整理 每日一感0816:Happy Birthday to My Grandmother! The differences of academic writing and other types of writing 每日一感0814:杯具,我“被”送红裤头了 基于python绘制世界人口地图
    标签聚合
    高中 生活 leetcode 鸟哥的linux私房菜 学习 Python 算法 Java linux python学习
    最近评论
    davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
    tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
    cuicui 发布于 9 个月前(10月20日) :wink:
    niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
    davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
    Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
    davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
    aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
    匿名 发布于 5 年前(12月30日) 烫
    小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

    COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    陕ICP备19003234号-1

    鲁公网安备37120202000100号