inter_36.cpp revision b841f14f8e51f2365945281fbfa54ef6a1b1b5a6
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/****************************************************************************************
19Portions 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)
26Permission to distribute, modify and use this file under the standard license
27terms 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*/
194Word16 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