1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /*
19 ------------------------------------------------------------------------------
20
21 PacketVideo Corp.
22 MP3 Decoder Library
23
24 Filename: pvmp3_equalizer.cpp
25
26
27 Date: 09/21/2007
28
29 ------------------------------------------------------------------------------
30 REVISION HISTORY
31
32
33 Description:
34
35 ------------------------------------------------------------------------------
36 INPUT AND OUTPUT DEFINITIONS
37
38 Input
39 int32 *inData, pointer to the spectrum frequency-line
40 e_equalization equalizerType, equalization mode
41 int32 *pt_work_buff
42
43 Output
44 int32 *pt_work_buff pointer to the equalized frequency-line
45
46 ------------------------------------------------------------------------------
47 FUNCTION DESCRIPTION
48
49 Equalizer
50 Each subband sample is scaled according to a spectrum shape setting
51 defined by "equalizerType"
52
53 ------------------------------------------------------------------------------
54 REQUIREMENTS
55
56
57 ------------------------------------------------------------------------------
58 REFERENCES
59
60 ------------------------------------------------------------------------------
61 PSEUDO-CODE
62
63 ------------------------------------------------------------------------------
64 */
65
66
67 /*----------------------------------------------------------------------------
68 ; INCLUDES
69 ----------------------------------------------------------------------------*/
70
71 #include "pvmp3_equalizer.h"
72 #include "pv_mp3dec_fxd_op.h"
73 #include "pvmp3_dec_defs.h"
74
75 /*----------------------------------------------------------------------------
76 ; MACROS
77 ; Define module specific macros here
78 ----------------------------------------------------------------------------*/
79
80
81 /*----------------------------------------------------------------------------
82 ; DEFINES
83 ; Include all pre-processor statements here. Include conditional
84 ; compile variables also.
85 ----------------------------------------------------------------------------*/
86 #define LEVEL__0__dB 0.999999970f
87 #define LEVEL__1_5dB 0.841395142f
88 #define LEVEL__3__dB 0.707106781f
89 #define LEVEL__4_5dB 0.595662143f
90 #define LEVEL__6__dB 0.500000000f
91 #define LEVEL__7_5dB 0.421696503f
92 #define LEVEL__9__dB 0.353553393f
93 #define LEVEL_12__dB 0.250000000f
94 #define LEVEL_15__dB 0.176776695f
95 #define LEVEL_18__dB 0.125000000f
96 #define LEVEL_21__dB 0.088388347f
97 #define LEVEL_30__dB 0.031250000f
98 #define LEVEL_45__dB 0.005524271f
99 #define LEVEL_60__dB 0.000976562f
100
101 #define Qmf31( x) (int32)((x)*(float)0x7FFFFFFF)
102
103
104 /*----------------------------------------------------------------------------
105 ; LOCAL FUNCTION DEFINITIONS
106 ; Function Prototype declaration
107 ----------------------------------------------------------------------------*/
108
109 /*----------------------------------------------------------------------------
110 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
111 ; Variable declaration - defined here and used outside this module
112 ----------------------------------------------------------------------------*/
113
114 const int32 equalizerTbl[8][SUBBANDS_NUMBER] =
115 {
116 /* FLAT */
117 {
118 Qmf31(LEVEL__0__dB),
119
120 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
121
122 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
123 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
124
125 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
126 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
127 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
128 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
129
130 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
131 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
132 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
133 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
134 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
135 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
136 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
137 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
138 Qmf31(LEVEL__0__dB)
139 },
140 /* BASS BOOST */
141 {
142 Qmf31(LEVEL__0__dB),
143
144 Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__3__dB),
145
146 Qmf31(LEVEL__4_5dB), Qmf31(LEVEL__6__dB),
147 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
148
149 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
150 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
151 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
152 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
153
154 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
155 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
156 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
157 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
158 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
159 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
160 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
161 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
162 Qmf31(LEVEL__6__dB)
163 },
164 /* ROCK */
165 {
166 Qmf31(LEVEL__0__dB),
167
168 Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__3__dB),
169
170 Qmf31(LEVEL__4_5dB), Qmf31(LEVEL__6__dB),
171 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
172
173 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
174 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
175 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
176 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
177
178 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
179 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
180 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
181 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
182 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
183 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
184 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
185 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
186 Qmf31(LEVEL__0__dB)
187 },
188 /* POP */
189 {
190 Qmf31(LEVEL__6__dB),
191
192 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
193
194 Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__0__dB),
195 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
196
197 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
198 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
199 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
200 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
201
202 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
203 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
204 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
205 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
206 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
207 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
208 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
209 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
210 Qmf31(LEVEL__9__dB)
211 },
212 /* JAZZ */
213 {
214 Qmf31(LEVEL__0__dB),
215
216 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
217
218 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
219 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
220
221 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
222 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
223 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
224 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
225
226 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
227 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
228 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
229 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
230 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
231 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
232 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
233 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
234 Qmf31(LEVEL__0__dB)
235 },
236 /* CLASSICAL */
237 {
238 Qmf31(LEVEL__0__dB),
239
240 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
241
242 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
243 Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
244
245 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
246 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
247 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
248 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
249
250 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
251 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
252 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
253 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
254 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
255 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
256 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
257 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
258 Qmf31(LEVEL__0__dB)
259 },
260 /* TALK */
261 {
262 Qmf31(LEVEL__9__dB),
263
264 Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
265
266 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
267 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
268
269 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
270 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
271 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
272 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__1_5dB),
273
274 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
275 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
276 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
277 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
278 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
279 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
280 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
281 Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
282 Qmf31(LEVEL__3__dB)
283 },
284 /* FLAT */
285 {
286 Qmf31(LEVEL__0__dB),
287
288 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
289
290 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
291 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
292
293 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
294 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
295 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
296 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
297
298 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
299 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
300 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
301 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
302 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
303 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
304 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
305 Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
306 Qmf31(LEVEL__0__dB)
307 }
308 };
309
310 /*----------------------------------------------------------------------------
311 ; EXTERNAL FUNCTION REFERENCES
312 ; Declare functions defined elsewhere and referenced in this module
313 ----------------------------------------------------------------------------*/
314
315 /*----------------------------------------------------------------------------
316 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
317 ; Declare variables used in this module but defined elsewhere
318 ----------------------------------------------------------------------------*/
319
320
321 /*----------------------------------------------------------------------------
322 ; FUNCTION CODE
323 ----------------------------------------------------------------------------*/
324
pvmp3_equalizer(int32 * circ_buffer,e_equalization equalizerType,int32 * work_buff)325 void pvmp3_equalizer(int32 *circ_buffer,
326 e_equalization equalizerType,
327 int32 *work_buff)
328 {
329
330 if (equalizerType == flat)
331 {
332 for (int32 band = 0; band < FILTERBANK_BANDS; band += 2)
333 {
334
335 int32 *pt_work_buff = &work_buff[band];
336 int32 *inData = &circ_buffer[544 - (band<<5)];
337
338 int32 i;
339 for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
340 {
341 int32 temp1 = (pt_work_buff[ i ]);
342 int32 temp2 = (pt_work_buff[ i + FILTERBANK_BANDS ]);
343 int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
344 int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
345 *(inData++) = temp1;
346 *(inData++) = temp2;
347 *(inData++) = temp3;
348 *(inData++) = temp4;
349 }
350
351 inData -= SUBBANDS_NUMBER << 1;
352 pt_work_buff++;
353
354 for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
355 {
356 int32 temp1 = (pt_work_buff[ i ]);
357 int32 temp2 = (pt_work_buff[ i + FILTERBANK_BANDS ]);
358 int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
359 int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
360 *(inData++) = temp1;
361 *(inData++) = temp2;
362 *(inData++) = temp3;
363 *(inData++) = temp4;
364 }
365 }
366 }
367 else
368 {
369 const int32 *pt_equalizer = equalizerTbl[equalizerType&7];
370
371
372 for (int32 band = 0; band < FILTERBANK_BANDS; band += 3)
373 {
374 int32 *inData = &circ_buffer[544 - (band<<5)];
375
376 int32 *pt_work_buff = &work_buff[band];
377 int32 i;
378
379 for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
380 {
381 int32 temp1 = (pt_work_buff[ i ]);
382 int32 temp2 = (pt_work_buff[ i + FILTERBANK_BANDS ]);
383 int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
384 int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
385 *(inData++) = fxp_mul32_Q32(temp1 << 1, *(pt_equalizer++));
386 *(inData++) = fxp_mul32_Q32(temp2 << 1, *(pt_equalizer++));
387 *(inData++) = fxp_mul32_Q32(temp3 << 1, *(pt_equalizer++));
388 *(inData++) = fxp_mul32_Q32(temp4 << 1, *(pt_equalizer++));
389 }
390
391 pt_equalizer -= SUBBANDS_NUMBER;
392
393 inData -= SUBBANDS_NUMBER << 1;
394 pt_work_buff++;
395
396 for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
397 {
398 int32 temp1 = (pt_work_buff[ i ]);
399 int32 temp2 = (pt_work_buff[ i + FILTERBANK_BANDS ]);
400 int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
401 int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
402 *(inData++) = fxp_mul32_Q32(temp1 << 1, *(pt_equalizer++));
403 *(inData++) = fxp_mul32_Q32(temp2 << 1, *(pt_equalizer++));
404 *(inData++) = fxp_mul32_Q32(temp3 << 1, *(pt_equalizer++));
405 *(inData++) = fxp_mul32_Q32(temp4 << 1, *(pt_equalizer++));
406 }
407 pt_equalizer -= SUBBANDS_NUMBER;
408
409 }
410 }
411 }
412
413
414
415
416