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 "LVPSA.h"
     26 #include "LVPSA_QPD.h"
     27 /************************************************************************************/
     28 /*                                                                                  */
     29 /*  Sample rate table                                                               */
     30 /*                                                                                  */
     31 /************************************************************************************/
     32 
     33 /*
     34  * Sample rate table for converting between the enumerated type and the actual
     35  * frequency
     36  */
     37 #ifndef HIGHER_FS
     38 const LVM_UINT16    LVPSA_SampleRateTab[] = {   8000,                    /* 8kS/s  */
     39                                                 11025,
     40                                                 12000,
     41                                                 16000,
     42                                                 22050,
     43                                                 24000,
     44                                                 32000,
     45                                                 44100,
     46                                                 48000};                  /* 48kS/s */
     47 #else
     48 const LVM_UINT32    LVPSA_SampleRateTab[] = {   8000,                    /* 8kS/s  */
     49                                                 11025,
     50                                                 12000,
     51                                                 16000,
     52                                                 22050,
     53                                                 24000,
     54                                                 32000,
     55                                                 44100,
     56                                                 48000,
     57                                                 88200,
     58                                                 96000,
     59                                                176400,
     60                                                192000};                  /* 192kS/s */
     61 #endif
     62 
     63 /************************************************************************************/
     64 /*                                                                                  */
     65 /*  Sample rate inverse table                                                       */
     66 /*                                                                                  */
     67 /************************************************************************************/
     68 
     69 /*
     70  * Sample rate table for converting between the enumerated type and the actual
     71  * frequency
     72  */
     73 const LVM_UINT32    LVPSA_SampleRateInvTab[] = {    268435,                    /* 8kS/s  */
     74                                                     194783,
     75                                                     178957,
     76                                                     134218,
     77                                                     97391,
     78                                                     89478,
     79                                                     67109,
     80                                                     48696,
     81                                                     44739
     82 #ifdef HIGHER_FS
     83                                                     ,24348
     84                                                     ,22369
     85                                                     ,12174
     86                                                     ,11185                  /* 192kS/s */
     87 #endif
     88                                                };
     89 
     90 
     91 
     92 /************************************************************************************/
     93 /*                                                                                  */
     94 /*  Number of samples in 20ms                                                       */
     95 /*                                                                                  */
     96 /************************************************************************************/
     97 
     98 /*
     99  * Table for converting between the enumerated type and the number of samples
    100  * during 20ms
    101  */
    102 const LVM_UINT16    LVPSA_nSamplesBufferUpdate[]  = {   160,                   /* 8kS/s  */
    103                                                         220,
    104                                                         240,
    105                                                         320,
    106                                                         441,
    107                                                         480,
    108                                                         640,
    109                                                         882,
    110                                                         960
    111 #ifdef HIGHER_FS
    112                                                         ,1764
    113                                                         ,1920
    114                                                         ,3528
    115                                                         ,3840                  /* 192kS/s */
    116 #endif
    117                                                     };
    118 /************************************************************************************/
    119 /*                                                                                  */
    120 /*  Down sampling factors                                                           */
    121 /*                                                                                  */
    122 /************************************************************************************/
    123 
    124 /*
    125  * Table for converting between the enumerated type and the down sampling factor
    126  */
    127 const LVM_UINT16    LVPSA_DownSamplingFactor[]  = {     5,                    /* 8000  S/s  */
    128                                                         7,                    /* 11025 S/s  */
    129                                                         8,                    /* 12000 S/s  */
    130                                                         10,                   /* 16000 S/s  */
    131                                                         15,                   /* 22050 S/s  */
    132                                                         16,                   /* 24000 S/s  */
    133                                                         21,                   /* 32000 S/s  */
    134                                                         30,                   /* 44100 S/s  */
    135                                                         32                    /* 48000 S/s  */
    136 #ifdef HIGHER_FS
    137                                                        ,60                   /* 88200 S/s  */
    138                                                        ,64                   /* 96000 S/s  */
    139                                                        ,120                  /* 176400 S/s  */
    140                                                        ,128                  /*192000 S/s  */
    141 #endif
    142                                                   };
    143 
    144 
    145 /************************************************************************************/
    146 /*                                                                                  */
    147 /*  Coefficient calculation tables                                                  */
    148 /*                                                                                  */
    149 /************************************************************************************/
    150 
    151 /*
    152  * Table for 2 * Pi / Fs
    153  */
    154 const LVM_INT16     LVPSA_TwoPiOnFsTable[] = {  26354,      /* 8kS/s */
    155                                                 19123,
    156                                                 17569,
    157                                                 13177,
    158                                                  9561,
    159                                                  8785,
    160                                                  6588,
    161                                                  4781,
    162                                                  4392
    163 #ifdef HIGHER_FS
    164                                                 ,2390
    165                                                 ,2196
    166                                                 ,1195
    167                                                 ,1098    /* 192kS/s */
    168 #endif
    169                                              };
    170 
    171 #ifdef BUILD_FLOAT
    172 const LVM_FLOAT     LVPSA_Float_TwoPiOnFsTable[] = {  0.8042847f,      /* 8kS/s */
    173                                                       0.5836054f,
    174                                                       0.5361796f,
    175                                                       0.4021423f,
    176                                                       0.2917874f,
    177                                                       0.2681051f,
    178                                                       0.2010559f,
    179                                                       0.1459089f,
    180                                                       0.1340372f
    181 #ifdef HIGHER_FS
    182                                                      ,0.0729476f
    183                                                      ,0.0670186f
    184                                                      ,0.0364738f
    185                                                      ,0.0335093f    /* 192kS/s */
    186 #endif
    187                                                    };
    188 
    189 #endif
    190 /*
    191  * Gain table
    192  */
    193 const LVM_INT16     LVPSA_GainTable[] = {   364,          /* -15dB gain */
    194                                             408,
    195                                             458,
    196                                             514,
    197                                             577,
    198                                             647,
    199                                             726,
    200                                             815,
    201                                             914,
    202                                             1026,
    203                                             1151,
    204                                             1292,
    205                                             1449,
    206                                             1626,
    207                                             1825,
    208                                             2048,         /* 0dB gain */
    209                                             2297,
    210                                             2578,
    211                                             2892,
    212                                             3245,
    213                                             3641,
    214                                             4096,
    215                                             4584,
    216                                             5144,
    217                                             5772,
    218                                             6476,
    219                                             7266,
    220                                             8153,
    221                                             9148,
    222                                             10264,
    223                                             11576};        /* +15dB gain */
    224 
    225 #ifdef BUILD_FLOAT
    226 const LVM_FLOAT  LVPSA_Float_GainTable[]={  0.177734375f,          /* -15dB gain */
    227                                             0.199218750f,
    228                                             0.223632812f,
    229                                             0.250976562f,
    230                                             0.281738281f,
    231                                             0.315917968f,
    232                                             0.354492187f,
    233                                             0.397949218f,
    234                                             0.446289062f,
    235                                             0.500976562f,
    236                                             0.562011718f,
    237                                             0.630859375f,
    238                                             0.707519531f,
    239                                             0.793945312f,
    240                                             0.891113281f,
    241                                             1.000000000f,         /* 0dB gain */
    242                                             1.121582031f,
    243                                             1.258789062f,
    244                                             1.412109375f,
    245                                             1.584472656f,
    246                                             1.777832031f,
    247                                             2.000000000f,
    248                                             2.238281250f,
    249                                             2.511718750f,
    250                                             2.818359375f,
    251                                             3.162109375f,
    252                                             3.547851562f,
    253                                             3.980957031f,
    254                                             4.466796875f,
    255                                             5.011718750f,
    256                                             5.652343750f};        /* +15dB gain */
    257 #endif
    258 /************************************************************************************/
    259 /*                                                                                  */
    260 /*  Cosone polynomial coefficients                                                  */
    261 /*                                                                                  */
    262 /************************************************************************************/
    263 
    264 /*
    265  * Coefficients for calculating the cosine with the equation:
    266  *
    267  *  Cos(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4 + a5*x^5)
    268  *
    269  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
    270  * a range of 0 to Pi. The output is in the range 32767 to -32768 representing the range
    271  * +1.0 to -1.0
    272  */
    273 const LVM_INT16     LVPSA_CosCoef[] = { 3,                             /* Shifts */
    274                                         4096,                          /* a0 */
    275                                         -36,                           /* a1 */
    276                                         -19725,                        /* a2 */
    277                                         -2671,                         /* a3 */
    278                                         23730,                         /* a4 */
    279                                         -9490};                        /* a5 */
    280 #ifdef BUILD_FLOAT
    281 const LVM_FLOAT     LVPSA_Float_CosCoef[] = { 3,                             /* Shifts */
    282                                               0.1250038f,                          /* a0 */
    283                                               -0.0010986f,                           /* a1 */
    284                                               -0.6019775f,                        /* a2 */
    285                                               -0.0815149f,                         /* a3 */
    286                                               0.7242042f,                         /* a4 */
    287                                               -0.2896206f};                        /* a5 */
    288 #endif
    289 /*
    290  * Coefficients for calculating the cosine error with the equation:
    291  *
    292  *  CosErr(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3)
    293  *
    294  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
    295  * a range of 0 to Pi/25. The output is in the range 0 to 32767 representing the range
    296  * 0.0 to 0.0078852986
    297  *
    298  * This is used to give a double precision cosine over the range 0 to Pi/25 using the
    299  * the equation:
    300  *
    301  * Cos(x) = 1.0 - CosErr(x)
    302  */
    303 const LVM_INT16     LVPSA_DPCosCoef[] = {   1,                           /* Shifts */
    304                                             0,                           /* a0 */
    305                                             -6,                          /* a1 */
    306                                             16586,                       /* a2 */
    307                                             -44};                        /* a3 */
    308 #ifdef BUILD_FLOAT
    309 const LVM_FLOAT    LVPSA_Float_DPCosCoef[] = {1.0f,                        /* Shifts */
    310                                               0.0f,                        /* a0 */
    311                                               -0.00008311f,                 /* a1 */
    312                                               0.50617999f,                 /* a2 */
    313                                               -0.00134281f};                /* a3 */
    314 #endif
    315 /************************************************************************************/
    316 /*                                                                                  */
    317 /*  Quasi peak filter coefficients table                                            */
    318 /*                                                                                  */
    319 /************************************************************************************/
    320 const QPD_C32_Coefs     LVPSA_QPD_Coefs[] = {
    321 
    322                                          {0x80CEFD2B,0x00CB9B17},  /* 8kS/s  */    /* LVPSA_SPEED_LOW   */
    323                                          {0x80D242E7,0x00CED11D},
    324                                          {0x80DCBAF5,0x00D91679},
    325                                          {0x80CEFD2B,0x00CB9B17},
    326                                          {0x80E13739,0x00DD7CD3},
    327                                          {0x80DCBAF5,0x00D91679},
    328                                          {0x80D94BAF,0x00D5B7E7},
    329                                          {0x80E13739,0x00DD7CD3},
    330                                          {0x80DCBAF5,0x00D91679},  /* 48kS/s */
    331 
    332                                          {0x8587513D,0x055C22CF},  /* 8kS/s  */    /* LVPSA_SPEED_MEDIUM      */
    333                                          {0x859D2967,0x0570F007},
    334                                          {0x85E2EFAC,0x05B34D79},
    335                                          {0x8587513D,0x055C22CF},
    336                                          {0x8600C7B9,0x05CFA6CF},
    337                                          {0x85E2EFAC,0x05B34D79},
    338                                          {0x85CC1018,0x059D8F69},
    339                                          {0x8600C7B9,0x05CFA6CF},//{0x8600C7B9,0x05CFA6CF},
    340                                          {0x85E2EFAC,0x05B34D79},  /* 48kS/s */
    341 
    342                                          {0xA115EA7A,0x1CDB3F5C},  /* 8kS/s  */   /* LVPSA_SPEED_HIGH      */
    343                                          {0xA18475F0,0x1D2C83A2},
    344                                          {0xA2E1E950,0x1E2A532E},
    345                                          {0xA115EA7A,0x1CDB3F5C},
    346                                          {0xA375B2C6,0x1E943BBC},
    347                                          {0xA2E1E950,0x1E2A532E},
    348                                          {0xA26FF6BD,0x1DD81530},
    349                                          {0xA375B2C6,0x1E943BBC},
    350                                          {0xA2E1E950,0x1E2A532E}}; /* 48kS/s */
    351 
    352 #ifdef BUILD_FLOAT
    353 const QPD_FLOAT_Coefs     LVPSA_QPD_Float_Coefs[] = {
    354 
    355                                          /* 8kS/s  */    /* LVPSA_SPEED_LOW   */
    356                                          {-0.9936831989325583f,0.0062135565094650f},
    357                                          {-0.9935833332128823f,0.0063115493394434f},
    358                                          {-0.9932638457976282f,0.0066249934025109f},
    359                                          {-0.9936831989325583f,0.0062135565094650f},
    360                                          {-0.9931269618682563f,0.0067592649720609f},
    361                                          {-0.9932638457976282f,0.0066249934025109f},
    362                                          {-0.9933686633594334f,0.0065221670083702f},
    363                                          {-0.9931269618682563f,0.0067592649720609f},
    364                                           /* 48kS/s */
    365                                          {-0.9932638457976282f,0.0066249934025109f},
    366 #ifdef HIGHER_FS
    367                                          {-0.9931269618682563f,0.0067592649720609f},
    368                                          {-0.9932638457976282f,0.0066249934025109f},
    369                                          {-0.9931269618682563f,0.0067592649720609f},
    370                                          {-0.9932638457976282f,0.0066249934025109f},
    371 #endif
    372                                          /* 8kS/s  */    /* LVPSA_SPEED_MEDIUM      */
    373                                          {-0.9568079425953329f,0.0418742666952312f},
    374                                          {-0.9561413046903908f,0.0425090822391212f},
    375                                          {-0.9540119562298059f,0.0445343819446862f},
    376                                          {-0.9568079425953329f,0.0418742666952312f},
    377                                          {-0.9531011912040412f,0.0453995238058269f},
    378                                          {-0.9540119562298059f,0.0445343819446862f},
    379                                          {-0.9547099955379963f,0.0438708555884659f},
    380                                           //{0x8600C7B9,0x05CFA6CF},
    381                                          {-0.9531011912040412f,0.0453995238058269f},
    382                                           /* 48kS/s */
    383                                          {-0.9540119562298059f,0.0445343819446862f},
    384 #ifdef HIGHER_FS
    385                                          {-0.9531011912040412f,0.0453995238058269f},
    386                                          {-0.9540119562298059f,0.0445343819446862f},
    387                                          {-0.9531011912040412f,0.0453995238058269f},
    388                                          {-0.9540119562298059f,0.0445343819446862f},
    389 #endif
    390                                           /* 8kS/s  */   /* LVPSA_SPEED_HIGH      */
    391                                          {-0.7415186790749431f,0.2254409026354551f},
    392                                          {-0.7381451204419136f,0.2279209652915597f},
    393                                          {-0.7274807319045067f,0.2356666540727019f},
    394                                          {-0.7415186790749431f,0.2254409026354551f},
    395                                          {-0.7229706319049001f,0.2388987224549055f},
    396                                          {-0.7274807319045067f,0.2356666540727019f},
    397                                          {-0.7309581353329122f,0.2331568226218224f},
    398                                          {-0.7229706319049001f,0.2388987224549055f},
    399                                            /* 48kS/s */
    400                                          {-0.7274807319045067f,0.2356666540727019f}
    401 #ifdef HIGHER_FS
    402                                         ,{-0.7229706319049001f,0.2388987224549055f}
    403                                         ,{-0.7274807319045067f,0.2356666540727019f}
    404                                         ,{-0.7229706319049001f,0.2388987224549055f}
    405                                         ,{-0.7274807319045067f,0.2356666540727019f}
    406 #endif
    407                                         };
    408 #endif
    409