Webrtc AGC 算法原理介绍(二)

音频算法


零、前言

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

一、AGC的三个流程

函数 调用 功能
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。

Created with Raphaël 2.1.0 Start ProcessRenderAudio(AudioBuffer* audio) WebRtcAgc_AddFarend(my_handle,mixed_data,static_cast(audio->samples_per_split_channel())) Check input WebRtcAgc_AddFarendToDigital(&stt->digitalAgc, &in_far[i], subFrames) WebRtcAgc_ProcessVad(&stt->vadFarend, in_far, nrSamples) End

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

三、AnalyzeCaptureAudio

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

Created with Raphaël 2.1.0 Start AnalyzeCaptureAudio(AudioBuffer* audio) kAdaptiveAnalog(yes) or kAdaptiveDigital(not)? WebRtcAgc_AddMic End WebRtcAgc_VirtualMic yes no

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

四、ProcessCaptureAudio

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

//...
    int err = WebRtcAgc_Process(
        my_handle,
        audio->low_pass_split_data(i),
        audio->high_pass_split_data(i),
        static_cast(audio->samples_per_split_channel()),
        audio->low_pass_split_data(i),
        audio->high_pass_split_data(i),
        capture_levels_[i],
        &capture_level_out,
        apm_->echo_cancellation()->stream_has_echo(),
        &saturation_warning);
//...
    capture_levels_[i] = capture_level_out;
//...
  }
  if (mode_ == kAdaptiveAnalog) {
    // Take the analog level to be the average across the handles.
    analog_capture_level_ = 0;
    for (int i = 0; i < num_handles(); i++) {
      analog_capture_level_ += capture_levels_[i];
    }
    analog_capture_level_ /= num_handles();
  }

capture_levels_是通过WebRtcAgc_Process计算出来,之后的analog_capture_level_=capture_levels_。同时analog_capture_level_会用在AnalyzeCaptureAudio中的WebRtcAgc_VirtualMic中,做为设置音量输入,同时计算出capture_levels_。

Created with Raphaël 2.1.0 Start kAdaptiveAnalog(yes) or kAdaptiveDigital(no) WebRtcAgc_Process input capture_levels_ and output analog_capture_level_. The capture_levels_ is last analog_capture_level End WebRtcAgc_VirtualMic is inputed analog_capture_level_ and output capture_levels_, The capture_levels_ is not used. yes no

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

你可能感兴趣的:(音频架构通用技术,基础信号处理,自动增益控制)