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