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/inter_36.c
35
36 Date: 01/31/2002
37
38 ------------------------------------------------------------------------------
39 REVISION HISTORY
40
41 Description:
42 1. Eliminated unused include files.
43 2. Replaced array addressing by pointers
44 3. Eliminated math operations that unnecessary checked for
45 saturation
46 4. Unrolled loops to speed up processing, use decrement loops
47 5. Eliminated call to round by proper initialization
48
49 Description: Added casting to eliminate warnings
50
51 Description: Replaced "int" and/or "char" with OSCL defined types.
52
53 Description: Changed round function name to pv_round to avoid conflict with
54 round function in C standard library.
55
56 Description: Using intrinsics from fxp_arithmetic.h .
57
58 Description: Replacing fxp_arithmetic.h with basic_op.h.
59
60 Description:
61
62 ------------------------------------------------------------------------------
63 */
64
65 /*----------------------------------------------------------------------------
66 ; INCLUDES
67 ----------------------------------------------------------------------------*/
68 #include "inter_36.h"
69 #include "cnst.h"
70 #include "inter_36_tab.h"
71 #include "basic_op.h"
72
73 /*----------------------------------------------------------------------------
74 ; MACROS
75 ; Define module specific macros here
76 ----------------------------------------------------------------------------*/
77
78
79 /*----------------------------------------------------------------------------
80 ; DEFINES
81 ; Include all pre-processor statements here. Include conditional
82 ; compile variables also.
83 ----------------------------------------------------------------------------*/
84 #define UP_SAMP_MAX 6
85
86 /*----------------------------------------------------------------------------
87 ; LOCAL FUNCTION DEFINITIONS
88 ; Function Prototype declaration
89 ----------------------------------------------------------------------------*/
90
91
92 /*----------------------------------------------------------------------------
93 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
94 ; Variable declaration - defined here and used outside this module
95 ----------------------------------------------------------------------------*/
96
97
98 /*
99 ------------------------------------------------------------------------------
100 FUNCTION NAME: inter_36
101 ------------------------------------------------------------------------------
102 INPUT AND OUTPUT DEFINITIONS
103
104 Inputs:
105 pX = pointer to input vector of type Word16
106 frac = fraction (-2..2 for 3*, -3..3 for 6*) of type Word16
107 flag3 = if set, upsampling rate = 3 (6 otherwise) of type Word16
108 pOverflow = pointer to overflow flag
109
110 Outputs:
111 None
112
113 Returns:
114 None
115
116 Global Variables Used:
117 None.
118
119 Local Variables Needed:
120 None.
121
122 ------------------------------------------------------------------------------
123 FUNCTION DESCRIPTION
124
125 File : inter_36.c
126 Purpose : Interpolating the normalized correlation
127 : with 1/3 or 1/6 resolution.
128
129 ------------------------------------------------------------------------------
130 REQUIREMENTS
131
132 None.
133
134 ------------------------------------------------------------------------------
135 REFERENCES
136
137 inter_36.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
138
139 ------------------------------------------------------------------------------
140 PSEUDO-CODE
141
142 Word16 i, k;
143 Word16 *x1, *x2;
144 const Word16 *c1, *c2;
145 Word32 s;
146
147 if (flag3 != 0)
148 {
149 frac = shl (frac, 1); // inter_3[k] = inter_6[2*k] -> k' = 2*k
150 }
151
152 if (frac < 0)
153 {
154 frac = add (frac, UP_SAMP_MAX);
155 x--;
156 }
157
158 x1 = &x[0];
159 x2 = &x[1];
160 c1 = &inter_6[frac];
161 c2 = &inter_6[sub (UP_SAMP_MAX, frac)];
162
163 s = 0;
164 for (i = 0, k = 0; i < L_INTER_SRCH; i++, k += UP_SAMP_MAX)
165 {
166 s = L_mac (s, x1[-i], c1[k]);
167 s = L_mac (s, x2[i], c2[k]);
168 }
169
170 return pv_round (s);
171
172 ------------------------------------------------------------------------------
173 RESOURCES USED [optional]
174
175 When the code is written for a specific target processor the
176 the resources used should be documented below.
177
178 HEAP MEMORY USED: x bytes
179
180 STACK MEMORY USED: x bytes
181
182 CLOCK CYCLES: (cycle count equation for this function) + (variable
183 used to represent cycle count for each subroutine
184 called)
185 where: (cycle count variable) = cycle count for [subroutine
186 name]
187
188 ------------------------------------------------------------------------------
189 CAUTION [optional]
190 [State any special notes, constraints or cautions for users of this function]
191
192 ------------------------------------------------------------------------------
193 */
Interpol_3or6(Word16 * pX,Word16 frac,Word16 flag3,Flag * pOverflow)194 Word16 Interpol_3or6( /* o : interpolated value */
195 Word16 *pX, /* i : input vector */
196 Word16 frac, /* i : fraction (-2..2 for 3*, -3..3 for 6*) */
197 Word16 flag3, /* i : if set, upsampling rate = 3 (6 otherwise) */
198 Flag *pOverflow
199 )
200 {
201 Word16 i;
202 Word16 k;
203 Word16 *pX1;
204 Word16 *pX2;
205 const Word16 *pC1;
206 const Word16 *pC2;
207 Word32 s;
208 Word16 temp1;
209
210 OSCL_UNUSED_ARG(pOverflow);
211
212 if (flag3 != 0)
213 {
214 frac <<= 1;
215 /* inter_3[k] = inter_6[2*k] -> k' = 2*k */
216 }
217
218 if (frac < 0)
219 {
220 frac += UP_SAMP_MAX;
221 pX--;
222 }
223
224 pX1 = &pX[0];
225 pX2 = &pX[1];
226 pC1 = &inter_6[frac];
227 temp1 = UP_SAMP_MAX - frac;
228 pC2 = &inter_6[temp1];
229
230 s = 0x04000;
231 k = 0;
232
233 for (i = (L_INTER_SRCH >> 1); i != 0; i--)
234 {
235 s = amrnb_fxp_mac_16_by_16bb((Word32) * (pX1--), (Word32) pC1[k], s);
236 s = amrnb_fxp_mac_16_by_16bb((Word32) * (pX2++), (Word32) pC2[k], s);
237 k += UP_SAMP_MAX;
238 s = amrnb_fxp_mac_16_by_16bb((Word32) * (pX1--), (Word32) pC1[k], s);
239 s = amrnb_fxp_mac_16_by_16bb((Word32) * (pX2++), (Word32) pC2[k], s);
240 k <<= 1;
241 }
242
243 return((Word16)(s >> 15));
244 }
245
246
247
248
249
250
251