WebRTC自动增益控制(AGC)

64

我正在测试WebRTC AGC,但由于信号仅以未修改的形式通过,所以我肯定是做错了什么。

以下是我创建和初始化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);

然后对于每个10毫秒的样本块,我执行以下操作:

WebRtcAgc_Process(agc, micData, NULL, 80, micData, NULL, micLevelIn, &micLevelOut, 0, &saturationWarning);

micLevelIn 设为 0。

有人能告诉我哪里出错了吗?

我原本期望一个满幅正弦波会被衰减到目标 DBFS 级别;而一个低于目标级别的正弦波(例如 -30dBFS)会被放大到与目标 DBFS 级别匹配。但我看到的不是这样。


你确定没有任何“尖峰”噪声阻止AGC按照你的期望放大输入信号吗?同时请查看这个答案WebRtcAgc_Process()是否应该适当设置micLevelOut并保持不变?... - TheCodeArtist
一个有关WebRtcAgc_Process()的小描述,帮助你理清期望。 - TheCodeArtist
WebRtcAgc_Process() 函数是否将正弦波输入视为非语音段并因此跳过它?您可以尝试传递实际的语音片段并进行测试吗? - TheCodeArtist
同时检查webrtc的源代码,参数vadLogRatio是从传递给WebRtcAgc_ProcessmicLevelIn派生出来的。如果将其设置为**0**,则它始终小于计算得出的stt->vadThreshold。因此,输入样本不会被检测为语音,因此会原封不动地传递出去。只是一个想法... - TheCodeArtist
4
请不要将C++代码标记为C语言,这会造成困惑。 - Vality
2
我已经使用了类似的代码。然而,在我的情况下,输出结果到目前为止是-1(错误)。无论如何,你能分享一下你是否收到过任何饱和警告吗?此外,我理解语音输出是由结果dbfs、压缩增益和其他几个参数的组合效果。我注意到这可能并不是非常有帮助,但我需要确保它可以工作,以便我可以采用相同的方法。如果您已经解决了这个问题,请分享一下。 - Altanai
2个回答

3
以下是Webrtc_AGC的操作序列:
  1. 创建AGC:WebRtcAgc_Create
  2. 初始化AGC:WebRtcAgc_Init
  3. 设置配置:WebRtcAgc_set_config
  4. 初始化capture_level = 0
  5. 对于kAgcModeAdaptiveDigital,调用虚拟麦克风:WebRtcAgc_VirtualMic
  6. 使用capture_level处理缓冲区:WebRtcAgc_Process
  7. WebRtcAgc_Process返回的捕获级别获取输出并将其设置为capture_level
  8. audio buffers重复步骤5至7
  9. 销毁AGC:WebRtcAgc_Free
请参考webrtc/modules/audio_processing/gain_control_impl.cc。

0
尝试这样做:

    agcConfig.compressionGaindB = 9;
    agcConfig.limiterEnable = 1;
    agcConfig.targetLevelDbfs = 9;   /* 距离满刻度下降9dB */
WebRtcAgc_Create(&agc); WebRtcAgc_Init(&agc, minLevel, maxLevel, kAgcModeFixedDigital, 8000); WebRtcAgc_set_config(&agc, &agcConfig);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接