2313
|
1 /*
|
|
2 * PCM time-domain equalizer
|
|
3 *
|
|
4 * Copyright (C) 2002-2005 Felipe Rivera <liebremx at users sourceforge net>
|
|
5 *
|
|
6 * This program is free software; you can redistribute it and/or modify
|
|
7 * it under the terms of the GNU General Public License as published by
|
|
8 * the Free Software Foundation; either version 2 of the License, or
|
|
9 * (at your option) any later version.
|
|
10 *
|
|
11 * This program is distributed in the hope that it will be useful,
|
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14 * GNU General Public License for more details.
|
|
15 *
|
|
16 * You should have received a copy of the GNU General Public License
|
|
17 * along with this program; if not, write to the Free Software
|
|
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
19 *
|
|
20 * $Id: iir.c,v 1.15 2005/10/17 01:57:59 liebremx Exp $
|
|
21 */
|
|
22
|
|
23 #include <math.h>
|
|
24 #include "iir.h"
|
|
25
|
|
26 /* Coefficients */
|
|
27 sIIRCoefficients *iir_cf;
|
|
28
|
|
29 /* Volume gain
|
|
30 * values should be between 0.0 and 1.0
|
|
31 * Use the preamp from XMMS for now
|
|
32 * */
|
|
33 float preamp[EQ_CHANNELS];
|
|
34
|
|
35 #ifdef BENCHMARK
|
|
36 #include "benchmark.h"
|
|
37 double timex = 0.0;
|
|
38 int count = 0;
|
|
39 unsigned int blength = 0;
|
|
40 #endif
|
|
41
|
|
42 /*
|
|
43 * Global vars
|
|
44 */
|
|
45 gint rate;
|
|
46 int band_count;
|
|
47
|
|
48 void set_preamp(gint chn, float val)
|
|
49 {
|
|
50 preamp[chn] = val;
|
|
51 }
|
|
52
|
|
53 /* Init the filters */
|
|
54 void init_iir()
|
|
55 {
|
|
56 calc_coeffs();
|
|
57 #if 0
|
|
58 band_count = cfg.band_num;
|
|
59 #endif
|
|
60
|
|
61 band_count = 10;
|
|
62
|
|
63 rate = 44100;
|
|
64
|
|
65 iir_cf = get_coeffs(&band_count, rate, TRUE);
|
|
66 clean_history();
|
|
67 }
|
|
68
|
|
69 #ifdef ARCH_X86
|
|
70 /* Round function provided by Frank Klemm which saves around 100K
|
|
71 * CPU cycles in my PIII for each call to the IIR function with 4K samples
|
|
72 */
|
|
73 __inline__ int round_trick(float floatvalue_to_round)
|
|
74 {
|
|
75 float floattmp ;
|
|
76 int rounded_value ;
|
|
77
|
|
78 floattmp = (int) 0x00FD8000L + (floatvalue_to_round);
|
|
79 rounded_value = *(int*)(&floattmp) - (int)0x4B7D8000L;
|
|
80
|
|
81 if ( rounded_value != (short) rounded_value )
|
|
82 rounded_value = ( rounded_value >> 31 ) ^ 0x7FFF;
|
|
83 return rounded_value;
|
|
84 }
|
|
85 #endif
|