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