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 "LVDBE.h" 26 #include "LVDBE_Coeffs.h" /* Filter coefficients */ 27 #include "BIQUAD.h" 28 29 30 /************************************************************************************/ 31 /* */ 32 /* Coefficients constant table */ 33 /* */ 34 /************************************************************************************/ 35 36 /* 37 * High Pass Filter Coefficient table 38 */ 39 const BQ_C32_Coefs_t LVDBE_HPF_Table[] = { 40 /* Coefficients for 55Hz centre frequency */ 41 {HPF_Fs8000_Fc55_A2, /* 8kS/s coefficients */ 42 HPF_Fs8000_Fc55_A1, 43 HPF_Fs8000_Fc55_A0, 44 -HPF_Fs8000_Fc55_B2, 45 -HPF_Fs8000_Fc55_B1}, 46 {HPF_Fs11025_Fc55_A2, /* 11kS/s coefficients */ 47 HPF_Fs11025_Fc55_A1, 48 HPF_Fs11025_Fc55_A0, 49 -HPF_Fs11025_Fc55_B2, 50 -HPF_Fs11025_Fc55_B1}, 51 {HPF_Fs12000_Fc55_A2, /* 12kS/s coefficients */ 52 HPF_Fs12000_Fc55_A1, 53 HPF_Fs12000_Fc55_A0, 54 -HPF_Fs12000_Fc55_B2, 55 -HPF_Fs12000_Fc55_B1}, 56 {HPF_Fs16000_Fc55_A2, /* 16kS/s coefficients */ 57 HPF_Fs16000_Fc55_A1, 58 HPF_Fs16000_Fc55_A0, 59 -HPF_Fs16000_Fc55_B2, 60 -HPF_Fs16000_Fc55_B1}, 61 {HPF_Fs22050_Fc55_A2, /* 22kS/s coefficients */ 62 HPF_Fs22050_Fc55_A1, 63 HPF_Fs22050_Fc55_A0, 64 -HPF_Fs22050_Fc55_B2, 65 -HPF_Fs22050_Fc55_B1}, 66 {HPF_Fs24000_Fc55_A2, /* 24kS/s coefficients */ 67 HPF_Fs24000_Fc55_A1, 68 HPF_Fs24000_Fc55_A0, 69 -HPF_Fs24000_Fc55_B2, 70 -HPF_Fs24000_Fc55_B1}, 71 {HPF_Fs32000_Fc55_A2, /* 32kS/s coefficients */ 72 HPF_Fs32000_Fc55_A1, 73 HPF_Fs32000_Fc55_A0, 74 -HPF_Fs32000_Fc55_B2, 75 -HPF_Fs32000_Fc55_B1}, 76 {HPF_Fs44100_Fc55_A2, /* 44kS/s coefficients */ 77 HPF_Fs44100_Fc55_A1, 78 HPF_Fs44100_Fc55_A0, 79 -HPF_Fs44100_Fc55_B2, 80 -HPF_Fs44100_Fc55_B1}, 81 {HPF_Fs48000_Fc55_A2, /* 48kS/s coefficients */ 82 HPF_Fs48000_Fc55_A1, 83 HPF_Fs48000_Fc55_A0, 84 -HPF_Fs48000_Fc55_B2, 85 -HPF_Fs48000_Fc55_B1}, 86 87 /* Coefficients for 66Hz centre frequency */ 88 {HPF_Fs8000_Fc66_A2, /* 8kS/s coefficients */ 89 HPF_Fs8000_Fc66_A1, 90 HPF_Fs8000_Fc66_A0, 91 -HPF_Fs8000_Fc66_B2, 92 -HPF_Fs8000_Fc66_B1}, 93 {HPF_Fs11025_Fc66_A2, /* 11kS/s coefficients */ 94 HPF_Fs11025_Fc66_A1, 95 HPF_Fs11025_Fc66_A0, 96 -HPF_Fs11025_Fc66_B2, 97 -HPF_Fs11025_Fc66_B1}, 98 {HPF_Fs12000_Fc66_A2, /* 12kS/s coefficients */ 99 HPF_Fs12000_Fc66_A1, 100 HPF_Fs12000_Fc66_A0, 101 -HPF_Fs12000_Fc66_B2, 102 -HPF_Fs12000_Fc66_B1}, 103 {HPF_Fs16000_Fc66_A2, /* 16kS/s coefficients */ 104 HPF_Fs16000_Fc66_A1, 105 HPF_Fs16000_Fc66_A0, 106 -HPF_Fs16000_Fc66_B2, 107 -HPF_Fs16000_Fc66_B1}, 108 {HPF_Fs22050_Fc66_A2, /* 22kS/s coefficients */ 109 HPF_Fs22050_Fc66_A1, 110 HPF_Fs22050_Fc66_A0, 111 -HPF_Fs22050_Fc66_B2, 112 -HPF_Fs22050_Fc66_B1}, 113 {HPF_Fs24000_Fc66_A2, /* 24kS/s coefficients */ 114 HPF_Fs24000_Fc66_A1, 115 HPF_Fs24000_Fc66_A0, 116 -HPF_Fs24000_Fc66_B2, 117 -HPF_Fs24000_Fc66_B1}, 118 {HPF_Fs32000_Fc66_A2, /* 32kS/s coefficients */ 119 HPF_Fs32000_Fc66_A1, 120 HPF_Fs32000_Fc66_A0, 121 -HPF_Fs32000_Fc66_B2, 122 -HPF_Fs32000_Fc66_B1}, 123 {HPF_Fs44100_Fc66_A2, /* 44kS/s coefficients */ 124 HPF_Fs44100_Fc66_A1, 125 HPF_Fs44100_Fc66_A0, 126 -HPF_Fs44100_Fc66_B2, 127 -HPF_Fs44100_Fc66_B1}, 128 {HPF_Fs48000_Fc66_A2, /* 48kS/s coefficients */ 129 HPF_Fs48000_Fc66_A1, 130 HPF_Fs48000_Fc66_A0, 131 -HPF_Fs48000_Fc66_B2, 132 -HPF_Fs48000_Fc66_B1}, 133 134 /* Coefficients for 78Hz centre frequency */ 135 {HPF_Fs8000_Fc78_A2, /* 8kS/s coefficients */ 136 HPF_Fs8000_Fc78_A1, 137 HPF_Fs8000_Fc78_A0, 138 -HPF_Fs8000_Fc78_B2, 139 -HPF_Fs8000_Fc78_B1}, 140 {HPF_Fs11025_Fc78_A2, /* 11kS/s coefficients */ 141 HPF_Fs11025_Fc78_A1, 142 HPF_Fs11025_Fc78_A0, 143 -HPF_Fs11025_Fc78_B2, 144 -HPF_Fs11025_Fc78_B1}, 145 {HPF_Fs12000_Fc78_A2, /* 12kS/s coefficients */ 146 HPF_Fs12000_Fc78_A1, 147 HPF_Fs12000_Fc78_A0, 148 -HPF_Fs12000_Fc78_B2, 149 -HPF_Fs12000_Fc78_B1}, 150 {HPF_Fs16000_Fc78_A2, /* 16kS/s coefficients */ 151 HPF_Fs16000_Fc78_A1, 152 HPF_Fs16000_Fc78_A0, 153 -HPF_Fs16000_Fc78_B2, 154 -HPF_Fs16000_Fc78_B1}, 155 {HPF_Fs22050_Fc78_A2, /* 22kS/s coefficients */ 156 HPF_Fs22050_Fc78_A1, 157 HPF_Fs22050_Fc78_A0, 158 -HPF_Fs22050_Fc78_B2, 159 -HPF_Fs22050_Fc78_B1}, 160 {HPF_Fs24000_Fc78_A2, /* 24kS/s coefficients */ 161 HPF_Fs24000_Fc78_A1, 162 HPF_Fs24000_Fc78_A0, 163 -HPF_Fs24000_Fc78_B2, 164 -HPF_Fs24000_Fc78_B1}, 165 {HPF_Fs32000_Fc78_A2, /* 32kS/s coefficients */ 166 HPF_Fs32000_Fc78_A1, 167 HPF_Fs32000_Fc78_A0, 168 -HPF_Fs32000_Fc78_B2, 169 -HPF_Fs32000_Fc78_B1}, 170 {HPF_Fs44100_Fc78_A2, /* 44kS/s coefficients */ 171 HPF_Fs44100_Fc78_A1, 172 HPF_Fs44100_Fc78_A0, 173 -HPF_Fs44100_Fc78_B2, 174 -HPF_Fs44100_Fc78_B1}, 175 {HPF_Fs48000_Fc78_A2, /* 48kS/s coefficients */ 176 HPF_Fs48000_Fc78_A1, 177 HPF_Fs48000_Fc78_A0, 178 -HPF_Fs48000_Fc78_B2, 179 -HPF_Fs48000_Fc78_B1}, 180 181 /* Coefficients for 90Hz centre frequency */ 182 {HPF_Fs8000_Fc90_A2, /* 8kS/s coefficients */ 183 HPF_Fs8000_Fc90_A1, 184 HPF_Fs8000_Fc90_A0, 185 -HPF_Fs8000_Fc90_B2, 186 -HPF_Fs8000_Fc90_B1}, 187 {HPF_Fs11025_Fc90_A2, /* 11kS/s coefficients */ 188 HPF_Fs11025_Fc90_A1, 189 HPF_Fs11025_Fc90_A0, 190 -HPF_Fs11025_Fc90_B2, 191 -HPF_Fs11025_Fc90_B1}, 192 {HPF_Fs12000_Fc90_A2, /* 12kS/s coefficients */ 193 HPF_Fs12000_Fc90_A1, 194 HPF_Fs12000_Fc90_A0, 195 -HPF_Fs12000_Fc90_B2, 196 -HPF_Fs12000_Fc90_B1}, 197 {HPF_Fs16000_Fc90_A2, /* 16kS/s coefficients */ 198 HPF_Fs16000_Fc90_A1, 199 HPF_Fs16000_Fc90_A0, 200 -HPF_Fs16000_Fc90_B2, 201 -HPF_Fs16000_Fc90_B1}, 202 {HPF_Fs22050_Fc90_A2, /* 22kS/s coefficients */ 203 HPF_Fs22050_Fc90_A1, 204 HPF_Fs22050_Fc90_A0, 205 -HPF_Fs22050_Fc90_B2, 206 -HPF_Fs22050_Fc90_B1}, 207 {HPF_Fs24000_Fc90_A2, /* 24kS/s coefficients */ 208 HPF_Fs24000_Fc90_A1, 209 HPF_Fs24000_Fc90_A0, 210 -HPF_Fs24000_Fc90_B2, 211 -HPF_Fs24000_Fc90_B1}, 212 {HPF_Fs32000_Fc90_A2, /* 32kS/s coefficients */ 213 HPF_Fs32000_Fc90_A1, 214 HPF_Fs32000_Fc90_A0, 215 -HPF_Fs32000_Fc90_B2, 216 -HPF_Fs32000_Fc90_B1}, 217 {HPF_Fs44100_Fc90_A2, /* 44kS/s coefficients */ 218 HPF_Fs44100_Fc90_A1, 219 HPF_Fs44100_Fc90_A0, 220 -HPF_Fs44100_Fc90_B2, 221 -HPF_Fs44100_Fc90_B1}, 222 {HPF_Fs48000_Fc90_A2, /* 48kS/s coefficients */ 223 HPF_Fs48000_Fc90_A1, 224 HPF_Fs48000_Fc90_A0, 225 -HPF_Fs48000_Fc90_B2, 226 -HPF_Fs48000_Fc90_B1}}; 227 228 /* 229 * Band Pass Filter coefficient table 230 */ 231 const BP_C32_Coefs_t LVDBE_BPF_Table[] = { 232 /* Coefficients for 55Hz centre frequency */ 233 {BPF_Fs8000_Fc55_A0, /* 8kS/s coefficients */ 234 -BPF_Fs8000_Fc55_B2, 235 -BPF_Fs8000_Fc55_B1}, 236 {BPF_Fs11025_Fc55_A0, /* 11kS/s coefficients */ 237 -BPF_Fs11025_Fc55_B2, 238 -BPF_Fs11025_Fc55_B1}, 239 {BPF_Fs12000_Fc55_A0, /* 12kS/s coefficients */ 240 -BPF_Fs12000_Fc55_B2, 241 -BPF_Fs12000_Fc55_B1}, 242 {BPF_Fs16000_Fc55_A0, /* 16kS/s coefficients */ 243 -BPF_Fs16000_Fc55_B2, 244 -BPF_Fs16000_Fc55_B1}, 245 {BPF_Fs22050_Fc55_A0, /* 22kS/s coefficients */ 246 -BPF_Fs22050_Fc55_B2, 247 -BPF_Fs22050_Fc55_B1}, 248 {BPF_Fs24000_Fc55_A0, /* 24kS/s coefficients */ 249 -BPF_Fs24000_Fc55_B2, 250 -BPF_Fs24000_Fc55_B1}, 251 {BPF_Fs32000_Fc55_A0, /* 32kS/s coefficients */ 252 -BPF_Fs32000_Fc55_B2, 253 -BPF_Fs32000_Fc55_B1}, 254 {BPF_Fs44100_Fc55_A0, /* 44kS/s coefficients */ 255 -BPF_Fs44100_Fc55_B2, 256 -BPF_Fs44100_Fc55_B1}, 257 {BPF_Fs48000_Fc55_A0, /* 48kS/s coefficients */ 258 -BPF_Fs48000_Fc55_B2, 259 -BPF_Fs48000_Fc55_B1}, 260 261 /* Coefficients for 66Hz centre frequency */ 262 {BPF_Fs8000_Fc66_A0, /* 8kS/s coefficients */ 263 -BPF_Fs8000_Fc66_B2, 264 -BPF_Fs8000_Fc66_B1}, 265 {BPF_Fs11025_Fc66_A0, /* 11kS/s coefficients */ 266 -BPF_Fs11025_Fc66_B2, 267 -BPF_Fs11025_Fc66_B1}, 268 {BPF_Fs12000_Fc66_A0, /* 12kS/s coefficients */ 269 -BPF_Fs12000_Fc66_B2, 270 -BPF_Fs12000_Fc66_B1}, 271 {BPF_Fs16000_Fc66_A0, /* 16kS/s coefficients */ 272 -BPF_Fs16000_Fc66_B2, 273 -BPF_Fs16000_Fc66_B1}, 274 {BPF_Fs22050_Fc66_A0, /* 22kS/s coefficients */ 275 -BPF_Fs22050_Fc66_B2, 276 -BPF_Fs22050_Fc66_B1}, 277 {BPF_Fs24000_Fc66_A0, /* 24kS/s coefficients */ 278 -BPF_Fs24000_Fc66_B2, 279 -BPF_Fs24000_Fc66_B1}, 280 {BPF_Fs32000_Fc66_A0, /* 32kS/s coefficients */ 281 -BPF_Fs32000_Fc66_B2, 282 -BPF_Fs32000_Fc66_B1}, 283 {BPF_Fs44100_Fc66_A0, /* 44kS/s coefficients */ 284 -BPF_Fs44100_Fc66_B2, 285 -BPF_Fs44100_Fc66_B1}, 286 {BPF_Fs48000_Fc66_A0, /* 48kS/s coefficients */ 287 -BPF_Fs48000_Fc66_B2, 288 -BPF_Fs48000_Fc66_B1}, 289 290 /* Coefficients for 78Hz centre frequency */ 291 {BPF_Fs8000_Fc78_A0, /* 8kS/s coefficients */ 292 -BPF_Fs8000_Fc78_B2, 293 -BPF_Fs8000_Fc78_B1}, 294 {BPF_Fs11025_Fc78_A0, /* 11kS/s coefficients */ 295 -BPF_Fs11025_Fc78_B2, 296 -BPF_Fs11025_Fc78_B1}, 297 {BPF_Fs12000_Fc78_A0, /* 12kS/s coefficients */ 298 -BPF_Fs12000_Fc78_B2, 299 -BPF_Fs12000_Fc78_B1}, 300 {BPF_Fs16000_Fc78_A0, /* 16kS/s coefficients */ 301 -BPF_Fs16000_Fc78_B2, 302 -BPF_Fs16000_Fc78_B1}, 303 {BPF_Fs22050_Fc78_A0, /* 22kS/s coefficients */ 304 -BPF_Fs22050_Fc78_B2, 305 -BPF_Fs22050_Fc78_B1}, 306 {BPF_Fs24000_Fc78_A0, /* 24kS/s coefficients */ 307 -BPF_Fs24000_Fc78_B2, 308 -BPF_Fs24000_Fc78_B1}, 309 {BPF_Fs32000_Fc78_A0, /* 32kS/s coefficients */ 310 -BPF_Fs32000_Fc78_B2, 311 -BPF_Fs32000_Fc78_B1}, 312 {BPF_Fs44100_Fc78_A0, /* 44kS/s coefficients */ 313 -BPF_Fs44100_Fc78_B2, 314 -BPF_Fs44100_Fc78_B1}, 315 {BPF_Fs48000_Fc78_A0, /* 48kS/s coefficients */ 316 -BPF_Fs48000_Fc78_B2, 317 -BPF_Fs48000_Fc78_B1}, 318 319 /* Coefficients for 90Hz centre frequency */ 320 {BPF_Fs8000_Fc90_A0, /* 8kS/s coefficients */ 321 -BPF_Fs8000_Fc90_B2, 322 -BPF_Fs8000_Fc90_B1}, 323 {BPF_Fs11025_Fc90_A0, /* 11kS/s coefficients */ 324 -BPF_Fs11025_Fc90_B2, 325 -BPF_Fs11025_Fc90_B1}, 326 {BPF_Fs12000_Fc90_A0, /* 12kS/s coefficients */ 327 -BPF_Fs12000_Fc90_B2, 328 -BPF_Fs12000_Fc90_B1}, 329 {BPF_Fs16000_Fc90_A0, /* 16kS/s coefficients */ 330 -BPF_Fs16000_Fc90_B2, 331 -BPF_Fs16000_Fc90_B1}, 332 {BPF_Fs22050_Fc90_A0, /* 22kS/s coefficients */ 333 -BPF_Fs22050_Fc90_B2, 334 -BPF_Fs22050_Fc90_B1}, 335 {BPF_Fs24000_Fc90_A0, /* 24kS/s coefficients */ 336 -BPF_Fs24000_Fc90_B2, 337 -BPF_Fs24000_Fc90_B1}, 338 {BPF_Fs32000_Fc90_A0, /* 32kS/s coefficients */ 339 -BPF_Fs32000_Fc90_B2, 340 -BPF_Fs32000_Fc90_B1}, 341 {BPF_Fs44100_Fc90_A0, /* 44kS/s coefficients */ 342 -BPF_Fs44100_Fc90_B2, 343 -BPF_Fs44100_Fc90_B1}, 344 {BPF_Fs48000_Fc90_A0, /* 48kS/s coefficients */ 345 -BPF_Fs48000_Fc90_B2, 346 -BPF_Fs48000_Fc90_B1}}; 347 348 349 /************************************************************************************/ 350 /* */ 351 /* AGC constant tables */ 352 /* */ 353 /************************************************************************************/ 354 355 /* Attack time (signal too large) */ 356 const LVM_INT16 LVDBE_AGC_ATTACK_Table[] = { 357 AGC_ATTACK_Fs8000, 358 AGC_ATTACK_Fs11025, 359 AGC_ATTACK_Fs12000, 360 AGC_ATTACK_Fs16000, 361 AGC_ATTACK_Fs22050, 362 AGC_ATTACK_Fs24000, 363 AGC_ATTACK_Fs32000, 364 AGC_ATTACK_Fs44100, 365 AGC_ATTACK_Fs48000}; 366 367 /* Decay time (signal too small) */ 368 const LVM_INT16 LVDBE_AGC_DECAY_Table[] = { 369 AGC_DECAY_Fs8000, 370 AGC_DECAY_Fs11025, 371 AGC_DECAY_Fs12000, 372 AGC_DECAY_Fs16000, 373 AGC_DECAY_Fs22050, 374 AGC_DECAY_Fs24000, 375 AGC_DECAY_Fs32000, 376 AGC_DECAY_Fs44100, 377 AGC_DECAY_Fs48000}; 378 379 /* Gain for use without the high pass filter */ 380 const LVM_INT32 LVDBE_AGC_GAIN_Table[] = { 381 AGC_GAIN_0dB, 382 AGC_GAIN_1dB, 383 AGC_GAIN_2dB, 384 AGC_GAIN_3dB, 385 AGC_GAIN_4dB, 386 AGC_GAIN_5dB, 387 AGC_GAIN_6dB, 388 AGC_GAIN_7dB, 389 AGC_GAIN_8dB, 390 AGC_GAIN_9dB, 391 AGC_GAIN_10dB, 392 AGC_GAIN_11dB, 393 AGC_GAIN_12dB, 394 AGC_GAIN_13dB, 395 AGC_GAIN_14dB, 396 AGC_GAIN_15dB}; 397 398 /* Gain for use with the high pass filter */ 399 const LVM_INT32 LVDBE_AGC_HPFGAIN_Table[] = { 400 AGC_HPFGAIN_0dB, 401 AGC_HPFGAIN_1dB, 402 AGC_HPFGAIN_2dB, 403 AGC_HPFGAIN_3dB, 404 AGC_HPFGAIN_4dB, 405 AGC_HPFGAIN_5dB, 406 AGC_HPFGAIN_6dB, 407 AGC_HPFGAIN_7dB, 408 AGC_HPFGAIN_8dB, 409 AGC_HPFGAIN_9dB, 410 AGC_HPFGAIN_10dB, 411 AGC_HPFGAIN_11dB, 412 AGC_HPFGAIN_12dB, 413 AGC_HPFGAIN_13dB, 414 AGC_HPFGAIN_14dB, 415 AGC_HPFGAIN_15dB}; 416 417 418 /************************************************************************************/ 419 /* */ 420 /* Volume control gain and time constant tables */ 421 /* */ 422 /************************************************************************************/ 423 424 /* dB to linear conversion table */ 425 const LVM_INT16 LVDBE_VolumeTable[] = { 426 0x4000, /* -6dB */ 427 0x47FB, /* -5dB */ 428 0x50C3, /* -4dB */ 429 0x5A9E, /* -3dB */ 430 0x65AD, /* -2dB */ 431 0x7215, /* -1dB */ 432 0x7FFF}; /* 0dB */ 433 434 const LVM_INT16 LVDBE_VolumeTCTable[] = { 435 VOL_TC_Fs8000, 436 VOL_TC_Fs11025, 437 VOL_TC_Fs12000, 438 VOL_TC_Fs16000, 439 VOL_TC_Fs22050, 440 VOL_TC_Fs24000, 441 VOL_TC_Fs32000, 442 VOL_TC_Fs44100, 443 VOL_TC_Fs48000}; 444 445 const LVM_INT16 LVDBE_MixerTCTable[] = { 446 MIX_TC_Fs8000, 447 MIX_TC_Fs11025, 448 MIX_TC_Fs12000, 449 MIX_TC_Fs16000, 450 MIX_TC_Fs22050, 451 MIX_TC_Fs24000, 452 MIX_TC_Fs32000, 453 MIX_TC_Fs44100, 454 MIX_TC_Fs48000}; 455 456 457