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/d2_11pf.c
35  Functions:
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: Per review comments...
46  (1) Removed include of "count.h" and "basic_op.h"
47 
48  Description:  Replaced "int" and/or "char" with OSCL defined types.
49 
50  Description:
51 
52 ------------------------------------------------------------------------------
53  MODULE DESCRIPTION
54 */
55 
56 /*----------------------------------------------------------------------------
57 ; INCLUDES
58 ----------------------------------------------------------------------------*/
59 #include "d2_11pf.h"
60 #include "typedef.h"
61 #include "cnst.h"
62 
63 
64 /*----------------------------------------------------------------------------
65 ; MACROS
66 ; Define module specific macros here
67 ----------------------------------------------------------------------------*/
68 
69 /*----------------------------------------------------------------------------
70 ; DEFINES
71 ; Include all pre-processor statements here. Include conditional
72 ; compile variables also.
73 ----------------------------------------------------------------------------*/
74 #define NB_PULSE  2
75 
76 
77 /*----------------------------------------------------------------------------
78 ; LOCAL FUNCTION DEFINITIONS
79 ; Function Prototype declaration
80 ----------------------------------------------------------------------------*/
81 
82 /*----------------------------------------------------------------------------
83 ; LOCAL VARIABLE DEFINITIONS
84 ; Variable declaration - defined here and used outside this module
85 ----------------------------------------------------------------------------*/
86 
87 /*
88 ------------------------------------------------------------------------------
89  FUNCTION NAME: decode_2i40_11bits
90 ------------------------------------------------------------------------------
91  INPUT AND OUTPUT DEFINITIONS
92 
93  Inputs:
94     sign  -- Word16 -- signs of 2 pulses.
95     index -- Word16 -- Positions of the 2 pulses.
96 
97  Outputs:
98     cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
99 
100  Returns:
101     None
102 
103  Global Variables Used:
104     None
105 
106  Local Variables Needed:
107     None
108 
109 ------------------------------------------------------------------------------
110  FUNCTION DESCRIPTION
111 
112 
113 ------------------------------------------------------------------------------
114  REQUIREMENTS
115 
116  None
117 
118 ------------------------------------------------------------------------------
119  REFERENCES
120 
121  d2_11pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
122 
123 ------------------------------------------------------------------------------
124  PSEUDO-CODE
125 
126 
127 ------------------------------------------------------------------------------
128  RESOURCES USED [optional]
129 
130  When the code is written for a specific target processor the
131  the resources used should be documented below.
132 
133  HEAP MEMORY USED: x bytes
134 
135  STACK MEMORY USED: x bytes
136 
137  CLOCK CYCLES: (cycle count equation for this function) + (variable
138                 used to represent cycle count for each subroutine
139                 called)
140      where: (cycle count variable) = cycle count for [subroutine
141                                      name]
142 
143 ------------------------------------------------------------------------------
144  CAUTION [optional]
145  [State any special notes, constraints or cautions for users of this function]
146 
147 ------------------------------------------------------------------------------
148 */
149 
decode_2i40_11bits(Word16 sign,Word16 index,Word16 cod[])150 void decode_2i40_11bits(
151     Word16 sign,   /* i : signs of 2 pulses.                       */
152     Word16 index,  /* i : Positions of the 2 pulses.               */
153     Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
154 )
155 
156 {
157     Word16 i;
158     Word16 j;
159 
160     Word16 pos[NB_PULSE];
161 
162     /* Decode the positions */
163 
164     j = index & 0x1;
165 
166     index >>= 1;
167 
168     i = index & 0x7;
169 
170     pos[0] = i * 5 + j * 2 + 1;
171 
172 
173 
174 
175     index >>= 3;
176 
177     j = index & 0x3;
178 
179     index >>= 2;
180 
181     i = index & 0x7;
182 
183     if (j == 3)
184     {
185         pos[1] = i * 5 + 4;
186     }
187     else
188     {
189         pos[1] = i * 5 + j;
190     }
191 
192 
193 
194 
195     /* decode the signs  and build the codeword */
196     for (i = 0; i < L_SUBFR; i++)
197     {
198         cod[i] = 0;
199     }
200 
201     for (j = 0; j < NB_PULSE; j++)
202     {
203         i = sign & 1;
204 
205         /* This line is equivalent to...
206          *
207          *
208          *  if (i == 1)
209          *  {
210          *      cod[pos[j]] = 8191;
211          *  }
212          *  if (i == 0)
213          *  {
214          *      cod[pos[j]] = -8192;
215          *  }
216          */
217 
218         cod[pos[j]] = i * 16383 - 8192;
219 
220         sign >>= 1;
221     }
222 
223     return;
224 }
225