1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20
21 3GPP TS 26.073
22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23 Available from http://www.3gpp.org
24
25 (C) 2004, 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 ****************************************************************************************/
29 /*
30 ------------------------------------------------------------------------------
31
32
33
34 Pathname: ./audio/gsm-amr/c/src/ex_ctrl.c
35 Funtions: ex_ctrl
36
37 Date: 02/08/2002
38
39 ------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description: Replaced "int" and/or "char" with OSCL defined types.
43
44 Description:
45
46 ------------------------------------------------------------------------------
47 */
48
49 /*----------------------------------------------------------------------------
50 ; INCLUDES
51 ----------------------------------------------------------------------------*/
52 #include "ex_ctrl.h"
53 #include "typedef.h"
54 #include "cnst.h"
55 #include "copy.h"
56 #include "set_zero.h"
57 #include "gmed_n.h"
58 #include "sqrt_l.h"
59 #include "basic_op.h"
60 /*----------------------------------------------------------------------------
61 ; MACROS
62 ; Define module specific macros here
63 ----------------------------------------------------------------------------*/
64
65 /*----------------------------------------------------------------------------
66 ; DEFINES
67 ; Include all pre-processor statements here. Include conditional
68 ; compile variables also.
69 ----------------------------------------------------------------------------*/
70
71 /*----------------------------------------------------------------------------
72 ; LOCAL FUNCTION DEFINITIONS
73 ; Function Prototype declaration
74 ----------------------------------------------------------------------------*/
75
76 /*----------------------------------------------------------------------------
77 ; LOCAL VARIABLE DEFINITIONS
78 ; Variable declaration - defined here and used outside this module
79 ----------------------------------------------------------------------------*/
80
81 /*
82 ------------------------------------------------------------------------------
83 FUNCTION NAME: ex_ctrl
84 ------------------------------------------------------------------------------
85 INPUT AND OUTPUT DEFINITIONS
86
87 Inputs:
88 excitation = pointer to current subframe excitation of type Word16
89 excEnergy = Exc. Energy, sqrt(totEx*totEx) of type Word16
90 exEnergyHist = pointer to history of subframe energies of type Word16
91 voicedHangover = # of fr. after last voiced fr of type Word16
92 carefulFlag = restrict dynamic in scaling of type Word16
93 pOverflow = pointer to overflow indicator
94
95 Outputs:
96 pOverflow = 1 if overflow exists in the math functions called by this function.
97
98 Returns:
99 None
100
101 Global Variables Used:
102 None
103
104 Local Variables Needed:
105 None
106
107 ------------------------------------------------------------------------------
108 FUNCTION DESCRIPTION
109
110 Function : Ex_ctrl
111 Purpose : Charaterice synthesis speech and detect background noise
112 Returns : background noise decision; 0 = no bgn, 1 = bgn
113
114 ------------------------------------------------------------------------------
115 REQUIREMENTS
116
117 None
118
119 ------------------------------------------------------------------------------
120 REFERENCES
121
122 ex_ctrl.c, 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
123
124 ------------------------------------------------------------------------------
125 PSEUDO-CODE
126
127
128
129 ------------------------------------------------------------------------------
130 RESOURCES USED [optional]
131
132 When the code is written for a specific target processor the
133 the resources used should be documented below.
134
135 HEAP MEMORY USED: x bytes
136
137 STACK MEMORY USED: x bytes
138
139 CLOCK CYCLES: (cycle count equation for this function) + (variable
140 used to represent cycle count for each subroutine
141 called)
142 where: (cycle count variable) = cycle count for [subroutine
143 name]
144
145 ------------------------------------------------------------------------------
146 CAUTION [optional]
147 [State any special notes, constraints or cautions for users of this function]
148
149 ------------------------------------------------------------------------------
150 */
Ex_ctrl(Word16 excitation[],Word16 excEnergy,Word16 exEnergyHist[],Word16 voicedHangover,Word16 prevBFI,Word16 carefulFlag,Flag * pOverflow)151 Word16 Ex_ctrl(Word16 excitation[], /*i/o: Current subframe excitation */
152 Word16 excEnergy, /* i : Exc. Energy, sqrt(totEx*totEx)*/
153 Word16 exEnergyHist[], /* i : History of subframe energies */
154 Word16 voicedHangover, /* i : # of fr. after last voiced fr.*/
155 Word16 prevBFI, /* i : Set i previous BFI */
156 Word16 carefulFlag, /* i : Restrict dymamic in scaling */
157 Flag *pOverflow
158 )
159 {
160 Word16 i, exp;
161 Word16 testEnergy, scaleFactor, avgEnergy, prevEnergy;
162 Word32 t0;
163
164 /* get target level */
165 avgEnergy = gmed_n(exEnergyHist, 9);
166
167 prevEnergy = shr(add(exEnergyHist[7], exEnergyHist[8], pOverflow) , 1, pOverflow);
168
169 if (exEnergyHist[8] < prevEnergy)
170 {
171 prevEnergy = exEnergyHist[8];
172 }
173
174 /* upscaling to avoid too rapid energy rises for some cases */
175 if ((excEnergy < avgEnergy) && (excEnergy > 5))
176 {
177 testEnergy = shl(prevEnergy, 2, pOverflow); /* testEnergy = 4*prevEnergy; */
178
179 if ((voicedHangover < 7) || prevBFI != 0)
180 {
181 /* testEnergy = 3*prevEnergy */
182 testEnergy = sub(testEnergy, prevEnergy, pOverflow);
183 }
184
185 if (avgEnergy > testEnergy)
186 {
187 avgEnergy = testEnergy;
188 }
189
190 /* scaleFactor=avgEnergy/excEnergy in Q0 (const 29 below)*/
191 exp = norm_s(excEnergy);
192 excEnergy = shl(excEnergy, exp, pOverflow);
193 excEnergy = div_s((Word16) 16383, excEnergy);
194 t0 = L_mult(avgEnergy, excEnergy, pOverflow);
195 t0 = L_shr(t0, sub(20, exp, pOverflow), pOverflow);
196 /* const=30 for t0 in Q0, 20 for Q10 */
197 if (t0 > 32767)
198 {
199 t0 = 32767; /* saturate */
200 }
201 scaleFactor = extract_l(t0);
202
203 /* test if scaleFactor > 3.0 */
204 if (carefulFlag != 0 && (scaleFactor > 3072))
205 {
206 scaleFactor = 3072;
207 }
208
209 /* scale the excitation by scaleFactor */
210 for (i = 0; i < L_SUBFR; i++)
211 {
212 t0 = L_mult(scaleFactor, excitation[i], pOverflow);
213 t0 = L_shr(t0, 11, pOverflow);
214 excitation[i] = extract_l(t0);
215 }
216 }
217
218 return 0;
219 }
220