我是靠谱客的博主 忧虑发箍,最近开发中收集的这篇文章主要介绍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<int16_t>(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<int16_t>(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_中。

最后

以上就是忧虑发箍为你收集整理的Webrtc AGC 算法原理介绍(二)的全部内容,希望文章能够帮你解决Webrtc AGC 算法原理介绍(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部