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: apisf_2s.c                                               *
     19 *                                                                      *
     20 *       Description: Coding/Decodeing of ISF parameters with predication
     21 *       The ISF vector is quantized using two-stage VQ with split-by-2 *
     22 *       in 1st stage and split-by-5(or 3) in the second stage          *
     23 *                                                                      *
     24 ************************************************************************/
     25 
     26 #include "typedef.h"
     27 #include "basic_op.h"
     28 #include "cnst.h"
     29 #include "acelp.h"
     30 #include "qpisf_2s.tab"                    /* Codebooks of isfs */
     31 
     32 #define MU         10923                   /* Prediction factor   (1.0/3.0) in Q15 */
     33 #define N_SURV_MAX 4                       /* 4 survivors max */
     34 #define ALPHA      29491                   /* 0. 9 in Q15     */
     35 #define ONE_ALPHA (32768-ALPHA)            /* (1.0 - ALPHA) in Q15 */
     36 
     37 /* private functions */
     38 static void VQ_stage1(
     39         Word16 * x,                           /* input : ISF residual vector           */
     40         Word16 * dico,                        /* input : quantization codebook         */
     41         Word16 dim,                           /* input : dimention of vector           */
     42         Word16 dico_size,                     /* input : size of quantization codebook */
     43         Word16 * index,                       /* output: indices of survivors          */
     44         Word16 surv                           /* input : number of survivor            */
     45         );
     46 
     47 /**************************************************************************
     48 * Function:   Qpisf_2s_46B()                                              *
     49 *                                                                         *
     50 * Description: Quantization of isf parameters with prediction. (46 bits)  *
     51 *                                                                         *
     52 * The isf vector is quantized using two-stage VQ with split-by-2 in       *
     53 *  1st stage and split-by-5 in the second stage.                          *
     54 ***************************************************************************/
     55 
     56 void Qpisf_2s_46b(
     57         Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
     58         Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
     59         Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
     60         Word16 * indice,                      /* (o)     : quantization indices                 */
     61         Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
     62         )
     63 {
     64     Word16 tmp_ind[5];
     65     Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
     66     Word32 i, k, temp, min_err, distance;
     67     Word16 isf[ORDER];
     68     Word16 isf_stage2[ORDER];
     69 
     70     for (i = 0; i < ORDER; i++)
     71     {
     72         isf[i] = vo_sub(isf1[i], mean_isf[i]);
     73         isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
     74     }
     75 
     76     VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
     77 
     78     distance = MAX_32;
     79 
     80     for (k = 0; k < nb_surv; k++)
     81     {
     82         for (i = 0; i < 9; i++)
     83         {
     84             isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
     85         }
     86         tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
     87         temp = min_err;
     88         tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
     89         temp = vo_L_add(temp, min_err);
     90         tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
     91         temp = vo_L_add(temp, min_err);
     92 
     93         if(temp < distance)
     94         {
     95             distance = temp;
     96             indice[0] = surv1[k];
     97             for (i = 0; i < 3; i++)
     98             {
     99                 indice[i + 2] = tmp_ind[i];
    100             }
    101         }
    102     }
    103 
    104 
    105     VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
    106 
    107     distance = MAX_32;
    108 
    109     for (k = 0; k < nb_surv; k++)
    110     {
    111         for (i = 0; i < 7; i++)
    112         {
    113             isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
    114         }
    115 
    116         tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
    117         temp = min_err;
    118         tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
    119         temp = vo_L_add(temp, min_err);
    120 
    121         if(temp < distance)
    122         {
    123             distance = temp;
    124             indice[1] = surv1[k];
    125             for (i = 0; i < 2; i++)
    126             {
    127                 indice[i + 5] = tmp_ind[i];
    128             }
    129         }
    130     }
    131 
    132     Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
    133 
    134     return;
    135 }
    136 
    137 /*****************************************************************************
    138 * Function:   Qpisf_2s_36B()                                                 *
    139 *                                                                            *
    140 * Description: Quantization of isf parameters with prediction. (36 bits)     *
    141 *                                                                            *
    142 * The isf vector is quantized using two-stage VQ with split-by-2 in          *
    143 *  1st stage and split-by-3 in the second stage.                             *
    144 ******************************************************************************/
    145 
    146 void Qpisf_2s_36b(
    147         Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
    148         Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
    149         Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
    150         Word16 * indice,                      /* (o)     : quantization indices                 */
    151         Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
    152         )
    153 {
    154     Word16 i, k, tmp_ind[5];
    155     Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
    156     Word32 temp, min_err, distance;
    157     Word16 isf[ORDER];
    158     Word16 isf_stage2[ORDER];
    159 
    160     for (i = 0; i < ORDER; i++)
    161     {
    162         isf[i] = vo_sub(isf1[i], mean_isf[i]);
    163         isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
    164     }
    165 
    166     VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
    167 
    168     distance = MAX_32;
    169 
    170     for (k = 0; k < nb_surv; k++)
    171     {
    172         for (i = 0; i < 9; i++)
    173         {
    174             isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
    175         }
    176 
    177         tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
    178         temp = min_err;
    179         tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
    180         temp = vo_L_add(temp, min_err);
    181 
    182         if(temp < distance)
    183         {
    184             distance = temp;
    185             indice[0] = surv1[k];
    186             for (i = 0; i < 2; i++)
    187             {
    188                 indice[i + 2] = tmp_ind[i];
    189             }
    190         }
    191     }
    192 
    193     VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
    194     distance = MAX_32;
    195 
    196     for (k = 0; k < nb_surv; k++)
    197     {
    198         for (i = 0; i < 7; i++)
    199         {
    200             isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
    201         }
    202 
    203         tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
    204         temp = min_err;
    205 
    206         if(temp < distance)
    207         {
    208             distance = temp;
    209             indice[1] = surv1[k];
    210             indice[4] = tmp_ind[0];
    211         }
    212     }
    213 
    214     Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
    215 
    216     return;
    217 }
    218 
    219 /*********************************************************************
    220 * Function: Dpisf_2s_46b()                                           *
    221 *                                                                    *
    222 * Description: Decoding of ISF parameters                            *
    223 **********************************************************************/
    224 
    225 void Dpisf_2s_46b(
    226         Word16 * indice,                      /* input:  quantization indices                       */
    227         Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
    228         Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
    229         Word16 * isfold,                      /* input : past quantized ISF                    */
    230         Word16 * isf_buf,                     /* input : isf buffer                                                        */
    231         Word16 bfi,                           /* input : Bad frame indicator                   */
    232         Word16 enc_dec
    233         )
    234 {
    235     Word16 ref_isf[M], tmp;
    236     Word32 i, j, L_tmp;
    237 
    238     if (bfi == 0)                          /* Good frame */
    239     {
    240         for (i = 0; i < 9; i++)
    241         {
    242             isf_q[i] = dico1_isf[indice[0] * 9 + i];
    243         }
    244         for (i = 0; i < 7; i++)
    245         {
    246             isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
    247         }
    248 
    249         for (i = 0; i < 3; i++)
    250         {
    251             isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
    252             isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
    253             isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
    254             isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
    255         }
    256 
    257         for (i = 0; i < 4; i++)
    258         {
    259             isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
    260         }
    261 
    262         for (i = 0; i < ORDER; i++)
    263         {
    264             tmp = isf_q[i];
    265             isf_q[i] = add1(tmp, mean_isf[i]);
    266             isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
    267             past_isfq[i] = tmp;
    268         }
    269 
    270         if (enc_dec)
    271         {
    272             for (i = 0; i < M; i++)
    273             {
    274                 for (j = (L_MEANBUF - 1); j > 0; j--)
    275                 {
    276                     isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
    277                 }
    278                 isf_buf[i] = isf_q[i];
    279             }
    280         }
    281     } else
    282     {                                      /* bad frame */
    283         for (i = 0; i < M; i++)
    284         {
    285             L_tmp = mean_isf[i] << 14;
    286             for (j = 0; j < L_MEANBUF; j++)
    287             {
    288                 L_tmp += (isf_buf[j * M + i] << 14);
    289             }
    290             ref_isf[i] = vo_round(L_tmp);
    291         }
    292 
    293         /* use the past ISFs slightly shifted towards their mean */
    294         for (i = 0; i < ORDER; i++)
    295         {
    296             isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
    297         }
    298 
    299         /* estimate past quantized residual to be used in next frame */
    300         for (i = 0; i < ORDER; i++)
    301         {
    302             tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
    303             past_isfq[i] = vo_sub(isf_q[i], tmp);
    304             past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */
    305         }
    306     }
    307 
    308     Reorder_isf(isf_q, ISF_GAP, ORDER);
    309     return;
    310 }
    311 
    312 /*********************************************************************
    313 * Function:   Disf_2s_36b()                                          *
    314 *                                                                    *
    315 * Description: Decoding of ISF parameters                            *
    316 *********************************************************************/
    317 
    318 void Dpisf_2s_36b(
    319         Word16 * indice,                      /* input:  quantization indices                       */
    320         Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
    321         Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
    322         Word16 * isfold,                      /* input : past quantized ISF                    */
    323         Word16 * isf_buf,                     /* input : isf buffer                                                        */
    324         Word16 bfi,                           /* input : Bad frame indicator                   */
    325         Word16 enc_dec
    326         )
    327 {
    328     Word16 ref_isf[M], tmp;
    329     Word32 i, j, L_tmp;
    330 
    331     if (bfi == 0)                          /* Good frame */
    332     {
    333         for (i = 0; i < 9; i++)
    334         {
    335             isf_q[i] = dico1_isf[indice[0] * 9 + i];
    336         }
    337         for (i = 0; i < 7; i++)
    338         {
    339             isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
    340         }
    341 
    342         for (i = 0; i < 5; i++)
    343         {
    344             isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
    345         }
    346         for (i = 0; i < 4; i++)
    347         {
    348             isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
    349         }
    350         for (i = 0; i < 7; i++)
    351         {
    352             isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
    353         }
    354 
    355         for (i = 0; i < ORDER; i++)
    356         {
    357             tmp = isf_q[i];
    358             isf_q[i] = add1(tmp, mean_isf[i]);
    359             isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
    360             past_isfq[i] = tmp;
    361         }
    362 
    363 
    364         if (enc_dec)
    365         {
    366             for (i = 0; i < M; i++)
    367             {
    368                 for (j = (L_MEANBUF - 1); j > 0; j--)
    369                 {
    370                     isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
    371                 }
    372                 isf_buf[i] = isf_q[i];
    373             }
    374         }
    375     } else
    376     {                                      /* bad frame */
    377         for (i = 0; i < M; i++)
    378         {
    379             L_tmp = (mean_isf[i] << 14);
    380             for (j = 0; j < L_MEANBUF; j++)
    381             {
    382                 L_tmp += (isf_buf[j * M + i] << 14);
    383             }
    384             ref_isf[i] = vo_round(L_tmp);
    385         }
    386 
    387         /* use the past ISFs slightly shifted towards their mean */
    388         for (i = 0; i < ORDER; i++)
    389         {
    390             isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
    391         }
    392 
    393         /* estimate past quantized residual to be used in next frame */
    394         for (i = 0; i < ORDER; i++)
    395         {
    396             tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
    397             past_isfq[i] = vo_sub(isf_q[i], tmp);
    398             past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */
    399         }
    400     }
    401 
    402     Reorder_isf(isf_q, ISF_GAP, ORDER);
    403 
    404     return;
    405 }
    406 
    407 
    408 /***************************************************************************
    409 * Function:  Reorder_isf()                                                 *
    410 *                                                                          *
    411 * Description: To make sure that the  isfs are properly order and to       *
    412 *              keep a certain minimum distance between consecutive isfs.   *
    413 *--------------------------------------------------------------------------*
    414 *    Argument         description                     in/out               *
    415 *                                                                          *
    416 *     isf[]           vector of isfs                    i/o                *
    417 *     min_dist        minimum required distance         i                  *
    418 *     n               LPC order                         i                  *
    419 ****************************************************************************/
    420 
    421 void Reorder_isf(
    422         Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
    423         Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
    424         Word16 n                              /* (i)      : number of ISF                        */
    425         )
    426 {
    427     Word32 i;
    428     Word16 isf_min;
    429 
    430     isf_min = min_dist;
    431     for (i = 0; i < n - 1; i++)
    432     {
    433         if(isf[i] < isf_min)
    434         {
    435             isf[i] = isf_min;
    436         }
    437         isf_min = (isf[i] + min_dist);
    438     }
    439     return;
    440 }
    441 
    442 
    443 Word16 Sub_VQ(                             /* output: return quantization index     */
    444         Word16 * x,                           /* input : ISF residual vector           */
    445         Word16 * dico,                        /* input : quantization codebook         */
    446         Word16 dim,                           /* input : dimention of vector           */
    447         Word16 dico_size,                     /* input : size of quantization codebook */
    448         Word32 * distance                     /* output: error of quantization         */
    449          )
    450 {
    451     Word16 temp, *p_dico;
    452     Word32 i, j, index;
    453     Word32 dist_min, dist;
    454 
    455     dist_min = MAX_32;
    456     p_dico = dico;
    457 
    458     index = 0;
    459     for (i = 0; i < dico_size; i++)
    460     {
    461         dist = 0;
    462 
    463         for (j = 0; j < dim; j++)
    464         {
    465             temp = x[j] - (*p_dico++);
    466             dist += (temp * temp)<<1;
    467         }
    468 
    469         if(dist < dist_min)
    470         {
    471             dist_min = dist;
    472             index = i;
    473         }
    474     }
    475 
    476     *distance = dist_min;
    477 
    478     /* Reading the selected vector */
    479     p_dico = &dico[index * dim];
    480     for (j = 0; j < dim; j++)
    481     {
    482         x[j] = *p_dico++;
    483     }
    484 
    485     return index;
    486 }
    487 
    488 
    489 static void VQ_stage1(
    490         Word16 * x,                           /* input : ISF residual vector           */
    491         Word16 * dico,                        /* input : quantization codebook         */
    492         Word16 dim,                           /* input : dimention of vector           */
    493         Word16 dico_size,                     /* input : size of quantization codebook */
    494         Word16 * index,                       /* output: indices of survivors          */
    495         Word16 surv                           /* input : number of survivor            */
    496         )
    497 {
    498     Word16 temp, *p_dico;
    499     Word32 i, j, k, l;
    500     Word32 dist_min[N_SURV_MAX], dist;
    501 
    502     dist_min[0] = MAX_32;
    503     dist_min[1] = MAX_32;
    504     dist_min[2] = MAX_32;
    505     dist_min[3] = MAX_32;
    506     index[0] = 0;
    507     index[1] = 1;
    508     index[2] = 2;
    509     index[3] = 3;
    510 
    511     p_dico = dico;
    512 
    513     for (i = 0; i < dico_size; i++)
    514     {
    515         dist = 0;
    516         for (j = 0; j < dim; j++)
    517         {
    518             temp = x[j] -  (*p_dico++);
    519             dist += (temp * temp)<<1;
    520         }
    521 
    522         for (k = 0; k < surv; k++)
    523         {
    524             if(dist < dist_min[k])
    525             {
    526                 for (l = surv - 1; l > k; l--)
    527                 {
    528                     dist_min[l] = dist_min[l - 1];
    529                     index[l] = index[l - 1];
    530                 }
    531                 dist_min[k] = dist;
    532                 index[k] = i;
    533                 break;
    534             }
    535         }
    536     }
    537     return;
    538 }
    539 
    540 
    541 
    542 
    543