Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2004-2010 NXP Software
      3  * Copyright (C) 2010 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 
     19 /************************************************************************************/
     20 /*                                                                                  */
     21 /*    Includes                                                                      */
     22 /*                                                                                  */
     23 /************************************************************************************/
     24 
     25 #include "LVEQNB.h"
     26 #include "LVEQNB_Coeffs.h"
     27 
     28 
     29 /************************************************************************************/
     30 /*                                                                                  */
     31 /*    Sample rate table                                                             */
     32 /*                                                                                  */
     33 /************************************************************************************/
     34 
     35 /*
     36  * Sample rate table for converting between the enumerated type and the actual
     37  * frequency
     38  */
     39 #if defined(BUILD_FLOAT) && defined(HIGHER_FS)
     40 const LVM_UINT32    LVEQNB_SampleRateTab[] = {8000,                    /* 8kS/s  */
     41                                               11025,
     42                                               12000,
     43                                               16000,
     44                                               22050,
     45                                               24000,
     46                                               32000,
     47                                               44100,
     48                                               48000,
     49                                               88200,
     50                                               96000,
     51                                               176400,
     52                                               192000
     53 };
     54 #else
     55 const LVM_UINT16    LVEQNB_SampleRateTab[] = {8000,                    /* 8kS/s  */
     56                                               11025,
     57                                               12000,
     58                                               16000,
     59                                               22050,
     60                                               24000,
     61                                               32000,
     62                                               44100,
     63                                               48000
     64 };
     65 #endif
     66 
     67 /************************************************************************************/
     68 /*                                                                                  */
     69 /*    Coefficient calculation tables                                                */
     70 /*                                                                                  */
     71 /************************************************************************************/
     72 
     73 /*
     74  * Table for 2 * Pi / Fs
     75  */
     76 #ifdef BUILD_FLOAT
     77 const LVM_FLOAT     LVEQNB_TwoPiOnFsTable[] = {LVEQNB_2PiOn_8000,      /* 8kS/s */
     78                                                LVEQNB_2PiOn_11025,
     79                                                LVEQNB_2PiOn_12000,
     80                                                LVEQNB_2PiOn_16000,
     81                                                LVEQNB_2PiOn_22050,
     82                                                LVEQNB_2PiOn_24000,
     83                                                LVEQNB_2PiOn_32000,
     84                                                LVEQNB_2PiOn_44100,
     85                                                LVEQNB_2PiOn_48000
     86 #ifdef HIGHER_FS
     87                                               ,LVEQNB_2PiOn_88200
     88                                               ,LVEQNB_2PiOn_96000
     89                                               ,LVEQNB_2PiOn_176400
     90                                               ,LVEQNB_2PiOn_192000
     91 #endif
     92                                                };
     93 #else
     94 const LVM_INT16     LVEQNB_TwoPiOnFsTable[] = {LVEQNB_2PiOn_8000,      /* 8kS/s */
     95                                                LVEQNB_2PiOn_11025,
     96                                                LVEQNB_2PiOn_12000,
     97                                                LVEQNB_2PiOn_16000,
     98                                                LVEQNB_2PiOn_22050,
     99                                                LVEQNB_2PiOn_24000,
    100                                                LVEQNB_2PiOn_32000,
    101                                                LVEQNB_2PiOn_44100,
    102                                                LVEQNB_2PiOn_48000};    /* 48kS/s */
    103 #endif
    104 
    105 /*
    106  * Gain table
    107  */
    108 #ifdef BUILD_FLOAT
    109 const LVM_FLOAT     LVEQNB_GainTable[] = {LVEQNB_Gain_Neg15_dB,        /* -15dB gain */
    110                                           LVEQNB_Gain_Neg14_dB,
    111                                           LVEQNB_Gain_Neg13_dB,
    112                                           LVEQNB_Gain_Neg12_dB,
    113                                           LVEQNB_Gain_Neg11_dB,
    114                                           LVEQNB_Gain_Neg10_dB,
    115                                           LVEQNB_Gain_Neg9_dB,
    116                                           LVEQNB_Gain_Neg8_dB,
    117                                           LVEQNB_Gain_Neg7_dB,
    118                                           LVEQNB_Gain_Neg6_dB,
    119                                           LVEQNB_Gain_Neg5_dB,
    120                                           LVEQNB_Gain_Neg4_dB,
    121                                           LVEQNB_Gain_Neg3_dB,
    122                                           LVEQNB_Gain_Neg2_dB,
    123                                           LVEQNB_Gain_Neg1_dB,
    124                                           LVEQNB_Gain_0_dB,            /* 0dB gain */
    125                                           LVEQNB_Gain_1_dB,
    126                                           LVEQNB_Gain_2_dB,
    127                                           LVEQNB_Gain_3_dB,
    128                                           LVEQNB_Gain_4_dB,
    129                                           LVEQNB_Gain_5_dB,
    130                                           LVEQNB_Gain_6_dB,
    131                                           LVEQNB_Gain_7_dB,
    132                                           LVEQNB_Gain_8_dB,
    133                                           LVEQNB_Gain_9_dB,
    134                                           LVEQNB_Gain_10_dB,
    135                                           LVEQNB_Gain_11_dB,
    136                                           LVEQNB_Gain_12_dB,
    137                                           LVEQNB_Gain_13_dB,
    138                                           LVEQNB_Gain_14_dB,
    139                                           LVEQNB_Gain_15_dB};          /* +15dB gain */
    140 #else
    141 const LVM_INT16     LVEQNB_GainTable[] = {LVEQNB_Gain_Neg15_dB,        /* -15dB gain */
    142                                           LVEQNB_Gain_Neg14_dB,
    143                                           LVEQNB_Gain_Neg13_dB,
    144                                           LVEQNB_Gain_Neg12_dB,
    145                                           LVEQNB_Gain_Neg11_dB,
    146                                           LVEQNB_Gain_Neg10_dB,
    147                                           LVEQNB_Gain_Neg9_dB,
    148                                           LVEQNB_Gain_Neg8_dB,
    149                                           LVEQNB_Gain_Neg7_dB,
    150                                           LVEQNB_Gain_Neg6_dB,
    151                                           LVEQNB_Gain_Neg5_dB,
    152                                           LVEQNB_Gain_Neg4_dB,
    153                                           LVEQNB_Gain_Neg3_dB,
    154                                           LVEQNB_Gain_Neg2_dB,
    155                                           LVEQNB_Gain_Neg1_dB,
    156                                           LVEQNB_Gain_0_dB,            /* 0dB gain */
    157                                           LVEQNB_Gain_1_dB,
    158                                           LVEQNB_Gain_2_dB,
    159                                           LVEQNB_Gain_3_dB,
    160                                           LVEQNB_Gain_4_dB,
    161                                           LVEQNB_Gain_5_dB,
    162                                           LVEQNB_Gain_6_dB,
    163                                           LVEQNB_Gain_7_dB,
    164                                           LVEQNB_Gain_8_dB,
    165                                           LVEQNB_Gain_9_dB,
    166                                           LVEQNB_Gain_10_dB,
    167                                           LVEQNB_Gain_11_dB,
    168                                           LVEQNB_Gain_12_dB,
    169                                           LVEQNB_Gain_13_dB,
    170                                           LVEQNB_Gain_14_dB,
    171                                           LVEQNB_Gain_15_dB};          /* +15dB gain */
    172 
    173 #endif
    174 /*
    175  * D table for 100 / (Gain + 1)
    176  */
    177 #ifdef BUILD_FLOAT
    178 const LVM_FLOAT    LVEQNB_DTable[] = {LVEQNB_100D_Neg15_dB,            /* -15dB gain */
    179                                       LVEQNB_100D_Neg14_dB,
    180                                       LVEQNB_100D_Neg13_dB,
    181                                       LVEQNB_100D_Neg12_dB,
    182                                       LVEQNB_100D_Neg11_dB,
    183                                       LVEQNB_100D_Neg10_dB,
    184                                       LVEQNB_100D_Neg9_dB,
    185                                       LVEQNB_100D_Neg8_dB,
    186                                       LVEQNB_100D_Neg7_dB,
    187                                       LVEQNB_100D_Neg6_dB,
    188                                       LVEQNB_100D_Neg5_dB,
    189                                       LVEQNB_100D_Neg4_dB,
    190                                       LVEQNB_100D_Neg3_dB,
    191                                       LVEQNB_100D_Neg2_dB,
    192                                       LVEQNB_100D_Neg1_dB,
    193                                       LVEQNB_100D_0_dB};               /* 0dB gain */
    194 #else
    195 const LVM_INT16    LVEQNB_DTable[] = {LVEQNB_100D_Neg15_dB,            /* -15dB gain */
    196                                       LVEQNB_100D_Neg14_dB,
    197                                       LVEQNB_100D_Neg13_dB,
    198                                       LVEQNB_100D_Neg12_dB,
    199                                       LVEQNB_100D_Neg11_dB,
    200                                       LVEQNB_100D_Neg10_dB,
    201                                       LVEQNB_100D_Neg9_dB,
    202                                       LVEQNB_100D_Neg8_dB,
    203                                       LVEQNB_100D_Neg7_dB,
    204                                       LVEQNB_100D_Neg6_dB,
    205                                       LVEQNB_100D_Neg5_dB,
    206                                       LVEQNB_100D_Neg4_dB,
    207                                       LVEQNB_100D_Neg3_dB,
    208                                       LVEQNB_100D_Neg2_dB,
    209                                       LVEQNB_100D_Neg1_dB,
    210                                       LVEQNB_100D_0_dB};               /* 0dB gain */
    211 
    212 #endif
    213 /************************************************************************************/
    214 /*                                                                                  */
    215 /*    Filter polynomial coefficients                                                */
    216 /*                                                                                  */
    217 /************************************************************************************/
    218 
    219 /*
    220  * Coefficients for calculating the cosine with the equation:
    221  *
    222  *  Cos(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4 + a5*x^5)
    223  *
    224  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
    225  * a range of 0 to Pi. The output is in the range 32767 to -32768 representing the range
    226  * +1.0 to -1.0
    227  */
    228 const LVM_INT16     LVEQNB_CosCoef[] = {3,                             /* Shifts */
    229                                         4096,                          /* a0 */
    230                                         -36,                           /* a1 */
    231                                         -19725,                        /* a2 */
    232                                         -2671,                         /* a3 */
    233                                         23730,                         /* a4 */
    234                                         -9490};                        /* a5 */
    235 
    236 /*
    237  * Coefficients for calculating the cosine error with the equation:
    238  *
    239  *  CosErr(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3)
    240  *
    241  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
    242  * a range of 0 to Pi/25. The output is in the range 0 to 32767 representing the range
    243  * 0.0 to 0.0078852986
    244  *
    245  * This is used to give a double precision cosine over the range 0 to Pi/25 using the
    246  * the equation:
    247  *
    248  * Cos(x) = 1.0 - CosErr(x)
    249  */
    250 const LVM_INT16     LVEQNB_DPCosCoef[] = {1,                           /* Shifts */
    251                                           0,                           /* a0 */
    252                                           -6,                          /* a1 */
    253                                           16586,                       /* a2 */
    254                                           -44};                        /* a3 */
    255 
    256 
    257