Home | History | Annotate | Download | only in src
      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.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)
     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  Pathname: ./audio/gsm-amr/c/src/d_plsf_3.c
     35  Functions: D_plsf_3
     36 
     37  ------------------------------------------------------------------------------
     38  INPUT AND OUTPUT DEFINITIONS
     39 
     40  Inputs:
     41     st -- Pointer to type struct D_plsfState
     42     mode -- enum Mode -- coder mode
     43     bfi -- Word16 -- bad frame indicator (set to 1 if a bad frame is received)
     44     indice -- Pointer to type Word16 -- quantization indices of
     45                                         3 submatrices, Q0
     46 
     47  Outputs:
     48     st -- Pointer to type struct D_plsfState
     49     lsp1_q -- Pointer to type Word16 -- quantized 1st LSP vector Q15
     50     pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
     51 
     52  Returns:
     53     None.
     54 
     55  Global Variables Used:
     56     None
     57 
     58  Local Variables Needed:
     59     None
     60 
     61 ------------------------------------------------------------------------------
     62  FUNCTION DESCRIPTION
     63 
     64  PURPOSE: Decodes the LSP parameters using the received quantization
     65           indices.1st order MA prediction and split by 3 vector
     66           quantization (split-VQ)
     67 
     68 ------------------------------------------------------------------------------
     69  REQUIREMENTS
     70 
     71 
     72 
     73 ------------------------------------------------------------------------------
     74  REFERENCES
     75 
     76  d_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
     77 
     78 ------------------------------------------------------------------------------
     79  PSEUDO-CODE
     80 
     81 
     82 
     83 ------------------------------------------------------------------------------
     84  RESOURCES USED
     85    When the code is written for a specific target processor the
     86      the resources used should be documented below.
     87 
     88  STACK USAGE: [stack count for this module] + [variable to represent
     89           stack usage for each subroutine called]
     90 
     91      where: [stack usage variable] = stack usage for [subroutine
     92          name] (see [filename].ext)
     93 
     94  DATA MEMORY USED: x words
     95 
     96  PROGRAM MEMORY USED: x words
     97 
     98  CLOCK CYCLES: [cycle count equation for this module] + [variable
     99            used to represent cycle count for each subroutine
    100            called]
    101 
    102      where: [cycle count variable] = cycle count for [subroutine
    103         name] (see [filename].ext)
    104 
    105 ------------------------------------------------------------------------------
    106 */
    107 
    108 
    109 /*----------------------------------------------------------------------------
    110 ; INCLUDES
    111 ----------------------------------------------------------------------------*/
    112 #include "d_plsf.h"
    113 #include "typedef.h"
    114 #include "basic_op.h"
    115 #include "lsp_lsf.h"
    116 #include "reorder.h"
    117 #include "copy.h"
    118 #include "q_plsf_3_tbl.h"
    119 
    120 
    121 /*----------------------------------------------------------------------------
    122 ; MACROS
    123 ; Define module specific macros here
    124 ----------------------------------------------------------------------------*/
    125 
    126 
    127 /*----------------------------------------------------------------------------
    128 ; DEFINES
    129 ; Include all pre-processor statements here. Include conditional
    130 ; compile variables also.
    131 ----------------------------------------------------------------------------*/
    132 #define ALPHA     29491     /* ALPHA    ->  0.9                            */
    133 #define ONE_ALPHA 3277      /* ONE_ALPHA-> (1.0-ALPHA)                     */
    134 
    135 
    136 /*----------------------------------------------------------------------------
    137 ; LOCAL FUNCTION DEFINITIONS
    138 ; Function Prototype declaration
    139 ----------------------------------------------------------------------------*/
    140 
    141 
    142 /*----------------------------------------------------------------------------
    143 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    144 ; Variable declaration - defined here and used outside this module
    145 ----------------------------------------------------------------------------*/
    146 
    147 /*----------------------------------------------------------------------------
    148 ; EXTERNAL FUNCTION REFERENCES
    149 ; Declare functions defined elsewhere and referenced in this module
    150 ----------------------------------------------------------------------------*/
    151 
    152 /*----------------------------------------------------------------------------
    153 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    154 ; Declare variables used in this module but defined elsewhere
    155 ----------------------------------------------------------------------------*/
    156 
    157 
    158 /*----------------------------------------------------------------------------
    159 ; FUNCTION CODE
    160 ----------------------------------------------------------------------------*/
    161 
    162 void D_plsf_3(
    163     D_plsfState *st,   /* i/o: State struct                               */
    164     enum Mode mode,    /* i  : coder mode                                 */
    165     Word16 bfi,        /* i  : bad frame indicator (set to 1 if a         */
    166     /*      bad frame is received)                     */
    167     Word16 * indice,   /* i  : quantization indices of 3 submatrices, Q0  */
    168     Word16 * lsp1_q,   /* o  : quantized 1st LSP vector,              Q15 */
    169     Flag  *pOverflow   /* o : Flag set when overflow occurs               */
    170 )
    171 {
    172     Word16 i;
    173     Word16 temp;
    174     Word16 index;
    175 
    176     Word16 lsf1_r[M];
    177     Word16 lsf1_q[M];
    178 
    179     if (bfi != 0)   /* if bad frame */
    180     {
    181         /* use the past LSFs slightly shifted towards their mean */
    182 
    183         for (i = 0; i < M; i++)
    184         {
    185             /* lsfi_q[i] = ALPHA*past_lsf_q[i] + ONE_ALPHA*mean_lsf[i]; */
    186             temp =
    187                 mult(
    188                     st->past_lsf_q[i],
    189                     ALPHA,
    190                     pOverflow);
    191 
    192             index =
    193                 mult(
    194                     mean_lsf_3[i],
    195                     ONE_ALPHA,
    196                     pOverflow);
    197 
    198             lsf1_q[i] =
    199                 add(
    200                     index,
    201                     temp,
    202                     pOverflow);
    203         }
    204 
    205         /* estimate past quantized residual to be used in next frame */
    206         if (mode != MRDTX)
    207         {
    208             for (i = 0; i < M; i++)
    209             {
    210                 /* temp  = mean_lsf[i] +  past_r2_q[i] * PRED_FAC; */
    211 
    212                 temp =
    213                     mult(
    214                         st->past_r_q[i],
    215                         pred_fac_3[i],
    216                         pOverflow);
    217 
    218                 temp =
    219                     add(
    220                         mean_lsf_3[i],
    221                         temp,
    222                         pOverflow);
    223 
    224                 st->past_r_q[i] =
    225                     sub(
    226                         lsf1_q[i],
    227                         temp,
    228                         pOverflow);
    229             }
    230 
    231         } /* if (mode == MRDTX) */
    232         else
    233         {
    234             for (i = 0; i < M; i++)
    235             {
    236                 /* temp  = mean_lsf[i] +  past_r2_q[i]; */
    237 
    238                 temp =
    239                     add(
    240                         mean_lsf_3[i],
    241                         st->past_r_q[i],
    242                         pOverflow);
    243 
    244                 st->past_r_q[i] =
    245                     sub(
    246                         lsf1_q[i],
    247                         temp,
    248                         pOverflow);
    249             }
    250         }
    251 
    252     } /* if (bfi != 0) */
    253 
    254     else  /* if good LSFs received */
    255     {
    256 
    257         Word16 index_limit_1 = 0;
    258         Word16 index_limit_2 = (DICO2_SIZE - 1) * 3;
    259         Word16 index_limit_3 = 0;
    260 
    261         const Word16 *p_cb1;
    262         const Word16 *p_cb2;
    263         const Word16 *p_cb3;
    264         const Word16 *p_dico;
    265 
    266 
    267         p_cb2 = dico2_lsf_3;    /* size DICO2_SIZE*3 */
    268 
    269         if ((mode == MR475) || (mode == MR515))
    270         {   /* MR475, MR515 */
    271             p_cb1 = dico1_lsf_3;    /* size DICO1_SIZE*3 */
    272             p_cb3 = mr515_3_lsf;    /* size MR515_3_SIZE*4 */
    273 
    274             index_limit_1 = (DICO1_SIZE - 1) * 3;
    275             index_limit_3 = (MR515_3_SIZE - 1) * 4;
    276 
    277         }
    278         else if (mode == MR795)
    279         {   /* MR795 */
    280             p_cb1 = mr795_1_lsf;    /* size MR795_1_SIZE*3 */
    281             p_cb3 = dico3_lsf_3;    /* size DICO3_SIZE*4 */
    282 
    283             index_limit_1 = (MR795_1_SIZE - 1) * 3;
    284             index_limit_3 = (DICO3_SIZE - 1) * 4;
    285 
    286         }
    287         else
    288         {   /* MR59, MR67, MR74, MR102, MRDTX */
    289             p_cb1 = dico1_lsf_3;    /* size DICO1_SIZE*3 */
    290             p_cb3 = dico3_lsf_3;    /* size DICO3_SIZE*4 */
    291 
    292             index_limit_1 = (DICO1_SIZE - 1) * 3;
    293             index_limit_3 = (DICO3_SIZE - 1) * 4;
    294 
    295         }
    296 
    297         /* decode prediction residuals from 3 received indices */
    298 
    299         index = *indice++;
    300 
    301         /* temp = 3*index; */
    302         temp = index + (index << 1);
    303 
    304         if (temp > index_limit_1)
    305         {
    306             temp = index_limit_1;  /* avoid buffer overrun */
    307         }
    308 
    309         p_dico = &p_cb1[temp];
    310 
    311         lsf1_r[0] = *p_dico++;
    312         lsf1_r[1] = *p_dico++;
    313         lsf1_r[2] = *p_dico++;
    314 
    315         index = *indice++;
    316 
    317         if (mode == MR475 || mode == MR515)
    318         {   /* MR475, MR515 only using every second entry */
    319             index <<= 1;
    320         }
    321 
    322         /* temp = 3*index */
    323         temp = index + (index << 1);
    324 
    325         if (temp > index_limit_2)
    326         {
    327             temp = index_limit_2;  /* avoid buffer overrun */
    328         }
    329 
    330         p_dico = &p_cb2[temp];
    331 
    332         lsf1_r[3] = *p_dico++;
    333         lsf1_r[4] = *p_dico++;
    334         lsf1_r[5] = *p_dico++;
    335 
    336         index = *indice++;
    337 
    338         temp = index << 2;
    339 
    340         if (temp > index_limit_3)
    341         {
    342             temp = index_limit_3;  /* avoid buffer overrun */
    343         }
    344 
    345 
    346         p_dico = &p_cb3[temp];
    347 
    348         lsf1_r[6] = *p_dico++;
    349         lsf1_r[7] = *p_dico++;
    350         lsf1_r[8] = *p_dico++;
    351         lsf1_r[9] = *p_dico++;
    352 
    353         /* Compute quantized LSFs and update the past quantized residual */
    354 
    355         if (mode != MRDTX)
    356         {
    357             for (i = 0; i < M; i++)
    358             {
    359                 temp =
    360                     mult(
    361                         st->past_r_q[i],
    362                         pred_fac_3[i],
    363                         pOverflow);
    364 
    365                 temp =
    366                     add(
    367                         mean_lsf_3[i],
    368                         temp,
    369                         pOverflow);
    370 
    371                 lsf1_q[i] =
    372                     add(
    373                         lsf1_r[i],
    374                         temp,
    375                         pOverflow);
    376 
    377                 st->past_r_q[i] = lsf1_r[i];
    378             }
    379         }
    380         else
    381         {
    382             for (i = 0; i < M; i++)
    383             {
    384                 temp =
    385                     add(
    386                         mean_lsf_3[i],
    387                         st->past_r_q[i],
    388                         pOverflow);
    389 
    390                 lsf1_q[i] =
    391                     add(
    392                         lsf1_r[i],
    393                         temp,
    394                         pOverflow);
    395 
    396                 st->past_r_q[i] = lsf1_r[i];
    397             }
    398         }
    399 
    400     }
    401 
    402     /* verification that LSFs has minimum distance of LSF_GAP Hz */
    403 
    404     Reorder_lsf(
    405         lsf1_q,
    406         LSF_GAP,
    407         M,
    408         pOverflow);
    409 
    410     Copy(
    411         lsf1_q,
    412         st->past_lsf_q,
    413         M);
    414 
    415     /*  convert LSFs to the cosine domain */
    416 
    417     Lsf_lsp(
    418         lsf1_q,
    419         lsp1_q,
    420         M,
    421         pOverflow);
    422 
    423     return;
    424 }
    425 
    426 /*
    427 ------------------------------------------------------------------------------
    428  FUNCTION NAME: Init_D_plsf_3
    429 ------------------------------------------------------------------------------
    430  INPUT AND OUTPUT DEFINITIONS
    431 
    432  Inputs:
    433     st = pointer to a structure of type D_plsfState
    434     index = Word16, past_rq_init[] index [0, 7]
    435 
    436  Outputs:
    437     st = pointer to a structure of type D_plsfState
    438 
    439  Returns:
    440     None
    441 
    442  Global Variables Used:
    443     None.
    444 
    445  Local Variables Needed:
    446     None.
    447 
    448 ------------------------------------------------------------------------------
    449  FUNCTION DESCRIPTION
    450 
    451  This function initializes the D_plsfState structure.
    452 
    453 ------------------------------------------------------------------------------
    454  REQUIREMENTS
    455 
    456  None.
    457 
    458 ------------------------------------------------------------------------------
    459  REFERENCES
    460 
    461  d_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    462 
    463 ------------------------------------------------------------------------------
    464  PSEUDO-CODE
    465 
    466 ------------------------------------------------------------------------------
    467  RESOURCES USED [optional]
    468 
    469  When the code is written for a specific target processor the
    470  the resources used should be documented below.
    471 
    472  HEAP MEMORY USED: x bytes
    473 
    474  STACK MEMORY USED: x bytes
    475 
    476  CLOCK CYCLES: (cycle count equation for this function) + (variable
    477                 used to represent cycle count for each subroutine
    478                 called)
    479      where: (cycle count variable) = cycle count for [subroutine
    480                                      name]
    481 
    482 ------------------------------------------------------------------------------
    483  CAUTION [optional]
    484  [State any special notes, constraints or cautions for users of this function]
    485 
    486 ------------------------------------------------------------------------------
    487 */
    488 void Init_D_plsf_3(
    489     D_plsfState *st,      /* i/o: State struct                */
    490     Word16       index    /* i  : past_rq_init[] index [0, 7] */)
    491 {
    492     Copy(
    493         &past_rq_init[index * M],
    494         st->past_r_q,
    495         M);
    496 }
    497