d2_11pf.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/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
150void 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