1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23 Available from http://www.3gpp.org
25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
30 ------------------------------------------------------------------------------
34 Filename: agc2_amr_wb.cpp
36 ------------------------------------------------------------------------------
37 INPUT AND OUTPUT DEFINITIONS
39 int16 * sig_in, (i) : postfilter input signal
40 int16 * sig_out, (i/o) : postfilter output signal
41 int16 l_trm (i) : subframe size
44 ------------------------------------------------------------------------------
47 Performs adaptive gain control
49 ------------------------------------------------------------------------------
53 ------------------------------------------------------------------------------
56 ------------------------------------------------------------------------------
59 ------------------------------------------------------------------------------
63 /*----------------------------------------------------------------------------
65 ----------------------------------------------------------------------------*/
67 #include "pvamrwbdecoder_cnst.h"
68 #include "pvamrwbdecoder_acelp.h"
69 #include "pv_amr_wb_type_defs.h"
70 #include "pvamrwbdecoder_basic_op.h"
71 #include "pvamrwb_math_op.h"
73 /*----------------------------------------------------------------------------
75 ; Define module specific macros here
76 ----------------------------------------------------------------------------*/
79 /*----------------------------------------------------------------------------
81 ; Include all pre-processor statements here. Include conditional
82 ; compile variables also.
83 ----------------------------------------------------------------------------*/
85 /*----------------------------------------------------------------------------
86 ; LOCAL FUNCTION DEFINITIONS
87 ; Function Prototype declaration
88 ----------------------------------------------------------------------------*/
90 /*----------------------------------------------------------------------------
91 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
92 ; Variable declaration - defined here and used outside this module
93 ----------------------------------------------------------------------------*/
95 /*----------------------------------------------------------------------------
96 ; EXTERNAL FUNCTION REFERENCES
97 ; Declare functions defined elsewhere and referenced in this module
98 ----------------------------------------------------------------------------*/
100 /*----------------------------------------------------------------------------
101 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
102 ; Declare variables used in this module but defined elsewhere
103 ----------------------------------------------------------------------------*/
105 /*----------------------------------------------------------------------------
107 ----------------------------------------------------------------------------*/
110 int16 * sig_in, /* (i) : postfilter input signal */
111 int16 * sig_out, /* (i/o) : postfilter output signal */
112 int16 l_trm /* (i) : subframe size */
117 int16 gain_in, gain_out, g0;
122 /* calculate gain_out with exponent */
124 temp = sig_out[0] >> 2;
125 s = fxp_mul_16by16(temp, temp) << 1;
126 for (i = 1; i < l_trm; i++)
128 temp = sig_out[i] >> 2;
129 s = mac_16by16_to_int32(s, temp, temp);
137 exp = normalize_amr_wb(s) - 1;
138 gain_out = amr_wb_round(s << exp);
140 /* calculate gain_in with exponent */
142 temp = sig_in[0] >> 2;
143 s = mul_16by16_to_int32(temp, temp);
144 for (i = 1; i < l_trm; i++)
146 temp = sig_in[i] >> 2;
147 s = mac_16by16_to_int32(s, temp, temp);
157 i = normalize_amr_wb(s);
158 gain_in = amr_wb_round(s << i);
162 * g0 = sqrt(gain_in/gain_out)
165 s = div_16by16(gain_out, gain_in);
166 s = shl_int32(s, 7); /* s = gain_out / gain_in */
167 s = shr_int32(s, exp); /* add exponent */
170 g0 = amr_wb_round(shl_int32(s, 9));
172 /* sig_out(n) = gain(n) sig_out(n) */
174 for (i = 0; i < l_trm; i++)
176 sig_out[i] = extract_h(shl_int32(fxp_mul_16by16(sig_out[i], g0), 3));