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