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/enc_lag6.c
     35  Functions:
     36 
     37      Date: 02/05/2002
     38 
     39 ------------------------------------------------------------------------------
     40  REVISION HISTORY
     41 
     42  Description: Updated template used to PV coding template.
     43  Changed to accept the pOverflow flag for EPOC compatibility.
     44 
     45  Description:
     46  (1) Removed optimization -- mult(i, 6, pOverflow) is NOT the same as adding
     47      i to itself 6 times.  The reason is because the mult function does a
     48      right shift by 15, which will obliterate smaller numbers.
     49 
     50  Description:  Replaced "int" and/or "char" with OSCL defined types.
     51 
     52  Description:
     53 
     54 ------------------------------------------------------------------------------
     55  MODULE DESCRIPTION
     56 
     57 
     58 ------------------------------------------------------------------------------
     59 */
     60 
     61 /*----------------------------------------------------------------------------
     62 ; INCLUDES
     63 ----------------------------------------------------------------------------*/
     64 #include "enc_lag6.h"
     65 #include "typedef.h"
     66 #include "basic_op.h"
     67 
     68 /*----------------------------------------------------------------------------
     69 ; MACROS
     70 ; Define module specific macros here
     71 ----------------------------------------------------------------------------*/
     72 
     73 /*----------------------------------------------------------------------------
     74 ; DEFINES
     75 ; Include all pre-processor statements here. Include conditional
     76 ; compile variables also.
     77 ----------------------------------------------------------------------------*/
     78 
     79 /*----------------------------------------------------------------------------
     80 ; LOCAL FUNCTION DEFINITIONS
     81 ; Function Prototype declaration
     82 ----------------------------------------------------------------------------*/
     83 
     84 /*----------------------------------------------------------------------------
     85 ; LOCAL VARIABLE DEFINITIONS
     86 ; Variable declaration - defined here and used outside this module
     87 ----------------------------------------------------------------------------*/
     88 
     89 
     90 /*
     91 ------------------------------------------------------------------------------
     92  FUNCTION NAME: Enc_lag6
     93 ------------------------------------------------------------------------------
     94  INPUT AND OUTPUT DEFINITIONS
     95 
     96  Inputs:
     97     T0 -- Word16 -- Pitch delay
     98     T0_frac -- Word16 -- Fractional pitch delay
     99     T0_min -- Word16 -- minimum of search range
    100     delta_flag -- Word16 -- Flag for 1st (or 3rd) subframe
    101 
    102  Outputs:
    103     pOverflow -- Pointer to Flag -- overflow indicator
    104 
    105  Returns:
    106     Word16 -- Return index of encoding
    107 
    108  Global Variables Used:
    109     None
    110 
    111  Local Variables Needed:
    112     None
    113 
    114 ------------------------------------------------------------------------------
    115  FUNCTION DESCRIPTION
    116 
    117  PURPOSE:  Encoding of fractional pitch lag with 1/6 resolution.
    118 
    119  DESCRIPTION:
    120                   First and third subframes:
    121                   --------------------------
    122  The pitch range is divided as follows:
    123          17 3/6  to   94 3/6   resolution 1/6
    124          95      to   143      resolution 1
    125 
    126  The period is encoded with 9 bits.
    127  For the range with fractions:
    128    index = (T-17)*6 + frac - 3;
    129                        where T=[17..94] and frac=[-2,-1,0,1,2,3]
    130  and for the integer only range
    131    index = (T - 95) + 463;        where T=[95..143]
    132 
    133                   Second and fourth subframes:
    134                   ----------------------------
    135  For the 2nd and 4th subframes a resolution of 1/6 is always used,
    136  and the search range is relative to the lag in previous subframe.
    137  If t0 is the lag in the previous subframe then
    138  t_min=t0-5   and  t_max=t0+4   and  the range is given by
    139      (t_min-1) 3/6   to  (t_max) 3/6
    140 
    141  The period in the 2nd (and 4th) subframe is encoded with 6 bits:
    142    index = (T-(t_min-1))*6 + frac - 3;
    143                where T=[t_min-1..t_max] and frac=[-2,-1,0,1,2,3]
    144 
    145  Note that only 61 values are used. If the decoder receives 61, 62,
    146  or 63 as the relative pitch index, it means that a transmission
    147  error occurred and the pitch from previous subframe should be used.
    148 
    149 ------------------------------------------------------------------------------
    150  REQUIREMENTS
    151 
    152  None
    153 
    154 ------------------------------------------------------------------------------
    155  REFERENCES
    156 
    157  enc_lag6.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
    158 
    159 ------------------------------------------------------------------------------
    160  PSEUDO-CODE
    161 
    162 
    163 ------------------------------------------------------------------------------
    164  RESOURCES USED [optional]
    165 
    166  When the code is written for a specific target processor the
    167  the resources used should be documented below.
    168 
    169  HEAP MEMORY USED: x bytes
    170 
    171  STACK MEMORY USED: x bytes
    172 
    173  CLOCK CYCLES: (cycle count equation for this function) + (variable
    174                 used to represent cycle count for each subroutine
    175                 called)
    176      where: (cycle count variable) = cycle count for [subroutine
    177                                      name]
    178 
    179 ------------------------------------------------------------------------------
    180  CAUTION [optional]
    181  [State any special notes, constraints or cautions for users of this function]
    182 
    183 ------------------------------------------------------------------------------
    184 */
    185 
    186 Word16 Enc_lag6(         /* o : Return index of encoding             */
    187     Word16 T0,           /* i : Pitch delay                          */
    188     Word16 T0_frac,      /* i : Fractional pitch delay               */
    189     Word16 T0_min,       /* i : minimum of search range              */
    190     Word16 delta_flag,   /* i : Flag for 1st (or 3rd) subframe       */
    191     Flag   *pOverflow    /* o : overflow indicator                   */
    192 )
    193 {
    194     Word16 index;
    195     Word16 i;
    196     Word16 temp;
    197 
    198     if (delta_flag == 0)          /* if 1st or 3rd subframe */
    199     {
    200         /* encode pitch delay (with fraction) */
    201         if (T0 <= 94)
    202         {
    203             /* index = T0*6 - 105 + T0_frac */
    204             i = 6 * T0 - 105;
    205 
    206             index = add(i, T0_frac, pOverflow);
    207         }
    208         else
    209         {
    210             index = add(T0, 368, pOverflow);
    211         }
    212 
    213     }
    214     else
    215         /* if second or fourth subframe */
    216     {
    217         /* index = 6*(T0-T0_min) + 3 + T0_frac  */
    218         temp = sub(T0, T0_min, pOverflow);
    219 
    220         i = add(temp, temp, pOverflow);
    221         i = add(temp, i, pOverflow);
    222         i = add(i, i, pOverflow);
    223 
    224         i = add(i, 3, pOverflow);
    225 
    226         index = add(i, T0_frac, pOverflow);
    227     }
    228 
    229     return index;
    230 }
    231