Home | History | Annotate | Download | only in src
      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 
     31 Word32 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 
     51 Word32 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 
    106 Word32 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 
    147 Word32 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 
    187 Word32 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 
    253 Word32 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 
    327 Word32 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