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 const LVM_UINT16    LVPSA_SampleRateTab[] = {   8000,                    /* 8kS/s  */
38                                                 11025,
39                                                 12000,
40                                                 16000,
41                                                 22050,
42                                                 24000,
43                                                 32000,
44                                                 44100,
45                                                 48000};                  /* 48kS/s */
46 
47 /************************************************************************************/
48 /*                                                                                  */
49 /*  Sample rate inverse table                                                       */
50 /*                                                                                  */
51 /************************************************************************************/
52 
53 /*
54  * Sample rate table for converting between the enumerated type and the actual
55  * frequency
56  */
57 const LVM_UINT32    LVPSA_SampleRateInvTab[] = {    268435,                    /* 8kS/s  */
58                                                     194783,
59                                                     178957,
60                                                     134218,
61                                                     97391,
62                                                     89478,
63                                                     67109,
64                                                     48696,
65                                                     44739};                  /* 48kS/s */
66 
67 
68 
69 /************************************************************************************/
70 /*                                                                                  */
71 /*  Number of samples in 20ms                                                       */
72 /*                                                                                  */
73 /************************************************************************************/
74 
75 /*
76  * Table for converting between the enumerated type and the number of samples
77  * during 20ms
78  */
79 const LVM_UINT16    LVPSA_nSamplesBufferUpdate[]  = {   160,                   /* 8kS/s  */
80                                                         220,
81                                                         240,
82                                                         320,
83                                                         441,
84                                                         480,
85                                                         640,
86                                                         882,
87                                                         960};                  /* 48kS/s */
88 /************************************************************************************/
89 /*                                                                                  */
90 /*  Down sampling factors                                                           */
91 /*                                                                                  */
92 /************************************************************************************/
93 
94 /*
95  * Table for converting between the enumerated type and the down sampling factor
96  */
97 const LVM_UINT16    LVPSA_DownSamplingFactor[]  = {     5,                    /* 8000  S/s  */
98                                                         7,                    /* 11025 S/s  */
99                                                         8,                    /* 12000 S/s  */
100                                                         10,                   /* 16000 S/s  */
101                                                         15,                   /* 22050 S/s  */
102                                                         16,                   /* 24000 S/s  */
103                                                         21,                   /* 32000 S/s  */
104                                                         30,                   /* 44100 S/s  */
105                                                         32};                  /* 48000 S/s  */
106 
107 
108 /************************************************************************************/
109 /*                                                                                  */
110 /*  Coefficient calculation tables                                                  */
111 /*                                                                                  */
112 /************************************************************************************/
113 
114 /*
115  * Table for 2 * Pi / Fs
116  */
117 const LVM_INT16     LVPSA_TwoPiOnFsTable[] = {  26354,      /* 8kS/s */
118                                                 19123,
119                                                 17569,
120                                                 13177,
121                                                  9561,
122                                                  8785,
123                                                  6588,
124                                                  4781,
125                                                  4392};    /* 48kS/s */
126 
127 /*
128  * Gain table
129  */
130 const LVM_INT16     LVPSA_GainTable[] = {   364,          /* -15dB gain */
131                                             408,
132                                             458,
133                                             514,
134                                             577,
135                                             647,
136                                             726,
137                                             815,
138                                             914,
139                                             1026,
140                                             1151,
141                                             1292,
142                                             1449,
143                                             1626,
144                                             1825,
145                                             2048,         /* 0dB gain */
146                                             2297,
147                                             2578,
148                                             2892,
149                                             3245,
150                                             3641,
151                                             4096,
152                                             4584,
153                                             5144,
154                                             5772,
155                                             6476,
156                                             7266,
157                                             8153,
158                                             9148,
159                                             10264,
160                                             11576};        /* +15dB gain */
161 
162 /************************************************************************************/
163 /*                                                                                  */
164 /*  Cosone polynomial coefficients                                                  */
165 /*                                                                                  */
166 /************************************************************************************/
167 
168 /*
169  * Coefficients for calculating the cosine with the equation:
170  *
171  *  Cos(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4 + a5*x^5)
172  *
173  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
174  * a range of 0 to Pi. The output is in the range 32767 to -32768 representing the range
175  * +1.0 to -1.0
176  */
177 const LVM_INT16     LVPSA_CosCoef[] = { 3,                             /* Shifts */
178                                         4096,                          /* a0 */
179                                         -36,                           /* a1 */
180                                         -19725,                        /* a2 */
181                                         -2671,                         /* a3 */
182                                         23730,                         /* a4 */
183                                         -9490};                        /* a5 */
184 
185 /*
186  * Coefficients for calculating the cosine error with the equation:
187  *
188  *  CosErr(x) = (2^Shifts)*(a0 + a1*x + a2*x^2 + a3*x^3)
189  *
190  * These coefficients expect the input, x, to be in the range 0 to 32768 respresenting
191  * a range of 0 to Pi/25. The output is in the range 0 to 32767 representing the range
192  * 0.0 to 0.0078852986
193  *
194  * This is used to give a double precision cosine over the range 0 to Pi/25 using the
195  * the equation:
196  *
197  * Cos(x) = 1.0 - CosErr(x)
198  */
199 const LVM_INT16     LVPSA_DPCosCoef[] = {   1,                           /* Shifts */
200                                             0,                           /* a0 */
201                                             -6,                          /* a1 */
202                                             16586,                       /* a2 */
203                                             -44};                        /* a3 */
204 
205 /************************************************************************************/
206 /*                                                                                  */
207 /*  Quasi peak filter coefficients table                                            */
208 /*                                                                                  */
209 /************************************************************************************/
210 const QPD_C32_Coefs     LVPSA_QPD_Coefs[] = {
211 
212                                          {0x80CEFD2B,0x00CB9B17},  /* 8kS/s  */    /* LVPSA_SPEED_LOW   */
213                                          {0x80D242E7,0x00CED11D},
214                                          {0x80DCBAF5,0x00D91679},
215                                          {0x80CEFD2B,0x00CB9B17},
216                                          {0x80E13739,0x00DD7CD3},
217                                          {0x80DCBAF5,0x00D91679},
218                                          {0x80D94BAF,0x00D5B7E7},
219                                          {0x80E13739,0x00DD7CD3},
220                                          {0x80DCBAF5,0x00D91679},  /* 48kS/s */
221 
222                                          {0x8587513D,0x055C22CF},  /* 8kS/s  */    /* LVPSA_SPEED_MEDIUM      */
223                                          {0x859D2967,0x0570F007},
224                                          {0x85E2EFAC,0x05B34D79},
225                                          {0x8587513D,0x055C22CF},
226                                          {0x8600C7B9,0x05CFA6CF},
227                                          {0x85E2EFAC,0x05B34D79},
228                                          {0x85CC1018,0x059D8F69},
229                                          {0x8600C7B9,0x05CFA6CF},//{0x8600C7B9,0x05CFA6CF},
230                                          {0x85E2EFAC,0x05B34D79},  /* 48kS/s */
231 
232                                          {0xA115EA7A,0x1CDB3F5C},  /* 8kS/s  */   /* LVPSA_SPEED_HIGH      */
233                                          {0xA18475F0,0x1D2C83A2},
234                                          {0xA2E1E950,0x1E2A532E},
235                                          {0xA115EA7A,0x1CDB3F5C},
236                                          {0xA375B2C6,0x1E943BBC},
237                                          {0xA2E1E950,0x1E2A532E},
238                                          {0xA26FF6BD,0x1DD81530},
239                                          {0xA375B2C6,0x1E943BBC},
240                                          {0xA2E1E950,0x1E2A532E}}; /* 48kS/s */
241 
242