问题
I am testing the WebRTC AGC but I must be doing something wrong because the signal just passes through unmodified.
Here's how I create and initialize the AGC:
agcConfig.compressionGaindB = 9;
agcConfig.limiterEnable = 1;
agcConfig.targetLevelDbfs = 9; /* 9dB below full scale */
WebRtcAgc_Create(&agc);
WebRtcAgc_Init(agc, minLevel, maxLevel, kAgcModeFixedDigital, 8000);
WebRtcAgc_set_config(agc, agcConfig);
And then for each 10ms sample block I do the following:
WebRtcAgc_Process(agc, micData, NULL, 80, micData, NULL, micLevelIn, &micLevelOut, 0, &saturationWarning);
Where micLevelIn is set to 0.
Can somebody tell me what I'm doing wrong?
I expected that a full scale sine tone would be attenuated to the target DBFS level; and a low level sine tone (i.e. -30dBFS) would be amplified to match the target DBFS level. But that's not what I'm seeing.
回答1:
Here is the sequence of operations to be used for Webrtc_AGC:
- Create AGC:
WebRtcAgc_Create - Initialize AGC:
WebRtcAgc_Init - Set Config:
WebRtcAgc_set_config - Initialize
capture_level = 0 - For
kAgcModeAdaptiveDigital, invoke VirtualMic:WebRtcAgc_VirtualMic - Process Buffer with
capture_level:WebRtcAgc_Process - Get the out capture level returned from
WebRtcAgc_Processand set it tocapture_level - Repeat 5 to 7 for the
audio buffers - Destroy the AGC:
WebRtcAgc_Free
Check webrtc/modules/audio_processing/gain_control_impl.cc for reference.
回答2:
Try this:
agcConfig.compressionGaindB = 9;
agcConfig.limiterEnable = 1;
agcConfig.targetLevelDbfs = 9; /* 9dB below full scale */
WebRtcAgc_Create(&agc);
WebRtcAgc_Init(&agc, minLevel, maxLevel, kAgcModeFixedDigital, 8000);
WebRtcAgc_set_config(&agc, &agcConfig);
来源:https://stackoverflow.com/questions/22706446/webrtc-agc-automatic-gain-control