1 /*=============================================================================
3 // This software has been released under the terms of the GNU General Public
4 // license. See http://www.gnu.org/copyleft/gpl.html for details.
6 // Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au
8 //=============================================================================
11 /* Equalizer filter, implementation of a 10 band time domain graphic
12 equalizer using IIR filters. The IIR filters are implemented using a
13 Direct Form II approach, but has been modified (b1 == 0 always) to
26 #define L 2 // Storage for filter taps
27 #define KM 10 // Max number of bands
29 #define Q 1.2247449 /* Q value for band-pass filters 1.2247=(3/2)^(1/2)
30 gives 4dB suppression @ Fc*2 and Fc/2 */
32 /* Center frequencies for band-pass filters
33 The different frequency bands are:
46 #define CF {31.25,62.5,125,250,500,1000,2000,4000,8000,16000}
48 // Maximum and minimum gain for the bands
52 // Data for specific instances of this filter
53 typedef struct af_equalizer_s
55 float a
[KM
][L
]; // A weights
56 float b
[KM
][L
]; // B weights
57 float wq
[AF_NCH
][KM
][L
]; // Circular buffer for W data
58 float g
[AF_NCH
][KM
]; // Gain factor for each channel and band
59 int K
; // Number of used eq bands
60 int channels
; // Number of channels
61 float gain_factor
; // applied at output to avoid clipping
64 // 2nd order Band-pass Filter design
65 static void bp2(float* a
, float* b
, float fc
, float q
){
66 double th
= 2.0 * M_PI
* fc
;
67 double C
= (1.0 - tan(th
*q
/2.0))/(1.0 + tan(th
*q
/2.0));
69 a
[0] = (1.0 + C
) * cos(th
);
76 // Initialization and runtime control
77 static int control(struct af_instance_s
* af
, int cmd
, void* arg
)
79 af_equalizer_t
* s
= (af_equalizer_t
*)af
->setup
;
82 case AF_CONTROL_REINIT
:{
89 if(!arg
) return AF_ERROR
;
91 af
->data
->rate
= ((af_data_t
*)arg
)->rate
;
92 af
->data
->nch
= ((af_data_t
*)arg
)->nch
;
93 af
->data
->format
= AF_FORMAT_FLOAT_NE
;
96 // Calculate number of active filters
98 while(F
[s
->K
-1] > (float)af
->data
->rate
/2.2)
102 af_msg(AF_MSG_INFO
,"[equalizer] Limiting the number of filters to"
103 " %i due to low sample rate.\n",s
->K
);
105 // Generate filter taps
107 bp2(s
->a
[k
],s
->b
[k
],F
[k
]/((float)af
->data
->rate
),Q
);
109 // Calculate how much this plugin adds to the overall time delay
110 af
->delay
+= 2000.0/((float)af
->data
->rate
);
112 // Calculate gain factor to prevent clipping at output
113 for(k
=0;k
<AF_NCH
;k
++)
117 if(s
->gain_factor
< s
->g
[k
][i
]) s
->gain_factor
=s
->g
[k
][i
];
121 s
->gain_factor
=log10(s
->gain_factor
+ 1.0) * 20.0;
123 if(s
->gain_factor
> 0.0)
125 s
->gain_factor
=0.1+(s
->gain_factor
/12.0);
130 return af_test_output(af
,arg
);
132 case AF_CONTROL_COMMAND_LINE
:{
133 float g
[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
135 sscanf((char*)arg
,"%f:%f:%f:%f:%f:%f:%f:%f:%f:%f", &g
[0], &g
[1],
136 &g
[2], &g
[3], &g
[4], &g
[5], &g
[6], &g
[7], &g
[8] ,&g
[9]);
137 for(i
=0;i
<AF_NCH
;i
++){
139 ((af_equalizer_t
*)af
->setup
)->g
[i
][j
] =
140 pow(10.0,clamp(g
[j
],G_MIN
,G_MAX
)/20.0)-1.0;
145 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_SET
:{
146 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
147 int ch
= ((af_control_ext_t
*)arg
)->ch
;
149 if(ch
>= AF_NCH
|| ch
< 0)
152 for(k
= 0 ; k
<KM
; k
++)
153 s
->g
[ch
][k
] = pow(10.0,clamp(gain
[k
],G_MIN
,G_MAX
)/20.0)-1.0;
157 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_GET
:{
158 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
159 int ch
= ((af_control_ext_t
*)arg
)->ch
;
161 if(ch
>= AF_NCH
|| ch
< 0)
164 for(k
= 0 ; k
<KM
; k
++)
165 gain
[k
] = log10(s
->g
[ch
][k
]+1.0) * 20.0;
174 static void uninit(struct af_instance_s
* af
)
182 // Filter data through filter
183 static af_data_t
* play(struct af_instance_s
* af
, af_data_t
* data
)
185 af_data_t
* c
= data
; // Current working data
186 af_equalizer_t
* s
= (af_equalizer_t
*)af
->setup
; // Setup
187 uint32_t ci
= af
->data
->nch
; // Index for channels
188 uint32_t nch
= af
->data
->nch
; // Number of channels
191 float* g
= s
->g
[ci
]; // Gain factor
192 float* in
= ((float*)c
->audio
)+ci
;
193 float* out
= ((float*)c
->audio
)+ci
;
194 float* end
= in
+ c
->len
/4; // Block loop end
197 register int k
= 0; // Frequency band index
198 register float yt
= *in
; // Current input sample
203 // Pointer to circular buffer wq
204 register float* wq
= s
->wq
[ci
][k
];
205 // Calculate output from AR part of current filter
206 register float w
=yt
*s
->b
[k
][0] + wq
[0]*s
->a
[k
][0] + wq
[1]*s
->a
[k
][1];
207 // Calculate output form MA part of current filter
208 yt
+=(w
+ wq
[1]*s
->b
[k
][1])*g
[k
];
209 // Update circular buffer
214 *out
=yt
*s
->gain_factor
;
221 // Allocate memory and set function pointers
222 static int open(af_instance_t
* af
){
228 af
->data
=calloc(1,sizeof(af_data_t
));
229 af
->setup
=calloc(1,sizeof(af_equalizer_t
));
230 if(af
->data
== NULL
|| af
->setup
== NULL
)
235 // Description of this filter
236 af_info_t af_info_equalizer
= {
237 "Equalizer audio filter",
241 AF_FLAGS_NOT_REENTRANT
,