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