WebRTC AGC (автоматический контроль усиления)

Я тестирую AGC WebRTC, но я должен делать что-то неправильно, потому что сигнал просто проходит через немодифицированный.

Вот как я создаю и инициализирую АРУ:

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. Но это не то, что я вижу.

Ответ 1

Вот последовательность операций, которые будут использоваться для Webrtc_AGC:

  • Создать AGC: WebRtcAgc_Create
  • Инициализировать АРУ: WebRtcAgc_Init
  • Set Config: WebRtcAgc_set_config
  • Инициализировать capture_level = 0
  • Для kAgcModeAdaptiveDigital вызовите VirtualMic: WebRtcAgc_VirtualMic
  • Технологический буфер с capture_level: WebRtcAgc_Process
  • Получить уровень захвата, возвращаемый с WebRtcAgc_Process, и установить его на capture_level
  • Повторите 5-7 для audio buffers
  • Уничтожьте AGC: WebRtcAgc_Free

Для справки проверьте файл webrtc/modules/audio_processing/gain_control_impl.cc.

Ответ 2

Попробуйте следующее:

    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);