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  Pathname: ./audio/gsm-amr/c/src/lsfwt.c
     31  Functions: Lsf_wt
     32 
     33 ------------------------------------------------------------------------------
     34  REVISION HISTORY
     35 
     36  Description: Updated to accept new parameter, Flag *pOverflow.  Placed
     37  file in the proper PV Software template.
     38 
     39  Description:
     40               1. Eliminated unused include files.
     41               2. Replaced array addressing by pointers
     42               3. Eliminated math operations that unnecessary checked for
     43                  saturation, by evaluating the operands
     44               4. Unrolled loops to speed up processing, use decrement loops
     45 
     46  Description:  Replaced "int" and/or "char" with OSCL defined types.
     47 
     48  Who:                       Date:
     49  Description:
     50 
     51  ------------------------------------------------------------------------------
     52  INPUT AND OUTPUT DEFINITIONS
     53 
     54  Inputs:
     55     lsf -- Pointer to Word16 -- LSF vector
     56 
     57  Outputs:
     58     wf -- Pointer to Word16 -- square of weighting factors
     59     pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
     60 
     61  Returns:
     62     None
     63 
     64  Global Variables Used:
     65     None
     66 
     67  Local Variables Needed:
     68     None
     69 
     70 ------------------------------------------------------------------------------
     71  FUNCTION DESCRIPTION
     72 
     73 Compute LSF weighting factors
     74 
     75  d[i] = lsf[i+1] - lsf[i-1]
     76 
     77  The weighting factors are approximated by two line segment
     78 
     79  First segment passes by the following 2 points:
     80 
     81     d[i] = 0Hz     wf[i] = 3.347
     82     d[i] = 450Hz   wf[i] = 1.8
     83 
     84  Second segment passes by the following 2 points:
     85 
     86     d[i] = 450Hz   wf[i] = 1.8
     87     d[i] = 1500Hz  wf[i] = 1.0
     88 
     89  if( d[i] < 450Hz )
     90    wf[i] = 3.347 - ( (3.347-1.8) / (450-0)) *  d[i]
     91  else
     92    wf[i] = 1.8 - ( (1.8-1.0) / (1500-450)) *  (d[i] - 450)
     93 
     94 
     95  if( d[i] < 1843)
     96    wf[i] = 3427 - (28160*d[i])>>15
     97  else
     98    wf[i] = 1843 - (6242*(d[i]-1843))>>15
     99 
    100 ------------------------------------------------------------------------------
    101  REQUIREMENTS
    102 
    103 
    104 
    105 ------------------------------------------------------------------------------
    106  REFERENCES
    107 
    108  lsfwt.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 "lsfwt.h"
    145 #include "cnst.h"
    146 
    147 /*----------------------------------------------------------------------------
    148 ; MACROS
    149 ; Define module specific macros here
    150 ----------------------------------------------------------------------------*/
    151 
    152 
    153 /*----------------------------------------------------------------------------
    154 ; DEFINES
    155 ; Include all pre-processor statements here. Include conditional
    156 ; compile variables also.
    157 ----------------------------------------------------------------------------*/
    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 /*----------------------------------------------------------------------------
    183 ; FUNCTION CODE
    184 ----------------------------------------------------------------------------*/
    185 
    186 void Lsf_wt(
    187     Word16 *lsf,         /* input : LSF vector                  */
    188     Word16 *wf,          /* output: square of weighting factors */
    189     Flag   *pOverflow
    190 )
    191 {
    192     Word16 temp;
    193     Word16 wgt_fct;
    194     Word16 i;
    195     Word16 *p_wf = wf;
    196     Word16 *p_lsf   = &lsf[0];
    197     Word16 *p_lsf_2 = &lsf[1];
    198 
    199     OSCL_UNUSED_ARG(pOverflow);
    200 
    201     /* wf[0] = lsf[1] - 0  */
    202     *(p_wf++) = *(p_lsf_2++);
    203 
    204     for (i = 4; i != 0 ; i--)
    205     {
    206         *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
    207         *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
    208     }
    209     /*
    210      *  wf[9] = 4000 - lsf[8]
    211      */
    212     *(p_wf) = 16384 - *(p_lsf);
    213 
    214     p_wf = wf;
    215 
    216     for (i = 10; i != 0; i--)
    217     {
    218         /*
    219          *  (wf[i] - 450);
    220          *  1843 == 450 Hz (Q15 considering 7FFF = 8000 Hz)
    221          */
    222         wgt_fct = *p_wf;
    223         temp =  wgt_fct - 1843;
    224 
    225         if (temp > 0)
    226         {
    227             temp = (Word16)(((Word32)temp * 6242) >> 15);
    228             wgt_fct = 1843 - temp;
    229         }
    230         else
    231         {
    232             temp = (Word16)(((Word32)wgt_fct * 28160) >> 15);
    233             wgt_fct = 3427 - temp;
    234         }
    235 
    236         *(p_wf++) = wgt_fct << 3;
    237 
    238     } /* for (i = 10; i != 0; i--) */
    239 
    240     return;
    241 
    242 } /* Lsf_wt() */
    243