• 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 ------------------------------------------------------------------------------
31 
32 
33 
34  Pathname: ./audio/gsm-amr/c/src/cbsearch.c
35  Functions: D_plsf_3
36 
37      Date: 01/31/2002
38 
39 ------------------------------------------------------------------------------
40  REVISION HISTORY
41 
42  Description:
43  (1) Removed "count.h" and "basic_op.h" and replaced with individual include
44      files (add.h, sub.h, etc.)
45  (2) Added pOverflow parameter to code_10i40_35bits()
46 
47  Description:  Replaced "int" and/or "char" with OSCL defined types.
48 
49  Description:
50 
51  ------------------------------------------------------------------------------
52  INPUT AND OUTPUT DEFINITIONS
53 
54  Inputs:
55     x[] -- array of type Word16 -- target vector, Q0
56     h[] -- array of type Word16 -- impulse response of weighted synthesis
57                                    filter h[-L_subfr..-1] must be set to
58                                    zero. Q12
59     T0  -- Word16 -- Pitch lag
60     pitch_sharp -- Word16 -- Last quantized pitch gain, Q14
61     gain_pit --  Word16 gain_pit -- Pitch gain, Q14
62     res2[] -- array of type Word16 -- Long term prediction residual, Q0
63     mode -- enum Mode --  coder mode
64     subNr -- Word16 -- subframe number
65 
66  Outputs:
67     code[] -- array of type Word16 -- Innovative codebook, Q13
68     y[] -- array of type Word16 -- filtered fixed codebook excitation
69                                    Q12
70 
71     anap -- Double pointer to Word16 -- Signs of the pulses
72 
73 
74     pOverflow -- pointer to Flag -- Flag set when overflow occurs
75 
76  Returns:
77     Zero
78 
79  Global Variables Used:
80     None
81 
82  Local Variables Needed:
83     None
84 
85 ------------------------------------------------------------------------------
86  FUNCTION DESCRIPTION
87 
88     Purpose          : Inovative codebook search (find index and gain)
89 
90 ------------------------------------------------------------------------------
91  REQUIREMENTS
92 
93 
94 
95 ------------------------------------------------------------------------------
96  REFERENCES
97 
98  cbsearch.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
99 
100 ------------------------------------------------------------------------------
101  PSEUDO-CODE
102 
103 
104 
105 ------------------------------------------------------------------------------
106  RESOURCES USED
107    When the code is written for a specific target processor the
108      the resources used should be documented below.
109 
110  STACK USAGE: [stack count for this module] + [variable to represent
111           stack usage for each subroutine called]
112 
113      where: [stack usage variable] = stack usage for [subroutine
114          name] (see [filename].ext)
115 
116  DATA MEMORY USED: x words
117 
118  PROGRAM MEMORY USED: x words
119 
120  CLOCK CYCLES: [cycle count equation for this module] + [variable
121            used to represent cycle count for each subroutine
122            called]
123 
124      where: [cycle count variable] = cycle count for [subroutine
125         name] (see [filename].ext)
126 
127 ------------------------------------------------------------------------------
128 */
129 
130 
131 /*----------------------------------------------------------------------------
132 ; INCLUDES
133 ----------------------------------------------------------------------------*/
134 #include "cbsearch.h"
135 
136 #include "typedef.h"
137 #include "c2_9pf.h"
138 #include "c2_11pf.h"
139 #include "c3_14pf.h"
140 #include "c4_17pf.h"
141 #include "c8_31pf.h"
142 #include "c1035pf.h"
143 #include "mode.h"
144 #include "basic_op.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 ; LOCAL FUNCTION DEFINITIONS
161 ; Function Prototype declaration
162 ----------------------------------------------------------------------------*/
163 
164 
165 /*----------------------------------------------------------------------------
166 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
167 ; Variable declaration - defined here and used outside this module
168 ----------------------------------------------------------------------------*/
169 
170 /*----------------------------------------------------------------------------
171 ; EXTERNAL FUNCTION REFERENCES
172 ; Declare functions defined elsewhere and referenced in this module
173 ----------------------------------------------------------------------------*/
174 
175 /*----------------------------------------------------------------------------
176 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
177 ; Declare variables used in this module but defined elsewhere
178 ----------------------------------------------------------------------------*/
179 
180 /*----------------------------------------------------------------------------
181 ; FUNCTION CODE
182 ----------------------------------------------------------------------------*/
183 
cbsearch(Word16 x[],Word16 h[],Word16 T0,Word16 pitch_sharp,Word16 gain_pit,Word16 res2[],Word16 code[],Word16 y[],Word16 ** anap,enum Mode mode,Word16 subNr,Flag * pOverflow)184 void cbsearch(Word16 x[],        /* i : target vector, Q0                     */
185               Word16 h[],        /* i : impulse response of weighted synthesis*/
186               /*     filter h[-L_subfr..-1] must be set to */
187               /*     zero. Q12                             */
188               Word16 T0,         /* i : Pitch lag                             */
189               Word16 pitch_sharp,/* i : Last quantized pitch gain, Q14        */
190               Word16 gain_pit,   /* i : Pitch gain, Q14                       */
191               Word16 res2[],     /* i : Long term prediction residual, Q0     */
192               Word16 code[],     /* o : Innovative codebook, Q13              */
193               Word16 y[],        /* o : filtered fixed codebook excitation    */
194               /*     Q12                                   */
195               Word16 **anap,     /* o : Signs of the pulses                   */
196               enum Mode mode,    /* i : coder mode                            */
197               Word16 subNr,      /* i : subframe number                       */
198               Flag  *pOverflow)  /* o : Flag set when overflow occurs         */
199 {
200     Word16 index;
201     Word16 i;
202     Word16 temp;
203     Word16 pit_sharpTmp;
204 
205     /* For MR74, the pre and post CB pitch sharpening is included in the
206      * codebook search routine, while for MR122 is it not.
207      */
208 
209     if ((mode == MR475) || (mode == MR515))
210     {
211         /* MR475, MR515 */
212         *(*anap)++ =
213             code_2i40_9bits(
214                 subNr,
215                 x,
216                 h,
217                 T0,
218                 pitch_sharp,
219                 code,
220                 y,
221                 &index,
222                 pOverflow);
223 
224         *(*anap)++ = index;    /* sign index */
225     }
226     else if (mode == MR59)
227     {   /* MR59 */
228         *(*anap)++ =
229             code_2i40_11bits(
230                 x,
231                 h,
232                 T0,
233                 pitch_sharp,
234                 code,
235                 y,
236                 &index,
237                 pOverflow);
238 
239         *(*anap)++ = index;    /* sign index */
240     }
241     else if (mode == MR67)
242     {   /* MR67 */
243         *(*anap)++ =
244             code_3i40_14bits(
245                 x,
246                 h,
247                 T0,
248                 pitch_sharp,
249                 code,
250                 y,
251                 &index,
252                 pOverflow);
253 
254         *(*anap)++ = index;    /* sign index */
255     }
256     else if ((mode == MR74) || (mode == MR795))
257     {   /* MR74, MR795 */
258         *(*anap)++ =
259             code_4i40_17bits(
260                 x,
261                 h,
262                 T0,
263                 pitch_sharp,
264                 code,
265                 y,
266                 &index,
267                 pOverflow);
268 
269         *(*anap)++ = index;    /* sign index */
270     }
271     else if (mode == MR102)
272     {   /* MR102 */
273         /*-------------------------------------------------------------*
274          * - include pitch contribution into impulse resp. h1[]        *
275          *-------------------------------------------------------------*/
276         /* pit_sharpTmp = pit_sharp;                     */
277         /* if (pit_sharpTmp > 1.0) pit_sharpTmp = 1.0;   */
278 
279         pit_sharpTmp =
280             shl(
281                 pitch_sharp,
282                 1,
283                 pOverflow);
284 
285         for (i = T0; i < L_SUBFR; i++)
286         {
287             temp =
288                 mult(
289                     h[i - T0],
290                     pit_sharpTmp,
291                     pOverflow);
292 
293             h[i] =
294                 add(
295                     h[i],
296                     temp,
297                     pOverflow);
298         }
299 
300         /*--------------------------------------------------------------*
301          * - Innovative codebook search (find index and gain)           *
302          *--------------------------------------------------------------*/
303         code_8i40_31bits(
304             x,
305             res2,
306             h,
307             code,
308             y,
309             *anap,
310             pOverflow);
311 
312         *anap += 7;
313 
314         /*-------------------------------------------------------*
315          * - Add the pitch contribution to code[].               *
316          *-------------------------------------------------------*/
317         for (i = T0; i < L_SUBFR; i++)
318         {
319             temp =
320                 mult(
321                     code[i - T0],
322                     pit_sharpTmp,
323                     pOverflow);
324 
325             code[i] =
326                 add(
327                     code[i],
328                     temp,
329                     pOverflow);
330         }
331     }
332     else
333     {  /* MR122 */
334         /*-------------------------------------------------------------*
335          * - include pitch contribution into impulse resp. h1[]        *
336          *-------------------------------------------------------------*/
337 
338         /* pit_sharpTmp = gain_pit;                      */
339         /* if (pit_sharpTmp > 1.0) pit_sharpTmp = 1.0;   */
340 
341         pit_sharpTmp = shl(gain_pit, 1, pOverflow);
342 
343         for (i = T0; i < L_SUBFR; i++)
344         {
345             temp = ((Word32)h[i - T0] * pit_sharpTmp) >> 15;
346             /*
347                      mult(
348                             h[i - T0],
349                             ,
350                             pOverflow);
351             */
352             h[i] =
353                 add(
354                     h[i],
355                     temp,
356                     pOverflow);
357         }
358         /*--------------------------------------------------------------*
359          * - Innovative codebook search (find index and gain)           *
360          *--------------------------------------------------------------*/
361 
362         code_10i40_35bits(
363             x,
364             res2,
365             h,
366             code,
367             y,
368             *anap,
369             pOverflow);
370 
371         *anap += 10;
372 
373         /*-------------------------------------------------------*
374          * - Add the pitch contribution to code[].               *
375          *-------------------------------------------------------*/
376         for (i = T0; i < L_SUBFR; i++)
377         {
378             temp =
379                 mult(
380                     code[i - T0],
381                     pit_sharpTmp,
382                     pOverflow);
383 
384             code[i] =
385                 add(
386                     code[i],
387                     temp,
388                     pOverflow);
389         }
390     }
391 
392 }
393