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/dec_lag6.c
     35  Functions: Dec_lag6
     36 
     37      Date: 01/31/2002
     38 
     39 ------------------------------------------------------------------------------
     40  REVISION HISTORY
     41 
     42  Description:
     43  (1) Updated to accept new parameter, Flag *pOverflow.
     44  (2) Placed file in the proper PV Software template.
     45 
     46  Description:
     47  (1) Removed "count.h" and "basic_op.h" and replaced with individual include
     48      files (add.h, sub.h, etc.)
     49 
     50  Description:
     51  (1) Removed optimization -- mult(i, 3, pOverflow) is NOT the same as adding
     52      i to itself 3 times.  The reason is because the mult function does a
     53      right shift by 15, which will obliterate smaller numbers.
     54 
     55  Description:  Replaced "int" and/or "char" with OSCL defined types.
     56 
     57  Description:
     58 
     59  ------------------------------------------------------------------------------
     60  INPUT AND OUTPUT DEFINITIONS
     61 
     62  Inputs:
     63     index   -- Word16 -- received pitch index
     64     pit_min  -- Word16 -- minimum pitch lag
     65     pit_max  -- Word16 -- maximum pitch lag
     66     i_subfr -- Word16 -- subframe flag
     67     T0 -- Pointer to type Word16 -- integer part of pitch lag
     68 
     69  Outputs:
     70 
     71     T0 -- Pointer to type Word16 -- integer part of pitch lag
     72     T0_frac -- Pointer to type Word16 -- fractional part of pitch lag
     73     pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
     74 
     75  Returns:
     76     None.
     77 
     78  Global Variables Used:
     79     None
     80 
     81  Local Variables Needed:
     82     None
     83 
     84 ------------------------------------------------------------------------------
     85  FUNCTION DESCRIPTION
     86 
     87  PURPOSE:  Decoding of fractional pitch lag with 1/6 resolution.
     88            Extract the integer and fraction parts of the pitch lag from
     89            the received adaptive codebook index.
     90 
     91   See "Enc_lag6.c" for more details about the encoding procedure.
     92 
     93   The fractional lag in 1st and 3rd subframes is encoded with 9 bits
     94   while that in 2nd and 4th subframes is relatively encoded with 6 bits.
     95   Note that in relative encoding only 61 values are used. If the
     96   decoder receives 61, 62, or 63 as the relative pitch index, it means
     97   that a transmission error occurred. In this case, the pitch lag from
     98   previous subframe (actually from previous frame) is used.
     99 
    100 ------------------------------------------------------------------------------
    101  REQUIREMENTS
    102 
    103 
    104 
    105 ------------------------------------------------------------------------------
    106  REFERENCES
    107 
    108  dec_lag6.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    109 
    110 ------------------------------------------------------------------------------
    111  PSEUDO-CODE
    112 
    113 
    114 
    115 ------------------------------------------------------------------------------
    116  RESOURCES USED
    117    When the code is written for a specific target processor the
    118      the resources used should be documented below.
    119 
    120  STACK USAGE: [stack count for this module] + [variable to represent
    121           stack usage for each subroutine called]
    122 
    123      where: [stack usage variable] = stack usage for [subroutine
    124          name] (see [filename].ext)
    125 
    126  DATA MEMORY USED: x words
    127 
    128  PROGRAM MEMORY USED: x words
    129 
    130  CLOCK CYCLES: [cycle count equation for this module] + [variable
    131            used to represent cycle count for each subroutine
    132            called]
    133 
    134      where: [cycle count variable] = cycle count for [subroutine
    135         name] (see [filename].ext)
    136 
    137 ------------------------------------------------------------------------------
    138 */
    139 
    140 
    141 /*----------------------------------------------------------------------------
    142 ; INCLUDES
    143 ----------------------------------------------------------------------------*/
    144 #include "dec_lag6.h"
    145 #include "typedef.h"
    146 #include "basic_op.h"
    147 
    148 /*----------------------------------------------------------------------------
    149 ; MACROS
    150 ; Define module specific macros here
    151 ----------------------------------------------------------------------------*/
    152 
    153 
    154 /*----------------------------------------------------------------------------
    155 ; DEFINES
    156 ; Include all pre-processor statements here. Include conditional
    157 ; compile variables also.
    158 ----------------------------------------------------------------------------*/
    159 
    160 /*----------------------------------------------------------------------------
    161 ; LOCAL FUNCTION DEFINITIONS
    162 ; Function Prototype declaration
    163 ----------------------------------------------------------------------------*/
    164 
    165 
    166 /*----------------------------------------------------------------------------
    167 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    168 ; Variable declaration - defined here and used outside this module
    169 ----------------------------------------------------------------------------*/
    170 
    171 /*----------------------------------------------------------------------------
    172 ; EXTERNAL FUNCTION REFERENCES
    173 ; Declare functions defined elsewhere and referenced in this module
    174 ----------------------------------------------------------------------------*/
    175 
    176 /*----------------------------------------------------------------------------
    177 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    178 ; Declare variables used in this module but defined elsewhere
    179 ----------------------------------------------------------------------------*/
    180 
    181 /*----------------------------------------------------------------------------
    182 ; FUNCTION CODE
    183 ----------------------------------------------------------------------------*/
    184 
    185 void Dec_lag6(
    186     Word16 index,      /* input : received pitch index           */
    187     Word16 pit_min,    /* input : minimum pitch lag              */
    188     Word16 pit_max,    /* input : maximum pitch lag              */
    189     Word16 i_subfr,    /* input : subframe flag                  */
    190     Word16 *T0,        /* in/out: integer part of pitch lag      */
    191     Word16 *T0_frac,   /* output: fractional part of pitch lag   */
    192     Flag   *pOverflow  /* o : Flag set when overflow occurs      */
    193 )
    194 {
    195     Word16 i;
    196     Word16 T0_min;
    197     Word16 T0_max;
    198     Word16 k;
    199     Word16 w;
    200 
    201     if (i_subfr == 0)          /* if 1st or 3rd subframe */
    202     {
    203         if (index < 463)
    204         {
    205             /* T0 = (index+5)/6 + 17 */
    206             i = index + 5;
    207             i =
    208                 mult(
    209                     i,
    210                     5462,
    211                     pOverflow);
    212 
    213             i =
    214                 add(
    215                     i,
    216                     17,
    217                     pOverflow);
    218 
    219             *T0 = i;
    220 
    221             /* i = 3* (*T0) */
    222 
    223             i = add(i, i, pOverflow);
    224             i = add(i, *T0, pOverflow);
    225 
    226             /* *T0_frac = index - T0*6 + 105 */
    227 
    228             i =
    229                 add(
    230                     i,
    231                     i,
    232                     pOverflow);
    233 
    234             i =
    235                 sub(
    236                     index,
    237                     i,
    238                     pOverflow);
    239 
    240             *T0_frac =
    241                 add(
    242                     i,
    243                     105,
    244                     pOverflow);
    245         }
    246         else
    247         {
    248             *T0 =
    249                 sub(
    250                     index,
    251                     368,
    252                     pOverflow);
    253 
    254             *T0_frac = 0;
    255         }
    256     }
    257     else       /* second or fourth subframe */
    258     {
    259         /* find T0_min and T0_max for 2nd (or 4th) subframe */
    260 
    261         T0_min =
    262             sub(
    263                 *T0,
    264                 5,
    265                 pOverflow);
    266 
    267         if (T0_min < pit_min)
    268         {
    269             T0_min = pit_min;
    270         }
    271 
    272         T0_max =
    273             add(
    274                 T0_min,
    275                 9,
    276                 pOverflow);
    277 
    278         if (T0_max > pit_max)
    279         {
    280             T0_max = pit_max;
    281 
    282             T0_min =
    283                 sub(
    284                     T0_max,
    285                     9,
    286                     pOverflow);
    287         }
    288 
    289         /* i = (index+5)/6 - 1 */
    290         i =
    291             add(
    292                 index,
    293                 5,
    294                 pOverflow);
    295 
    296         i =
    297             mult(
    298                 i,
    299                 5462,
    300                 pOverflow);
    301 
    302         i =
    303             sub(
    304                 i,
    305                 1,
    306                 pOverflow);
    307 
    308         *T0 =
    309             add(
    310                 i,
    311                 T0_min,
    312                 pOverflow);
    313 
    314         /* i = 3* (*T0) */
    315 
    316         w = add(i, i, pOverflow);
    317         i = add(i, w, pOverflow);
    318 
    319         i =
    320             add(
    321                 i,
    322                 i,
    323                 pOverflow);
    324 
    325         k =
    326             sub(
    327                 index,
    328                 3,
    329                 pOverflow);
    330 
    331         *T0_frac =
    332             sub(
    333                 k,
    334                 i,
    335                 pOverflow);
    336     }
    337 }
    338