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/lsp_avg.c
35 Functions:
36
37
38 Date: 04/14/2000
39
40 ------------------------------------------------------------------------------
41 REVISION HISTORY
42
43 Description: Removed the functions lsp_avg_init and lsp_avg_exit.
44 The lsp_avg related structure is no longer dynamically allocated.
45
46 Also, placed code in the proper PV Software Template.
47
48 Description: Per review comments, updated the inputs/outputs section
49 for the function lsp_avg.
50
51 Description: Changed to accept the pOverflow flag for EPOC compatibility.
52
53 Description: Per review comments, I added a description of pOverflow
54 to the input/output section of the template. I also removed an unnecessary
55 include file, <stdio.h>
56
57 Description: Removed q_plsf_5.tab from Include section and added
58 q_plsf_5_tbl.h to Include section. Changed "mean_lsf"
59 to "mean_lsf_5" in lsp_avg_reset().
60
61 Description: Replaced OSCL mem type functions and eliminated include
62 files that now are chosen by OSCL definitions
63
64 Description: Replaced "int" and/or "char" with OSCL defined types.
65
66 Description: Changed round function name to pv_round to avoid conflict with
67 round function in C standard library.
68
69 Description:
70
71 ------------------------------------------------------------------------------
72 MODULE DESCRIPTION
73
74 LSP averaging and history
75 ------------------------------------------------------------------------------
76 */
77
78 /*----------------------------------------------------------------------------
79 ; INCLUDES
80 ----------------------------------------------------------------------------*/
81 #include "lsp_avg.h"
82 #include "basic_op.h"
83 #include "oper_32b.h"
84 #include "copy.h"
85 #include "q_plsf_5_tbl.h"
86
87 /*----------------------------------------------------------------------------
88 ; MACROS
89 ; Define module specific macros here
90 ----------------------------------------------------------------------------*/
91
92 /*----------------------------------------------------------------------------
93 ; DEFINES
94 ; Include all pre-processor statements here. Include conditional
95 ; compile variables also.
96 ----------------------------------------------------------------------------*/
97
98 /*----------------------------------------------------------------------------
99 ; LOCAL FUNCTION DEFINITIONS
100 ; Function Prototype declaration
101 ----------------------------------------------------------------------------*/
102
103 /*----------------------------------------------------------------------------
104 ; LOCAL VARIABLE DEFINITIONS
105 ; Variable declaration - defined here and used outside this module
106 ----------------------------------------------------------------------------*/
107
108 /*----------------------------------------------------------------------------
109 ; EXTERNAL FUNCTION REFERENCES
110 ; Declare functions defined elsewhere and referenced in this module
111 ----------------------------------------------------------------------------*/
112
113 /*----------------------------------------------------------------------------
114 ; EXTERNAL VARIABLES REFERENCES
115 ; Declare variables used in this module but defined elsewhere
116 ----------------------------------------------------------------------------*/
117
118 /*
119 ------------------------------------------------------------------------------
120 FUNCTION NAME: lsp_avg_reset
121 ------------------------------------------------------------------------------
122 INPUT AND OUTPUT DEFINITIONS
123
124 Inputs:
125 st = pointer to structure of type lsp_avgState
126
127 Outputs:
128 fields of the structure pointed to by state are initialized.
129
130 Returns:
131 return_value = 0, if reset was successful; -1, otherwise (int)
132
133 Global Variables Used:
134 None
135
136 Local Variables Needed:
137 None
138
139 ------------------------------------------------------------------------------
140 FUNCTION DESCRIPTION
141
142
143 ------------------------------------------------------------------------------
144 REQUIREMENTS
145
146 None
147
148 ------------------------------------------------------------------------------
149 REFERENCES
150
151 lsp_avg.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
152
153 ------------------------------------------------------------------------------
154 PSEUDO-CODE
155
156 int lsp_avg_reset (lsp_avgState *st)
157 {
158 if (st == (lsp_avgState *) NULL){
159 // fprintf(stderr, "lsp_avg_reset: invalid parameter\n");
160 return -1;
161 }
162
163 Copy(mean_lsf, &st->lsp_meanSave[0], M);
164
165 return 0;
166 }
167
168 ------------------------------------------------------------------------------
169 RESOURCES USED [optional]
170
171 When the code is written for a specific target processor the
172 the resources used should be documented below.
173
174 HEAP MEMORY USED: x bytes
175
176 STACK MEMORY USED: x bytes
177
178 CLOCK CYCLES: (cycle count equation for this function) + (variable
179 used to represent cycle count for each subroutine
180 called)
181 where: (cycle count variable) = cycle count for [subroutine
182 name]
183
184 ------------------------------------------------------------------------------
185 CAUTION [optional]
186 [State any special notes, constraints or cautions for users of this function]
187
188 ------------------------------------------------------------------------------
189 */
190
lsp_avg_reset(lsp_avgState * st)191 Word16 lsp_avg_reset(lsp_avgState *st)
192 {
193 if (st == (lsp_avgState *) NULL)
194 {
195 /* fprintf(stderr, "lsp_avg_reset: invalid parameter\n"); */
196 return -1;
197 }
198
199 Copy(mean_lsf_5, &st->lsp_meanSave[0], M);
200
201 return 0;
202 }
203
204
205 /*
206 ------------------------------------------------------------------------------
207 FUNCTION NAME: lsp_avg
208 ------------------------------------------------------------------------------
209 INPUT AND OUTPUT DEFINITIONS
210
211 Inputs:
212 st = pointer to structure of type lsp_avgState
213 lsp = pointer to Word16, which reflects the state of the state machine
214
215 Outputs:
216 st = pointer to structure of type lsp_avgState
217 pOverflow = pointer to type Flag -- overflow indicator
218
219 Returns:
220 None
221
222 Global Variables Used:
223 None
224
225 Local Variables Needed:
226 None
227
228 ------------------------------------------------------------------------------
229 FUNCTION DESCRIPTION
230
231
232 ------------------------------------------------------------------------------
233 REQUIREMENTS
234
235 None
236
237 ------------------------------------------------------------------------------
238 REFERENCES
239
240 lsp_avg.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
241
242 ------------------------------------------------------------------------------
243 PSEUDO-CODE
244
245
246 void lsp_avg (
247 lsp_avgState *st, // i/o : State struct Q15
248 Word16 *lsp // i : state of the state machine Q15
249 )
250 {
251 Word16 i;
252 Word32 L_tmp; // Q31
253
254 for (i = 0; i < M; i++) {
255
256 // mean = 0.84*mean
257 L_tmp = L_deposit_h(st->lsp_meanSave[i]);
258 L_tmp = L_msu(L_tmp, EXPCONST, st->lsp_meanSave[i]);
259
260 // Add 0.16 of newest LSPs to mean
261 L_tmp = L_mac(L_tmp, EXPCONST, lsp[i]);
262
263 // Save means
264 st->lsp_meanSave[i] = pv_round(L_tmp); // Q15
265 }
266
267 return;
268 }
269
270 ------------------------------------------------------------------------------
271 RESOURCES USED [optional]
272
273 When the code is written for a specific target processor the
274 the resources used should be documented below.
275
276 HEAP MEMORY USED: x bytes
277
278 STACK MEMORY USED: x bytes
279
280 CLOCK CYCLES: (cycle count equation for this function) + (variable
281 used to represent cycle count for each subroutine
282 called)
283 where: (cycle count variable) = cycle count for [subroutine
284 name]
285
286 ------------------------------------------------------------------------------
287 CAUTION [optional]
288 [State any special notes, constraints or cautions for users of this function]
289
290 ------------------------------------------------------------------------------
291 */
292
lsp_avg(lsp_avgState * st,Word16 * lsp,Flag * pOverflow)293 void lsp_avg(
294 lsp_avgState *st, /* i/o : State struct Q15 */
295 Word16 *lsp, /* i : state of the state machine Q15 */
296 Flag *pOverflow /* o : Flag set when overflow occurs */
297 )
298 {
299 Word16 i;
300 Word32 L_tmp; /* Q31 */
301
302 for (i = 0; i < M; i++)
303 {
304
305 /* mean = 0.84*mean */
306 L_tmp = L_deposit_h(st->lsp_meanSave[i]);
307 L_tmp = L_msu(L_tmp, EXPCONST, st->lsp_meanSave[i], pOverflow);
308
309 /* Add 0.16 of newest LSPs to mean */
310 L_tmp = L_mac(L_tmp, EXPCONST, lsp[i], pOverflow);
311
312 /* Save means */
313 st->lsp_meanSave[i] = pv_round(L_tmp, pOverflow); /* Q15 */
314 }
315
316 return;
317 }
318