q_pulse.c revision 5d5c3a132bb446ac78a37dfaac24a46cacf0dd73
1/*
2 ** Copyright 2003-2010, VisualOn, Inc.
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 express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16
17/***********************************************************************
18*      File: q_pulse.c                                                 *
19*                                                                      *
20*      Description: Coding and decoding of algebraic codebook          *
21*                                                                      *
22************************************************************************/
23
24#include <stdio.h>
25#include "typedef.h"
26#include "basic_op.h"
27#include "q_pulse.h"
28
29#define NB_POS 16                          /* pos in track, mask for sign bit */
30
31Word32 quant_1p_N1(                        /* (o) return N+1 bits             */
32        Word16 pos,                        /* (i) position of the pulse       */
33        Word16 N)                          /* (i) number of bits for position */
34{
35    Word16 mask;
36    Word32 index;
37
38    mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
39    /*-------------------------------------------------------*
40     * Quantization of 1 pulse with N+1 bits:                *
41     *-------------------------------------------------------*/
42    index = L_deposit_l((Word16) (pos & mask));
43    if ((pos & NB_POS) != 0)
44    {
45        index = vo_L_add(index, L_deposit_l(1 << N));   /* index += 1 << N; */
46    }
47    return (index);
48}
49
50
51Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */
52        Word16 pos1,                          /* (i) position of the pulse 1     */
53        Word16 pos2,                          /* (i) position of the pulse 2     */
54        Word16 N)                             /* (i) number of bits for position */
55{
56    Word16 mask, tmp;
57    Word32 index;
58    mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
59    /*-------------------------------------------------------*
60     * Quantization of 2 pulses with 2*N+1 bits:             *
61     *-------------------------------------------------------*/
62    if (((pos2 ^ pos1) & NB_POS) == 0)
63    {
64        /* sign of 1st pulse == sign of 2th pulse */
65        if(pos1 <= pos2)          /* ((pos1 - pos2) <= 0) */
66        {
67            /* index = ((pos1 & mask) << N) + (pos2 & mask); */
68            index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
69        } else
70        {
71            /* ((pos2 & mask) << N) + (pos1 & mask); */
72            index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
73        }
74        if ((pos1 & NB_POS) != 0)
75        {
76            tmp = (N << 1);
77            index = vo_L_add(index, (1L << tmp));       /* index += 1 << (2*N); */
78        }
79    } else
80    {
81        /* sign of 1st pulse != sign of 2th pulse */
82        if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
83        {
84            /* index = ((pos2 & mask) << N) + (pos1 & mask); */
85            index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
86            if ((pos2 & NB_POS) != 0)
87            {
88                tmp = (N << 1);           /* index += 1 << (2*N); */
89                index = vo_L_add(index, (1L << tmp));
90            }
91        } else
92        {
93            /* index = ((pos1 & mask) << N) + (pos2 & mask);     */
94            index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
95            if ((pos1 & NB_POS) != 0)
96            {
97                tmp = (N << 1);
98                index = vo_L_add(index, (1 << tmp));    /* index += 1 << (2*N); */
99            }
100        }
101    }
102    return (index);
103}
104
105
106Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */
107        Word16 pos1,                          /* (i) position of the pulse 1     */
108        Word16 pos2,                          /* (i) position of the pulse 2     */
109        Word16 pos3,                          /* (i) position of the pulse 3     */
110        Word16 N)                             /* (i) number of bits for position */
111{
112    Word16 nb_pos;
113    Word32 index;
114
115    nb_pos =(1 <<(N - 1));            /* nb_pos = (1<<(N-1)); */
116    /*-------------------------------------------------------*
117     * Quantization of 3 pulses with 3*N+1 bits:             *
118     *-------------------------------------------------------*/
119    if (((pos1 ^ pos2) & nb_pos) == 0)
120    {
121        index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
122        /* index += (pos1 & nb_pos) << N; */
123        index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
124        /* index += quant_1p_N1(pos3, N) << (2*N); */
125        index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
126
127    } else if (((pos1 ^ pos3) & nb_pos) == 0)
128    {
129        index = quant_2p_2N1(pos1, pos3, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
130        index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
131        /* index += (pos1 & nb_pos) << N; */
132        index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
133        /* index += quant_1p_N1(pos2, N) <<
134         * (2*N); */
135    } else
136    {
137        index = quant_2p_2N1(pos2, pos3, (N - 1));    /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
138        /* index += (pos2 & nb_pos) << N;            */
139        index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
140        /* index += quant_1p_N1(pos1, N) << (2*N);   */
141        index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
142    }
143    return (index);
144}
145
146
147Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */
148        Word16 pos1,                          /* (i) position of the pulse 1     */
149        Word16 pos2,                          /* (i) position of the pulse 2     */
150        Word16 pos3,                          /* (i) position of the pulse 3     */
151        Word16 pos4,                          /* (i) position of the pulse 4     */
152        Word16 N)                             /* (i) number of bits for position */
153{
154    Word16 nb_pos;
155    Word32 index;
156
157    nb_pos = 1 << (N - 1);            /* nb_pos = (1<<(N-1));  */
158    /*-------------------------------------------------------*
159     * Quantization of 4 pulses with 4*N+1 bits:             *
160     *-------------------------------------------------------*/
161    if (((pos1 ^ pos2) & nb_pos) == 0)
162    {
163        index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
164        /* index += (pos1 & nb_pos) << N;    */
165        index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
166        /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
167        index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
168    } else if (((pos1 ^ pos3) & nb_pos) == 0)
169    {
170        index = quant_2p_2N1(pos1, pos3, (N - 1));
171        /* index += (pos1 & nb_pos) << N; */
172        index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
173        /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
174        index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
175    } else
176    {
177        index = quant_2p_2N1(pos2, pos3, (N - 1));
178        /* index += (pos2 & nb_pos) << N; */
179        index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
180        /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
181        index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
182    }
183    return (index);
184}
185
186
187Word32 quant_4p_4N(                        /* (o) return 4*N bits             */
188        Word16 pos[],                         /* (i) position of the pulse 1..4  */
189        Word16 N)                             /* (i) number of bits for position */
190{
191    Word16 nb_pos, mask __unused, n_1, tmp;
192    Word16 posA[4], posB[4];
193    Word32 i, j, k, index;
194
195    n_1 = (Word16) (N - 1);
196    nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
197    mask = vo_sub((1 << N), 1);              /* mask = ((1<<N)-1); */
198
199    i = 0;
200    j = 0;
201    for (k = 0; k < 4; k++)
202    {
203        if ((pos[k] & nb_pos) == 0)
204        {
205            posA[i++] = pos[k];
206        } else
207        {
208            posB[j++] = pos[k];
209        }
210    }
211
212    switch (i)
213    {
214        case 0:
215            tmp = vo_sub((N << 2), 3);           /* index = 1 << ((4*N)-3); */
216            index = (1L << tmp);
217            /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
218            index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
219            break;
220        case 1:
221            /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
222            tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
223            index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
224            /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
225            index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
226            break;
227        case 2:
228            tmp = ((n_1 << 1) + 1);         /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
229            index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
230            /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
231            index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
232            break;
233        case 3:
234            /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
235            index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
236            index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
237            break;
238        case 4:
239            index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
240            break;
241        default:
242            index = 0;
243            fprintf(stderr, "Error in function quant_4p_4N\n");
244    }
245    tmp = ((N << 2) - 2);               /* index += (i & 3) << ((4*N)-2); */
246    index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
247
248    return (index);
249}
250
251
252
253Word32 quant_5p_5N(                        /* (o) return 5*N bits             */
254        Word16 pos[],                         /* (i) position of the pulse 1..5  */
255        Word16 N)                             /* (i) number of bits for position */
256{
257    Word16 nb_pos, n_1, tmp;
258    Word16 posA[5], posB[5];
259    Word32 i, j, k, index, tmp2;
260
261    n_1 = (Word16) (N - 1);
262    nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
263
264    i = 0;
265    j = 0;
266    for (k = 0; k < 5; k++)
267    {
268        if ((pos[k] & nb_pos) == 0)
269        {
270            posA[i++] = pos[k];
271        } else
272        {
273            posB[j++] = pos[k];
274        }
275    }
276
277    switch (i)
278    {
279        case 0:
280            tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
281            index = L_shl(1L, tmp);   /* index = 1 << ((5*N)-1); */
282            tmp = add1((N << 1), 1);  /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
283            tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
284            index = vo_L_add(index, tmp2);
285            index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N));        /* index += quant_2p_2N1(posB[3], posB[4], N); */
286            break;
287        case 1:
288            tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* index = 1 << ((5*N)-1); */
289            index = L_shl(1L, tmp);
290            tmp = add1((N << 1), 1);   /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */
291            tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
292            index = vo_L_add(index, tmp2);
293            index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N));        /* index += quant_2p_2N1(posB[3], posA[0], N); */
294            break;
295        case 2:
296            tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
297            index = L_shl(1L, tmp);            /* index = 1 << ((5*N)-1); */
298            tmp = add1((N << 1), 1);           /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */
299            tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
300            index = vo_L_add(index, tmp2);
301            index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N));        /* index += quant_2p_2N1(posA[0], posA[1], N); */
302            break;
303        case 3:
304            tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
305            index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
306            index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N));        /* index += quant_2p_2N1(posB[0], posB[1], N); */
307            break;
308        case 4:
309            tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
310            index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
311            index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N));        /* index += quant_2p_2N1(posA[3], posB[0], N); */
312            break;
313        case 5:
314            tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
315            index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
316            index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N));        /* index += quant_2p_2N1(posA[3], posA[4], N); */
317            break;
318        default:
319            index = 0;
320            fprintf(stderr, "Error in function quant_5p_5N\n");
321    }
322
323    return (index);
324}
325
326
327Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */
328        Word16 pos[],                         /* (i) position of the pulse 1..6  */
329        Word16 N)                             /* (i) number of bits for position */
330{
331    Word16 nb_pos, n_1;
332    Word16 posA[6], posB[6];
333    Word32 i, j, k, index;
334
335    /* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
336    n_1 = (Word16) (N - 1);
337    nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
338
339    i = 0;
340    j = 0;
341    for (k = 0; k < 6; k++)
342    {
343        if ((pos[k] & nb_pos) == 0)
344        {
345            posA[i++] = pos[k];
346        } else
347        {
348            posB[j++] = pos[k];
349        }
350    }
351
352    switch (i)
353    {
354        case 0:
355            index = (1 << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
356            index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
357            index = vo_L_add(index, quant_1p_N1(posB[5], n_1));        /* index += quant_1p_N1(posB[5], n_1); */
358            break;
359        case 1:
360            index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
361            index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
362            index = vo_L_add(index, quant_1p_N1(posA[0], n_1));        /* index += quant_1p_N1(posA[0], n_1); */
363            break;
364        case 2:
365            index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
366            /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
367            index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
368            index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1));      /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
369            break;
370        case 3:
371            index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
372                                              /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
373            index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
374                                             /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
375            break;
376        case 4:
377            i = 2;
378            index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1));  /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
379            index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));      /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
380            break;
381        case 5:
382            i = 1;
383            index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
384            index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
385            break;
386        case 6:
387            i = 0;
388            index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
389            index = vo_L_add(index, quant_1p_N1(posA[5], n_1));        /* index += quant_1p_N1(posA[5], n_1); */
390            break;
391        default:
392            index = 0;
393            fprintf(stderr, "Error in function quant_6p_6N_2\n");
394    }
395    index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4)));   /* index += (i & 3) << ((6*N)-4); */
396
397    return (index);
398}
399
400
401