• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/pred_lt.c
31 
32 ------------------------------------------------------------------------------
33  REVISION HISTORY
34 
35  Description: Updated template used to PV coding template. First attempt at
36           optimizing C code.
37 
38  Description: Deleted variables listed in the Local Stores Needed/Modified
39           sections.
40 
41  Description: Updated file per comments from Phase 2/3 review.
42 
43  Description: Synchronized file with UMTS version 3.2.0. Updated coding
44               template. Removed unnecessary include files.
45 
46  Description: Fixed typecasting issue with TI C compiler. Updated copyright
47               year.
48 
49  Description:
50  (1) Removed instance of static in the const table "inter_6"
51  (2) Changed Overflow from a global to a parameter passed via a pointer.
52  (3) Made numerous small changes to bring code more in line with PV standards.
53 
54  Description:  For pred_ltp()
55               1. Eliminated unused include files.
56               2. Replaced array addressing by pointers
57               3. Eliminated math operations that unnecessary checked for
58                  saturation
59               4. Unrolled loops to speed up processing, use decrement loops,
60                  loaded into memory filter coefficient in linear order for
61                  faster execution in main loop.
62               5. Eliminated call to round by proper initialization
63 
64  Description:  Replaced "int" and/or "char" with defined types.
65                Added proper casting (Word32) to some left shifting operations
66 
67 
68  Description: Changed round function name to pv_round to avoid conflict with
69               round function in C standard library.
70 
71  Who:                           Date:
72  Description:
73 
74 ------------------------------------------------------------------------------
75 */
76 
77 /*----------------------------------------------------------------------------
78 ; INCLUDES
79 ----------------------------------------------------------------------------*/
80 #include "pred_lt.h"
81 #include "cnst.h"
82 
83 /*----------------------------------------------------------------------------
84 ; MACROS
85 ; Define module specific macros here
86 ----------------------------------------------------------------------------*/
87 
88 /*----------------------------------------------------------------------------
89 ; DEFINES
90 ; Include all pre-processor statements here. Include conditional
91 ; compile variables also.
92 ----------------------------------------------------------------------------*/
93 #define UP_SAMP_MAX  6
94 #define L_INTER10    (L_INTERPOL-1)
95 #define FIR_SIZE     (UP_SAMP_MAX*L_INTER10+1)
96 
97 /*----------------------------------------------------------------------------
98 ; LOCAL FUNCTION DEFINITIONS
99 ; Function Prototype declaration
100 ----------------------------------------------------------------------------*/
101 
102 /*----------------------------------------------------------------------------
103 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
104 ; Variable declaration - defined here and used outside this module
105 ----------------------------------------------------------------------------*/
106 
107 /* 1/6 resolution interpolation filter  (-3 dB at 3600 Hz) */
108 /* Note: the 1/3 resolution filter is simply a subsampled
109  *       version of the 1/6 resolution filter, i.e. it uses
110  *       every second coefficient:
111  *
112  *          inter_3l[k] = inter_6[2*k], 0 <= k <= 3*L_INTER10
113  */
114 
115 const Word16 inter_6_pred_lt[FIR_SIZE] =
116 {
117     29443,
118     28346, 25207, 20449, 14701,  8693,  3143,
119     -1352, -4402, -5865, -5850, -4673, -2783,
120     -672,  1211,  2536,  3130,  2991,  2259,
121     1170,     0, -1001, -1652, -1868, -1666,
122     -1147,  -464,   218,   756,  1060,  1099,
123     904,   550,   135,  -245,  -514,  -634,
124     -602,  -451,  -231,     0,   191,   308,
125     340,   296,   198,    78,   -36,  -120,
126     -163,  -165,  -132,   -79,   -19,    34,
127     73,    91,    89,    70,    38,     0
128 };
129 
130 
131 /*
132 ------------------------------------------------------------------------------
133  FUNCTION NAME: Pred_lt_3or6
134 ------------------------------------------------------------------------------
135  INPUT AND OUTPUT DEFINITIONS
136 
137  Inputs:
138     exc = buffer containing the excitation (Word16)
139     T0 = integer pitch lag (Word16)
140     frac = fraction of lag (Word16)
141     L_subfr = number of samples per subframe (Word16)
142     flag3 = flag to indicate the upsampling rate; if set, upsampling
143             rate is 3, otherwise, upsampling rate is 6 (Word16)
144 
145     pOverflow = pointer to overflow (Flag)
146 
147  Returns:
148     None
149 
150  Outputs:
151     exc buffer contains the newly formed adaptive codebook excitation
152     pOverflow -> 1 if the add operation resulted in overflow
153 
154  Global Variables Used:
155     inter_6_pred_lt = (1/6) resolution interpolation filter table (Word16)
156 
157  Local Variables Needed:
158     None
159 
160 ------------------------------------------------------------------------------
161  FUNCTION DESCRIPTION
162 
163  This function computes the result of long term prediction with fractional
164  interpolation of resolution 1/3 or 1/6. (Interpolated past excitation).
165 
166  The past excitation signal at the given delay is interpolated at
167  the given fraction to build the adaptive codebook excitation.
168  On return exc[0..L_subfr-1] contains the interpolated signal
169  (adaptive codebook excitation).
170 
171 ------------------------------------------------------------------------------
172  REQUIREMENTS
173 
174  None
175 
176 ------------------------------------------------------------------------------
177  REFERENCES
178 
179  pred_lt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
180 
181 ------------------------------------------------------------------------------
182  PSEUDO-CODE
183 
184 void Pred_lt_3or6 (
185     Word16 exc[],     // in/out: excitation buffer
186     Word16 T0,        // input : integer pitch lag
187     Word16 frac,      // input : fraction of lag
188     Word16 L_subfr,   // input : subframe size
189     Word16 flag3      // input : if set, upsampling rate = 3 (6 otherwise)
190 )
191 {
192     Word16 i, j, k;
193     Word16 *pX0, *pX1, *pX2;
194     const Word16 *pC1, *pC2;
195     Word32 s;
196 
197     pX0 = &exc[-T0];
198 
199     frac = negate (frac);
200     if (flag3 != 0)
201     {
202       frac = shl (frac, 1);   // inter_3l[k] = inter_6[2*k] -> k' = 2*k
203     }
204 
205     if (frac < 0)
206     {
207         frac = add (frac, UP_SAMP_MAX);
208         pX0--;
209     }
210 
211     for (j = 0; j < L_subfr; j++)
212     {
213         pX1 = pX0++;
214         pX2 = pX0;
215         pC1 = &inter_6[frac];
216         pC2 = &inter_6[sub (UP_SAMP_MAX, frac)];
217 
218         s = 0;
219         for (i = 0, k = 0; i < L_INTER10; i++, k += UP_SAMP_MAX)
220         {
221             s = L_mac (s, pX1[-i], pC1[k]);
222             s = L_mac (s, pX2[i], pC2[k]);
223         }
224 
225         exc[j] = pv_round (s);
226     }
227 
228     return;
229 }
230 
231 ------------------------------------------------------------------------------
232  RESOURCES USED [optional]
233 
234  When the code is written for a specific target processor the
235  the resources used should be documented below.
236 
237  HEAP MEMORY USED: x bytes
238 
239  STACK MEMORY USED: x bytes
240 
241  CLOCK CYCLES: (cycle count equation for this function) + (variable
242                 used to represent cycle count for each subroutine
243                 called)
244      where: (cycle count variable) = cycle count for [subroutine
245                                      name]
246 
247 ------------------------------------------------------------------------------
248  CAUTION [optional]
249  [State any special notes, constraints or cautions for users of this function]
250 
251 ------------------------------------------------------------------------------
252 */
253 
Pred_lt_3or6(Word16 exc[],Word16 T0,Word16 frac,Word16 L_subfr,Word16 flag3,Flag * pOverflow)254 void Pred_lt_3or6(
255     Word16 exc[],     /* in/out: excitation buffer                          */
256     Word16 T0,        /* input : integer pitch lag                          */
257     Word16 frac,      /* input : fraction of lag                            */
258     Word16 L_subfr,   /* input : subframe size                              */
259     Word16 flag3,     /* input : if set, upsampling rate = 3 (6 otherwise)  */
260     Flag  *pOverflow  /* output: if set, overflow occurred in this function */
261 )
262 {
263     Word16 i;
264     Word16 j;
265     Word16 k;
266 
267     Word16 *pX0;
268     Word16 *pX2;
269     Word16 *pX3;
270     Word16 *p_exc;
271     Word16 *pC1;
272     const Word16 *pC1_ref;
273     const Word16 *pC2_ref;
274 
275     Word16 Coeff_1[(L_INTER10<<1)];
276 
277     Word32 s1;
278     Word32 s2;
279     OSCL_UNUSED_ARG(pOverflow);
280 
281     pX0 = &(exc[-T0]);
282 
283     /* frac goes between -3 and 3 */
284 
285     frac = -frac;
286 
287     if (flag3 != 0)
288     {
289         frac <<= 1;   /* inter_3l[k] = inter_6[2*k] -> k' = 2*k */
290     }
291 
292     if (frac < 0)
293     {
294         frac += UP_SAMP_MAX;
295         pX0--;
296     }
297 
298     pC1_ref = &inter_6_pred_lt[frac];
299     pC2_ref = &inter_6_pred_lt[UP_SAMP_MAX-frac];
300 
301 
302     pC1 = Coeff_1;
303 
304     k = 0;
305 
306     for (i = L_INTER10 >> 1; i > 0; i--)
307     {
308         *(pC1++) = pC1_ref[k];
309         *(pC1++) = pC2_ref[k];
310         k += UP_SAMP_MAX;
311         *(pC1++) = pC1_ref[k];
312         *(pC1++) = pC2_ref[k];
313         k += UP_SAMP_MAX;
314 
315     }
316 
317     p_exc = exc;
318 
319     for (j = (L_subfr >> 1); j != 0 ; j--)
320     {
321         pX0++;
322         pX2 = pX0;
323         pX3 = pX0++;
324 
325         pC1 = Coeff_1;
326 
327         s1  = 0x00004000L;
328         s2  = 0x00004000L;
329 
330         for (i = L_INTER10 >> 1; i > 0; i--)
331         {
332             s2 += ((Word32) * (pX3--)) * *(pC1);
333             s1 += ((Word32) * (pX3)) * *(pC1++);
334             s1 += ((Word32) * (pX2++)) * *(pC1);
335             s2 += ((Word32) * (pX2)) * *(pC1++);
336             s2 += ((Word32) * (pX3--)) * *(pC1);
337             s1 += ((Word32) * (pX3)) * *(pC1++);
338             s1 += ((Word32) * (pX2++)) * *(pC1);
339             s2 += ((Word32) * (pX2)) * *(pC1++);
340 
341         } /* for (i = L_INTER10>>1; i > 0; i--) */
342 
343         *(p_exc++) = (Word16)(s1 >> 15);
344         *(p_exc++) = (Word16)(s2 >> 15);
345 
346     } /* for (j = (L_subfr>>1); j != 0 ; j--) */
347 
348     return;
349 }
350