零、前言
本系列介绍Webrtc的agc算法。webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。
一、WebRtcAgc_AddMic
WebRtcAgc_AddMic用在自适应模拟模式下(kAdaptiveAnalog),其流程如下:
这个流程第一步是根据帧长和采样率继续分帧,具体如下:
采样率 帧长 子帧个数(1ms)M 子帧长度L subFrames
8000 10ms 10 8 80
8000 20ms 20 8 80
16000 10ms 10 16 160
16000 20ms 20 16 160
32000 5ms 10 16 160
这里注意32k时候因为在apm里头已经做了分频,10ms的数据分成了低频16K的10ms数据和高频16k的10ms数据,因此上表32000子帧个数10和subFrames为160。这些子帧用下面用来计算能量信息。
第二部分是如果麦克风最大值大于模拟值就计算缓慢增益的序号对应的值。
t a r g e t G a i n I d x = ( G A I N _ T B L _ L E N − 1 ) ∗ ( m i c V o l − m a x A n a l o g ) ( m a x L e v e l − m a x A n a l o g ) targetGainIdx = \frac{(GAIN\_TBL\_LEN - 1)*(micVol - maxAnalog)}{(maxLevel - maxAnalog)}
targetGainIdx=
(maxLevel−maxAnalog)
(GAIN_TBL_LEN−1)∗(micVol−maxAnalog)
获取了目标放大序号后,缓慢调整放大表序号gainTableIdx,每次调整1单位。并且在kGainTableAnalog表中取出增益系数。kGainTableAnalog是Q12的,最大放大倍数是3.16倍,也就是10db。
接下来这个放大倍数对输入in_mic和in_mic_H(32K)使用。
对输入信号计算长度为L的M个子帧的最大M个能量,作为信号包络,以及M个低频8K的能量。最后对每一个subFrames计算VAD,这个为vadMic,意思是Microphone刚刚收到信号的VAD,其中包含了回声和噪声。
二、WebRtcAgc_VirtualMic
从上面的流程图可以看出WebRtcAgc_VirtualMic函数在kAdaptiveDigital的时候调用。其中包括一个虚拟的音量调节部分。其详细的流程图如下:
在第一个部分通过零率和能量大小来判断是否是低能信号(lowLevelSignal)。
16KHz低信号的判决维度,其中黑色的地方是低能量lowLevelSignal = 1,白色的地方不是低能量或者说能量比较大lowLevelSignal = 0。这里能量的大小判断主要目的还是做一个VAD判决,保证处理的信号是语音而不是噪音。
此处获得低能量信号标志在WebRtcAgc_ProcessDigital中使用,详细内容在该函数再讲述。另外一个控制模式kAgcModeAdaptiveAnalog和kAgcModeAdaptiveDigital进入WebRtcAgc_ProcessAnalog流程。
//Four modes review.
enum
{
kAgcModeUnchanged,
kAgcModeAdaptiveAnalog,
kAgcModeAdaptiveDigital,
kAgcModeFixedDigital
};
if ((stt->agcMode < kAgcModeFixedDigital) && ((stt->lowLevelSignal == 0)
|| (stt->agcMode != kAgcModeAdaptiveDigital)))
{
if (WebRtcAgc_ProcessAnalog(agcInst, inMicLevelTmp, outMicLevel,
stt->vadMic.logRatio, echo, saturationWarning) == -1){
return -1;
}
}
Start
kAgcModeAdaptiveDigital or not?
lowLevelSignal==0?//Big signal?
WebRtcAgc_ProcessAnalog
End
yes
no
yes
no
总的来说,kAgcModeAdaptiveAnalog一定进入WebRtcAgc_ProcessAnalog流程;kAgcModeAdaptiveDigital在位大能量的时候进入WebRtcAgc_ProcessAnalog流程;而kAgcModeFixedDigital不会调用该流程。
VirtualMic的第二个流程是根据输入麦克风等级调节输入找到增益表,然后在增益表中找到对应的增益系数。
上图是增益图。可以看出随着Index,Gain指数递增。最大是31.6倍,也就是30dB放大;最小是0.0996,,也就是-20dB衰减。之所以用了两条曲线,估计是设计者认为压缩和衰减需要不同的斜率。
确定了GainIdx的由micVol和maxAnalog以及输入的micLevelIn和micRef(micLevelIn的旧值)控制。如果在这次和上次micLevelIn有不一样的情况下,GainIdx为127。否者G a i n I d x = m i n ( m i c V o l , m a x A n a l o g ) GainIdx=min(micVol,maxAnalog)GainIdx=min(micVol,maxAnalog)同时*micLevelOut = micGainIdx。
最后调用WebRtcAgc_AddMic流程。
————————————————
版权声明:本文为CSDN博主「灯等等凳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ssdzdk/article/details/52848161