• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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