1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_DIGITAL_AGC_H_ 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_DIGITAL_AGC_H_ 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef AGC_DEBUG 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <stdio.h> 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "typedefs.h" 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "signal_processing_library.h" 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// the 32 most significant bits of A(19) * B(26) >> 13 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_MUL32(A, B) (((B)>>13)*(A) + ( ((0x00001FFF & (B))*(A)) >> 13 )) 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// C + the 32 most significant bits of A * B 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_SCALEDIFF32(A, B, C) ((C) + ((B)>>16)*(A) + ( ((0x0000FFFF & (B))*(A)) >> 16 )) 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurenttypedef struct 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 downState[8]; 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 HPstate; 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 counter; 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 logRatio; // log( P(active) / P(inactive) ) (Q10) 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 meanLongTerm; // Q10 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 varianceLongTerm; // Q8 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 stdLongTerm; // Q10 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 meanShortTerm; // Q10 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 varianceShortTerm; // Q8 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 stdShortTerm; // Q10 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} AgcVad_t; // total = 54 bytes 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurenttypedef struct 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 capacitorSlow; 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 capacitorFast; 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 gain; 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 gainTable[32]; 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 gatePrevious; 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 agcMode; 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AgcVad_t vadNearend; 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AgcVad_t vadFarend; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef AGC_DEBUG 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent FILE* logFile; 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int frameCounter; 52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} DigitalAgc_t; 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 WebRtcAgc_InitDigital(DigitalAgc_t *digitalAgcInst, WebRtc_Word16 agcMode); 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 WebRtcAgc_ProcessDigital(DigitalAgc_t *digitalAgcInst, const WebRtc_Word16 *inNear, 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word16 *inNear_H, WebRtc_Word16 *out, 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 *out_H, WebRtc_UWord32 FS, 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 lowLevelSignal); 61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 WebRtcAgc_AddFarendToDigital(DigitalAgc_t *digitalAgcInst, const WebRtc_Word16 *inFar, 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 nrSamples); 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid WebRtcAgc_InitVad(AgcVad_t *vadInst); 66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word16 WebRtcAgc_ProcessVad(AgcVad_t *vadInst, // (i) VAD state 68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word16 *in, // (i) Speech signal 69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 nrSamples); // (i) number of samples 70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 WebRtcAgc_CalculateGainTable(WebRtc_Word32 *gainTable, // Q16 72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 compressionGaindB, // Q0 (in dB) 73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 targetLevelDbfs,// Q0 (in dB) 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 limiterEnable, WebRtc_Word16 analogTarget); 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_SOURCE_ANALOG_AGC_H_ 77