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 Pathname: ./audio/gsm-amr/c/src/lsfwt.c
31 Functions: Lsf_wt
32
33 ------------------------------------------------------------------------------
34 REVISION HISTORY
35
36 Description: Updated to accept new parameter, Flag *pOverflow. Placed
37 file in the proper PV Software template.
38
39 Description:
40 1. Eliminated unused include files.
41 2. Replaced array addressing by pointers
42 3. Eliminated math operations that unnecessary checked for
43 saturation, by evaluating the operands
44 4. Unrolled loops to speed up processing, use decrement loops
45
46 Description: Replaced "int" and/or "char" with OSCL defined types.
47
48 Who: Date:
49 Description:
50
51 ------------------------------------------------------------------------------
52 INPUT AND OUTPUT DEFINITIONS
53
54 Inputs:
55 lsf -- Pointer to Word16 -- LSF vector
56
57 Outputs:
58 wf -- Pointer to Word16 -- square of weighting factors
59 pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
60
61 Returns:
62 None
63
64 Global Variables Used:
65 None
66
67 Local Variables Needed:
68 None
69
70 ------------------------------------------------------------------------------
71 FUNCTION DESCRIPTION
72
73 Compute LSF weighting factors
74
75 d[i] = lsf[i+1] - lsf[i-1]
76
77 The weighting factors are approximated by two line segment
78
79 First segment passes by the following 2 points:
80
81 d[i] = 0Hz wf[i] = 3.347
82 d[i] = 450Hz wf[i] = 1.8
83
84 Second segment passes by the following 2 points:
85
86 d[i] = 450Hz wf[i] = 1.8
87 d[i] = 1500Hz wf[i] = 1.0
88
89 if( d[i] < 450Hz )
90 wf[i] = 3.347 - ( (3.347-1.8) / (450-0)) * d[i]
91 else
92 wf[i] = 1.8 - ( (1.8-1.0) / (1500-450)) * (d[i] - 450)
93
94
95 if( d[i] < 1843)
96 wf[i] = 3427 - (28160*d[i])>>15
97 else
98 wf[i] = 1843 - (6242*(d[i]-1843))>>15
99
100 ------------------------------------------------------------------------------
101 REQUIREMENTS
102
103
104
105 ------------------------------------------------------------------------------
106 REFERENCES
107
108 lsfwt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
109
110 ------------------------------------------------------------------------------
111 PSEUDO-CODE
112
113
114
115 ------------------------------------------------------------------------------
116 RESOURCES USED
117 When the code is written for a specific target processor the
118 the resources used should be documented below.
119
120 STACK USAGE: [stack count for this module] + [variable to represent
121 stack usage for each subroutine called]
122
123 where: [stack usage variable] = stack usage for [subroutine
124 name] (see [filename].ext)
125
126 DATA MEMORY USED: x words
127
128 PROGRAM MEMORY USED: x words
129
130 CLOCK CYCLES: [cycle count equation for this module] + [variable
131 used to represent cycle count for each subroutine
132 called]
133
134 where: [cycle count variable] = cycle count for [subroutine
135 name] (see [filename].ext)
136
137 ------------------------------------------------------------------------------
138 */
139
140
141 /*----------------------------------------------------------------------------
142 ; INCLUDES
143 ----------------------------------------------------------------------------*/
144 #include "lsfwt.h"
145 #include "cnst.h"
146
147 /*----------------------------------------------------------------------------
148 ; MACROS
149 ; Define module specific macros here
150 ----------------------------------------------------------------------------*/
151
152
153 /*----------------------------------------------------------------------------
154 ; DEFINES
155 ; Include all pre-processor statements here. Include conditional
156 ; compile variables also.
157 ----------------------------------------------------------------------------*/
158
159
160 /*----------------------------------------------------------------------------
161 ; LOCAL FUNCTION DEFINITIONS
162 ; Function Prototype declaration
163 ----------------------------------------------------------------------------*/
164
165
166 /*----------------------------------------------------------------------------
167 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
168 ; Variable declaration - defined here and used outside this module
169 ----------------------------------------------------------------------------*/
170
171 /*----------------------------------------------------------------------------
172 ; EXTERNAL FUNCTION REFERENCES
173 ; Declare functions defined elsewhere and referenced in this module
174 ----------------------------------------------------------------------------*/
175
176 /*----------------------------------------------------------------------------
177 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
178 ; Declare variables used in this module but defined elsewhere
179 ----------------------------------------------------------------------------*/
180
181
182 /*----------------------------------------------------------------------------
183 ; FUNCTION CODE
184 ----------------------------------------------------------------------------*/
185
Lsf_wt(Word16 * lsf,Word16 * wf,Flag * pOverflow)186 void Lsf_wt(
187 Word16 *lsf, /* input : LSF vector */
188 Word16 *wf, /* output: square of weighting factors */
189 Flag *pOverflow
190 )
191 {
192 Word16 temp;
193 Word16 wgt_fct;
194 Word16 i;
195 Word16 *p_wf = wf;
196 Word16 *p_lsf = &lsf[0];
197 Word16 *p_lsf_2 = &lsf[1];
198
199 OSCL_UNUSED_ARG(pOverflow);
200
201 /* wf[0] = lsf[1] - 0 */
202 *(p_wf++) = *(p_lsf_2++);
203
204 for (i = 4; i != 0 ; i--)
205 {
206 *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
207 *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
208 }
209 /*
210 * wf[9] = 4000 - lsf[8]
211 */
212 *(p_wf) = 16384 - *(p_lsf);
213
214 p_wf = wf;
215
216 for (i = 10; i != 0; i--)
217 {
218 /*
219 * (wf[i] - 450);
220 * 1843 == 450 Hz (Q15 considering 7FFF = 8000 Hz)
221 */
222 wgt_fct = *p_wf;
223 temp = wgt_fct - 1843;
224
225 if (temp > 0)
226 {
227 temp = (Word16)(((Word32)temp * 6242) >> 15);
228 wgt_fct = 1843 - temp;
229 }
230 else
231 {
232 temp = (Word16)(((Word32)wgt_fct * 28160) >> 15);
233 wgt_fct = 3427 - temp;
234 }
235
236 *(p_wf++) = wgt_fct << 3;
237
238 } /* for (i = 10; i != 0; i--) */
239
240 return;
241
242 } /* Lsf_wt() */
243