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