d4_17pf.cpp revision 4f1efc098cb5791c3e9f483f2af84aef70d2d0a0
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/d4_17pf.c
35 Functions: decode_4i40_17bits
36
37     Date: 01/28/2002
38
39------------------------------------------------------------------------------
40 REVISION HISTORY
41
42 Description: Modified to place file in the correct template format. Eliminated
43 use of special functions to perform simple mathematical operations.
44
45 Description: An incorrect comment in the original source lead me to implement
46 the calculation of pos[2] incorrectly.  The correct formula is pos2 =i*5+2,
47 not pos2 = i*5 + 1.
48
49 Description:  Replaced "int" and/or "char" with OSCL defined types.
50
51 Description: Added #ifdef __cplusplus around extern'ed table.
52
53 Description:
54
55------------------------------------------------------------------------------
56 MODULE DESCRIPTION
57
58
59 FUNCTION:  decode_4i40_17bits (decod_ACELP())
60
61 PURPOSE:   Algebraic codebook decoder. For details about the encoding see
62            c4_17pf.c
63*/
64
65/*----------------------------------------------------------------------------
66; INCLUDES
67----------------------------------------------------------------------------*/
68#include "typedef.h"
69#include "basic_op.h"
70#include "cnst.h"
71#include "d4_17pf.h"
72
73/*--------------------------------------------------------------------------*/
74#ifdef __cplusplus
75extern "C"
76{
77#endif
78
79    /*----------------------------------------------------------------------------
80    ; MACROS
81    ; Define module specific macros here
82    ----------------------------------------------------------------------------*/
83
84    /*----------------------------------------------------------------------------
85    ; DEFINES
86    ; Include all pre-processor statements here. Include conditional
87    ; compile variables also.
88    ----------------------------------------------------------------------------*/
89#define NB_PULSE 4           /* number of pulses  */
90
91
92    /*----------------------------------------------------------------------------
93    ; LOCAL FUNCTION DEFINITIONS
94    ; Function Prototype declaration
95    ----------------------------------------------------------------------------*/
96
97    /*----------------------------------------------------------------------------
98    ; LOCAL VARIABLE DEFINITIONS
99    ; Variable declaration - defined here and used outside this module
100    ----------------------------------------------------------------------------*/
101
102    /*----------------------------------------------------------------------------
103    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
104    ; Declare variables used in this module but defined elsewhere
105    ----------------------------------------------------------------------------*/
106    extern const Word16 dgray[];
107
108    /*--------------------------------------------------------------------------*/
109#ifdef __cplusplus
110}
111#endif
112
113/*
114------------------------------------------------------------------------------
115 FUNCTION NAME: decode_4i40_17bits
116------------------------------------------------------------------------------
117 INPUT AND OUTPUT DEFINITIONS
118
119 Inputs:
120    sign  -- Word16 -- signs of 3 pulses.
121    index -- Word16 -- Positions of the 3 pulses.
122
123 Outputs:
124    cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
125
126 Returns:
127    None
128
129 Global Variables Used:
130    None
131
132 Local Variables Needed:
133    None
134
135------------------------------------------------------------------------------
136 FUNCTION DESCRIPTION
137
138
139------------------------------------------------------------------------------
140 REQUIREMENTS
141
142 None
143
144------------------------------------------------------------------------------
145 REFERENCES
146
147 d4_17pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
148
149------------------------------------------------------------------------------
150 PSEUDO-CODE
151
152
153------------------------------------------------------------------------------
154 RESOURCES USED [optional]
155
156 When the code is written for a specific target processor the
157 the resources used should be documented below.
158
159 HEAP MEMORY USED: x bytes
160
161 STACK MEMORY USED: x bytes
162
163 CLOCK CYCLES: (cycle count equation for this function) + (variable
164                used to represent cycle count for each subroutine
165                called)
166     where: (cycle count variable) = cycle count for [subroutine
167                                     name]
168
169------------------------------------------------------------------------------
170 CAUTION [optional]
171 [State any special notes, constraints or cautions for users of this function]
172
173------------------------------------------------------------------------------
174*/
175
176void decode_4i40_17bits(
177    Word16 sign,   /* i : signs of 4 pulses.                       */
178    Word16 index,  /* i : Positions of the 4 pulses.               */
179    Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
180)
181{
182    Word16 i;
183    Word16 j;
184
185    Word16 pos[NB_PULSE];
186
187    /* Index is a 13-bit value.  3 bits each correspond to the
188     * positions 0-2, with 4 bits allocated for position 3.
189     *
190     *
191     * [][][][] [][][] [][][] [][][]
192     *    |       |      |     |
193     *    |       |      |     |
194     *   pos3    pos2   pos1  pos0
195     */
196
197    /* Decode the positions */
198
199    i = index & 0x7;
200
201    i = dgray[i];
202
203    pos[0] = i * 5; /* pos0 =i*5 */
204
205
206    index >>= 3;
207
208    i = index & 0x7;
209
210    i = dgray[i];
211
212    pos[1] = i * 5 + 1;  /* pos1 =i*5+1 */
213
214
215
216    index >>= 3;
217
218    i = index & 0x7;
219
220    i = dgray[i];
221
222    pos[2] = i * 5 + 2; /* pos2 =i*5+2 */
223
224
225
226
227
228    index >>= 3;
229
230    j = index & 0x1;
231
232    index >>= 1;
233
234    i = index & 0x7;
235
236    i = dgray[i];
237
238    pos[3] = i * 5 + 3 + j; /* pos3 =i*5+3+j */
239
240
241    /* decode the signs  and build the codeword */
242
243    for (i = 0; i < L_SUBFR; i++)
244    {
245        cod[i] = 0;
246    }
247
248    for (j = 0; j < NB_PULSE; j++)
249    {
250        i = sign & 0x1;
251
252        /* This line is equivalent to...
253         *
254         *
255         *  if (i == 1)
256         *  {
257         *      cod[pos[j]] = 8191;
258         *  }
259         *  if (i == 0)
260         *  {
261         *      cod[pos[j]] = -8192;
262         *  }
263         */
264
265        cod[pos[j]] = i * 16383 - 8192;
266
267        sign >>= 1;
268    }
269
270    return;
271}
272