目录
零、前言
本系列介绍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_中。