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.173
     22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2007, 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  Filename: isf_extrapolation.cpp
     35 
     36      Date: 05/08/2007
     37 
     38 ------------------------------------------------------------------------------
     39  REVISION HISTORY
     40 
     41 
     42  Description:
     43 
     44 ------------------------------------------------------------------------------
     45  INPUT AND OUTPUT DEFINITIONS
     46 
     47     int16 HfIsf[]    (i/o)  isf vector
     48 
     49 ------------------------------------------------------------------------------
     50  FUNCTION DESCRIPTION
     51 
     52     Conversion of 16th-order 12.8kHz ISF vector
     53     into 20th-order 16kHz ISF vector
     54 
     55 ------------------------------------------------------------------------------
     56  REQUIREMENTS
     57 
     58 
     59 ------------------------------------------------------------------------------
     60  REFERENCES
     61 
     62 ------------------------------------------------------------------------------
     63  PSEUDO-CODE
     64 
     65 ------------------------------------------------------------------------------
     66 */
     67 
     68 
     69 /*----------------------------------------------------------------------------
     70 ; INCLUDES
     71 ----------------------------------------------------------------------------*/
     72 
     73 #include "pv_amr_wb_type_defs.h"
     74 #include "pvamrwbdecoder_basic_op.h"
     75 #include "pvamrwbdecoder_cnst.h"
     76 #include "pvamrwbdecoder_acelp.h"
     77 #include "pvamrwb_math_op.h"
     78 
     79 /*----------------------------------------------------------------------------
     80 ; MACROS
     81 ; Define module specific macros here
     82 ----------------------------------------------------------------------------*/
     83 
     84 
     85 /*----------------------------------------------------------------------------
     86 ; DEFINES
     87 ; Include all pre-processor statements here. Include conditional
     88 ; compile variables also.
     89 ----------------------------------------------------------------------------*/
     90 #define INV_LENGTH 2731                    /* 1/12 */
     91 
     92 /*----------------------------------------------------------------------------
     93 ; LOCAL FUNCTION DEFINITIONS
     94 ; Function Prototype declaration
     95 ----------------------------------------------------------------------------*/
     96 
     97 /*----------------------------------------------------------------------------
     98 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
     99 ; Variable declaration - defined here and used outside this module
    100 ----------------------------------------------------------------------------*/
    101 
    102 /*----------------------------------------------------------------------------
    103 ; EXTERNAL FUNCTION REFERENCES
    104 ; Declare functions defined elsewhere and referenced in this module
    105 ----------------------------------------------------------------------------*/
    106 
    107 /*----------------------------------------------------------------------------
    108 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    109 ; Declare variables used in this module but defined elsewhere
    110 ----------------------------------------------------------------------------*/
    111 
    112 /*----------------------------------------------------------------------------
    113 ; FUNCTION CODE
    114 ----------------------------------------------------------------------------*/
    115 
    116 
    117 void isf_extrapolation(int16 HfIsf[])
    118 {
    119     int16 IsfDiff[M - 2];
    120     int32 IsfCorr[3];
    121     int32 L_tmp;
    122     int16 coeff, mean, tmp, tmp2, tmp3;
    123     int16 exp, exp2, hi, lo;
    124     int16 i, MaxCorr;
    125 
    126     HfIsf[M16k - 1] = HfIsf[M - 1];
    127 
    128     /* Difference vector */
    129     for (i = 1; i < (M - 1); i++)
    130     {
    131         IsfDiff[i - 1] = sub_int16(HfIsf[i], HfIsf[i - 1]);
    132     }
    133     L_tmp = 0;
    134 
    135     /* Mean of difference vector */
    136     for (i = 3; i < (M - 1); i++)
    137     {
    138         L_tmp = mac_16by16_to_int32(L_tmp, IsfDiff[i - 1], INV_LENGTH);
    139 
    140     }
    141     mean = amr_wb_round(L_tmp);
    142 
    143     IsfCorr[0] = 0;
    144 
    145     tmp = 0;
    146     for (i = 0; i < (M - 2); i++)
    147     {
    148         if (IsfDiff[i] > tmp)
    149         {
    150             tmp = IsfDiff[i];
    151         }
    152     }
    153     exp = norm_s(tmp);
    154     for (i = 0; i < (M - 2); i++)
    155     {
    156         IsfDiff[i] = shl_int16(IsfDiff[i], exp);
    157     }
    158     mean = shl_int16(mean, exp);
    159     for (i = 7; i < (M - 2); i++)
    160     {
    161         tmp2 = sub_int16(IsfDiff[i], mean);
    162         tmp3 = sub_int16(IsfDiff[i - 2], mean);
    163         L_tmp = mul_16by16_to_int32(tmp2, tmp3);
    164         int32_to_dpf(L_tmp, &hi, &lo);
    165         L_tmp = mpy_dpf_32(hi, lo, hi, lo);
    166         IsfCorr[0] = add_int32(IsfCorr[0], L_tmp);
    167     }
    168     IsfCorr[1] = 0;
    169     for (i = 7; i < (M - 2); i++)
    170     {
    171         tmp2 = sub_int16(IsfDiff[i], mean);
    172         tmp3 = sub_int16(IsfDiff[i - 3], mean);
    173         L_tmp = mul_16by16_to_int32(tmp2, tmp3);
    174         int32_to_dpf(L_tmp, &hi, &lo);
    175         L_tmp = mpy_dpf_32(hi, lo, hi, lo);
    176         IsfCorr[1] = add_int32(IsfCorr[1], L_tmp);
    177     }
    178     IsfCorr[2] = 0;
    179     for (i = 7; i < (M - 2); i++)
    180     {
    181         tmp2 = sub_int16(IsfDiff[i], mean);
    182         tmp3 = sub_int16(IsfDiff[i - 4], mean);
    183         L_tmp = mul_16by16_to_int32(tmp2, tmp3);
    184         int32_to_dpf(L_tmp, &hi, &lo);
    185         L_tmp = mpy_dpf_32(hi, lo, hi, lo);
    186         IsfCorr[2] = add_int32(IsfCorr[2], L_tmp);
    187     }
    188 
    189     if (IsfCorr[0] > IsfCorr[1])
    190     {
    191         MaxCorr = 0;
    192     }
    193     else
    194     {
    195         MaxCorr = 1;
    196     }
    197 
    198 
    199     if (IsfCorr[2] > IsfCorr[MaxCorr])
    200     {
    201         MaxCorr = 2;
    202     }
    203 
    204     MaxCorr++;             /* Maximum correlation of difference vector */
    205 
    206     for (i = M - 1; i < (M16k - 1); i++)
    207     {
    208         tmp = sub_int16(HfIsf[i - 1 - MaxCorr], HfIsf[i - 2 - MaxCorr]);
    209         HfIsf[i] = add_int16(HfIsf[i - 1], tmp);
    210     }
    211 
    212     /* tmp=7965+(HfIsf[2]-HfIsf[3]-HfIsf[4])/6; */
    213     tmp = add_int16(HfIsf[4], HfIsf[3]);
    214     tmp = sub_int16(HfIsf[2], tmp);
    215     tmp = mult_int16(tmp, 5461);
    216     tmp += 20390;
    217 
    218 
    219     if (tmp > 19456)
    220     {                                      /* Maximum value of ISF should be at most 7600 Hz */
    221         tmp = 19456;
    222     }
    223     tmp = sub_int16(tmp, HfIsf[M - 2]);
    224     tmp2 = sub_int16(HfIsf[M16k - 2], HfIsf[M - 2]);
    225 
    226     exp2 = norm_s(tmp2);
    227     exp = norm_s(tmp);
    228     exp--;
    229     tmp <<= exp;
    230     tmp2 <<= exp2;
    231     coeff = div_16by16(tmp, tmp2);              /* Coefficient for stretching the ISF vector */
    232     exp = exp2 - exp;
    233 
    234     for (i = M - 1; i < (M16k - 1); i++)
    235     {
    236         tmp = mult_int16(sub_int16(HfIsf[i], HfIsf[i - 1]), coeff);
    237         IsfDiff[i - (M - 1)] = shl_int16(tmp, exp);
    238     }
    239 
    240     for (i = M; i < (M16k - 1); i++)
    241     {
    242         /* The difference between ISF(n) and ISF(n-2) should be at least 500 Hz */
    243         tmp = IsfDiff[i - (M - 1)] + IsfDiff[i - M] - 1280;
    244 
    245         if (tmp < 0)
    246         {
    247 
    248             if (IsfDiff[i - (M - 1)] > IsfDiff[i - M])
    249             {
    250                 IsfDiff[i - M] = 1280 - IsfDiff[i - (M - 1)];
    251             }
    252             else
    253             {
    254                 IsfDiff[i - (M - 1)] = 1280 - IsfDiff[i - M];
    255             }
    256         }
    257     }
    258 
    259     for (i = M - 1; i < (M16k - 1); i++)
    260     {
    261         HfIsf[i] = add_int16(HfIsf[i - 1], IsfDiff[i - (M - 1)]);
    262     }
    263 
    264     for (i = 0; i < (M16k - 1); i++)
    265     {
    266         HfIsf[i] = mult_int16(HfIsf[i], 26214);  /* Scale the ISF vector correctly for 16000 kHz */
    267     }
    268 
    269     Isf_isp(HfIsf, HfIsf, M16k);
    270 
    271     return;
    272 }
    273 
    274 
    275