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