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.173
22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23     Available from http://www.3gpp.org
24 
25 (C) 2007, 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  Filename: dec_acelp_4p_in_64.cpp
35 
36      Date: 05/08/2007
37 
38 ------------------------------------------------------------------------------
39  REVISION HISTORY
40 
41 
42  Description:
43 
44 ------------------------------------------------------------------------------
45  INPUT AND OUTPUT DEFINITIONS
46 
47      int16 index[],    (i) : index (20): 5+5+5+5 = 20 bits.
48                        (i) : index (36): 9+9+9+9 = 36 bits.
49                        (i) : index (44): 13+9+13+9 = 44 bits.
50                        (i) : index (52): 13+13+13+13 = 52 bits.
51                        (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.
52                        (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.
53                        (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.
54      int16 nbbits,     (i) : 20, 36, 44, 52, 64, 72 or 88 bits
55      int16 code[]      (o) Q9: algebraic (fixed) codebook excitation
56 
57 ------------------------------------------------------------------------------
58  FUNCTION DESCRIPTION
59 
60    20, 36, 44, 52, 64, 72, 88 bits algebraic codebook decoder.
61    4 tracks x 16 positions per track = 64 samples.
62 
63    20 bits --> 4 pulses in a frame of 64 samples.
64    36 bits --> 8 pulses in a frame of 64 samples.
65    44 bits --> 10 pulses in a frame of 64 samples.
66    52 bits --> 12 pulses in a frame of 64 samples.
67    64 bits --> 16 pulses in a frame of 64 samples.
68    72 bits --> 18 pulses in a frame of 64 samples.
69    88 bits --> 24 pulses in a frame of 64 samples.
70 
71    All pulses can have two (2) possible amplitudes: +1 or -1.
72    Each pulse can have sixteen (16) possible positions.
73 
74 ------------------------------------------------------------------------------
75  REQUIREMENTS
76 
77 
78 ------------------------------------------------------------------------------
79  REFERENCES
80 
81 ------------------------------------------------------------------------------
82  PSEUDO-CODE
83 
84 ------------------------------------------------------------------------------
85 */
86 
87 
88 /*----------------------------------------------------------------------------
89 ; INCLUDES
90 ----------------------------------------------------------------------------*/
91 
92 #include "pv_amr_wb_type_defs.h"
93 #include "pvamrwbdecoder_basic_op.h"
94 #include "pvamrwbdecoder_cnst.h"
95 #include "pvamrwbdecoder_acelp.h"
96 
97 #include "q_pulse.h"
98 
99 /*----------------------------------------------------------------------------
100 ; MACROS
101 ; Define module specific macros here
102 ----------------------------------------------------------------------------*/
103 
104 
105 /*----------------------------------------------------------------------------
106 ; DEFINES
107 ; Include all pre-processor statements here. Include conditional
108 ; compile variables also.
109 ----------------------------------------------------------------------------*/
110 #define L_CODE    64                       /* codevector length  */
111 #define NB_TRACK  4                        /* number of track    */
112 #define NB_POS    16                       /* number of position */
113 
114 /*----------------------------------------------------------------------------
115 ; LOCAL FUNCTION DEFINITIONS
116 ; Function Prototype declaration
117 ----------------------------------------------------------------------------*/
118 #ifdef __cplusplus
119 extern "C"
120 {
121 #endif
122 
123     void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[]);
124 
125 #ifdef __cplusplus
126 }
127 #endif
128 
129 /*----------------------------------------------------------------------------
130 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
131 ; Variable declaration - defined here and used outside this module
132 ----------------------------------------------------------------------------*/
133 
134 /*----------------------------------------------------------------------------
135 ; EXTERNAL FUNCTION REFERENCES
136 ; Declare functions defined elsewhere and referenced in this module
137 ----------------------------------------------------------------------------*/
138 
139 /*----------------------------------------------------------------------------
140 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
141 ; Declare variables used in this module but defined elsewhere
142 ----------------------------------------------------------------------------*/
143 
144 /*----------------------------------------------------------------------------
145 ; FUNCTION CODE
146 ----------------------------------------------------------------------------*/
147 
dec_acelp_4p_in_64(int16 index[],int16 nbbits,int16 code[])148 void dec_acelp_4p_in_64(
149     int16 index[],  /* (i) : index (20): 5+5+5+5 = 20 bits.                 */
150     /* (i) : index (36): 9+9+9+9 = 36 bits.                 */
151     /* (i) : index (44): 13+9+13+9 = 44 bits.               */
152     /* (i) : index (52): 13+13+13+13 = 52 bits.             */
153     /* (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.     */
154     /* (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.   */
155     /* (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
156     int16 nbbits,   /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits              */
157     int16 code[]    /* (o) Q9: algebraic (fixed) codebook excitation        */
158 )
159 {
160     int16 k, pos[6];
161     int32 L_index;
162     pv_memset(code, 0, L_CODE*sizeof(*code));
163 
164     /* decode the positions and signs of pulses and build the codeword */
165 
166 
167     switch (nbbits)
168     {
169         case 20:
170             for (k = 0; k < NB_TRACK; k++)
171             {
172                 L_index = index[k];
173                 dec_1p_N1(L_index, 4, 0, pos);
174                 add_pulses(pos, 1, k, code);
175             }
176             break;
177 
178         case  36:
179             for (k = 0; k < NB_TRACK; k++)
180             {
181                 L_index = index[k];
182                 dec_2p_2N1(L_index, 4, 0, pos);
183                 add_pulses(pos, 2, k, code);
184             }
185             break;
186         case 44:
187             for (k = 0; k < NB_TRACK - 2; k++)
188             {
189                 L_index = index[k];
190                 dec_3p_3N1(L_index, 4, 0, pos);
191                 add_pulses(pos, 3, k, code);
192             }
193             for (k = 2; k < NB_TRACK; k++)
194             {
195                 L_index = index[k];
196                 dec_2p_2N1(L_index, 4, 0, pos);
197                 add_pulses(pos, 2, k, code);
198             }
199             break;
200         case 52:
201             for (k = 0; k < NB_TRACK; k++)
202             {
203                 L_index = index[k];
204                 dec_3p_3N1(L_index, 4, 0, pos);
205                 add_pulses(pos, 3, k, code);
206             }
207             break;
208         case 64:
209             for (k = 0; k < NB_TRACK; k++)
210             {
211                 L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
212                 dec_4p_4N(L_index, 4, 0, pos);
213                 add_pulses(pos, 4, k, code);
214             }
215             break;
216         case 72:
217             for (k = 0; k < NB_TRACK - 2; k++)
218             {
219                 L_index = ((int32)index[k] << 10) + index[k + NB_TRACK];
220                 dec_5p_5N(L_index, 4, 0, pos);
221                 add_pulses(pos, 5, k, code);
222             }
223             for (k = 2; k < NB_TRACK; k++)
224             {
225                 L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
226                 dec_4p_4N(L_index, 4, 0, pos);
227                 add_pulses(pos, 4, k, code);
228             }
229             break;
230         case 88:
231             for (k = 0; k < NB_TRACK; k++)
232             {
233                 L_index = ((int32)index[k] << 11) + index[k + NB_TRACK];
234                 dec_6p_6N_2(L_index, 4, 0, pos);
235                 add_pulses(pos, 6, k, code);
236             }
237             break;
238         default:
239             break;
240     }
241 
242 
243 }
244 
245 
246 
add_pulses(int16 pos[],int16 nb_pulse,int16 track,int16 code[])247 void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[])
248 {
249     int16 i, k;
250 
251     for (k = 0; k < nb_pulse; k++)
252     {
253         /* i = ((pos[k] & (NB_POS-1))*NB_TRACK) + track; */
254         i = ((pos[k] & (NB_POS - 1)) << 2) + track;
255 
256         if ((pos[k] & NB_POS) == 0)
257         {
258             code[i] +=  512;
259         }
260         else
261         {
262             code[i] -=  512;
263         }
264     }
265 
266 }
267