基于Webrtc m79版本 AGC 算法原理介绍(二)(转)

目录

零、前言

一、AGC的三个流程

二、ProcessRenderAudio

三、AnalyzeCaptureAudio

四、ProcessCaptureAudio


零、前言

本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。

一、AGC的三个流程

在apm里gain_control_impl.h中的GainControlImpl以下主要接口:

函数调用功能
ProcessRenderAudio远端输出前调用AGC的WebRtcAgc_AddFarend
AnalyzeCaptureAudio近端高通滤波器后根据模式,可变模拟(kAdaptiveAnalog)调用WebRtcAgc_AddMic,可变模拟(kAdaptiveDigital)调用WebRtcAgc_VirtualMic
ProcessCaptureAudio近端VAD后输出前调用AGC的WebRtcAgc_Process

这三个流程是AGC的主要接口。下面将会对这些三个流程进行详细的介绍。

二、ProcessRenderAudio

首先介绍ProcessRenderAudio函数流程,这个函数在远端调用,主要目的是分析远端信号的VAD属性。调用了AGC中的WebRtcAgc_AddFarend函数。实际上WebRtcAgc_AddFarend函数只是做了一些参数的校验,最后调用了WebRtcAgc_AddFarendToDigital,WebRtcAgc_AddFarendToDigital调用到了WebRtcAgc_ProcessVad。 

            ​​​​​​             

再Check input(WebRtcAgc_GetAddFarendError)的流程中,只支持以下采样率和帧长的输入数据:
1、8K采样率,10或者20ms长度数据,subFrames为80;
2、16K采样率,10或者20ms长度数据,subFrames为160;
3、32K采样率,5或者10ms长度数据,subFrames为160;
WebRtcAgc_ProcessVad算法详细下回分解。

三、AnalyzeCaptureAudio

AnalyzeCaptureAudio流程主要用于分析没有经过处理的声音。根据不同模式调用了数字不同的处理。流程如下:

                         

如果是选择了kFixedDigital的AGC模式,则AnalyzeCaptureAudio不起作用。

四、ProcessCaptureAudio

ProcessCaptureAudio是处理的核心,包括了AGC的重要调用WebRtcAgc_Process。除了正常的参数检测之外还有有关音量调节的流程。

//...
    int err = WebRtcAgc_Process(gain_controller->state(),
                                split_bands,
                                audio->num_bands(),
                                audio->num_frames_per_band(), 
                                split_bands,
                                gain_controller->get_capture_level(), 
                                &capture_level_out,
                                stream_has_echo, 
                                &saturation_warning);
//...
    gain_controller->set_capture_level(capture_level_out);
//...
  }
  
  RTC_DCHECK_LT(0ul, *num_proc_channels_);
  if (mode_ == kAdaptiveAnalog) {
    // Take the analog level to be the average across the handles.
    analog_capture_level_ = 0;
    for (auto& gain_controller : gain_controllers_) {
      analog_capture_level_ += gain_controller->get_capture_level();
    }
    analog_capture_level_ /= (*num_proc_channels_);
  }

capture_level_out是通过WebRtcAgc_Process计算出来,对每个通道的值通过gain_controller->set_capture_level(capture_level_out)进行存储,计算完成所有通道后进行平均analog_capture_level_ /= (*num_proc_channels_),得出analog_capture_level_。同时analog_capture_level_会用在AnalyzeCaptureAudio中的WebRtcAgc_VirtualMic中,做为设置音量输入,同时计算出capture_levels_。

事实上这条回路由mode控制,如果选择了数字模式,WebRtcAgc_VirtualMic输入analog_capture_level_获得的capture_level_out,存在gain_controller->set_capture_level(capture_level_out)中用做WebRtcAgc_Process的输入,但是WebRtcAgc_Process输入值写到capture_levels_后给废弃了。如果选择了模拟模式不执行WebRtcAgc_VirtualMic,那么WebRtcAgc_Process输入capture_levels_,每次更新,并且把结果保存到analog_capture_level_中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值