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
25 #define L 2 // Storage for filter taps
26 #define KM 10 // Max number of bands
28 #define Q 1.2247449 /* Q value for band-pass filters 1.2247=(3/2)^(1/2)
29 gives 4dB suppression @ Fc*2 and Fc/2 */
31 /* Center frequencies for band-pass filters
32 The different frequency bands are:
45 #define CF {31.25,62.5,125,250,500,1000,2000,4000,8000,16000}
47 // Maximum and minimum gain for the bands
51 // Data for specific instances of this filter
52 typedef struct af_equalizer_s
54 float a
[KM
][L
]; // A weights
55 float b
[KM
][L
]; // B weights
56 float wq
[AF_NCH
][KM
][L
]; // Circular buffer for W data
57 float g
[AF_NCH
][KM
]; // Gain factor for each channel and band
58 int K
; // Number of used eq bands
59 int channels
; // Number of channels
60 float gain_factor
; // applied at output to avoid clipping
63 // 2nd order Band-pass Filter design
64 static void bp2(float* a
, float* b
, float fc
, float q
){
65 double th
= 2.0 * M_PI
* fc
;
66 double C
= (1.0 - tan(th
*q
/2.0))/(1.0 + tan(th
*q
/2.0));
68 a
[0] = (1.0 + C
) * cos(th
);
75 // Initialization and runtime control
76 static int control(struct af_instance_s
* af
, int cmd
, void* arg
)
78 af_equalizer_t
* s
= (af_equalizer_t
*)af
->setup
;
81 case AF_CONTROL_REINIT
:{
88 if(!arg
) return AF_ERROR
;
90 af
->data
->rate
= ((af_data_t
*)arg
)->rate
;
91 af
->data
->nch
= ((af_data_t
*)arg
)->nch
;
92 af
->data
->format
= AF_FORMAT_FLOAT_NE
;
95 // Calculate number of active filters
97 while(F
[s
->K
-1] > (float)af
->data
->rate
/2.2)
101 af_msg(AF_MSG_INFO
,"[equalizer] Limiting the number of filters to"
102 " %i due to low sample rate.\n",s
->K
);
104 // Generate filter taps
106 bp2(s
->a
[k
],s
->b
[k
],F
[k
]/((float)af
->data
->rate
),Q
);
108 // Calculate how much this plugin adds to the overall time delay
109 af
->delay
= 2 * af
->data
->nch
* af
->data
->bps
;
111 // Calculate gain factor to prevent clipping at output
112 for(k
=0;k
<AF_NCH
;k
++)
116 if(s
->gain_factor
< s
->g
[k
][i
]) s
->gain_factor
=s
->g
[k
][i
];
120 s
->gain_factor
=log10(s
->gain_factor
+ 1.0) * 20.0;
122 if(s
->gain_factor
> 0.0)
124 s
->gain_factor
=0.1+(s
->gain_factor
/12.0);
129 return af_test_output(af
,arg
);
131 case AF_CONTROL_COMMAND_LINE
:{
132 float g
[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
134 sscanf((char*)arg
,"%f:%f:%f:%f:%f:%f:%f:%f:%f:%f", &g
[0], &g
[1],
135 &g
[2], &g
[3], &g
[4], &g
[5], &g
[6], &g
[7], &g
[8] ,&g
[9]);
136 for(i
=0;i
<AF_NCH
;i
++){
138 ((af_equalizer_t
*)af
->setup
)->g
[i
][j
] =
139 pow(10.0,clamp(g
[j
],G_MIN
,G_MAX
)/20.0)-1.0;
144 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_SET
:{
145 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
146 int ch
= ((af_control_ext_t
*)arg
)->ch
;
148 if(ch
>= AF_NCH
|| ch
< 0)
151 for(k
= 0 ; k
<KM
; k
++)
152 s
->g
[ch
][k
] = pow(10.0,clamp(gain
[k
],G_MIN
,G_MAX
)/20.0)-1.0;
156 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_GET
:{
157 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
158 int ch
= ((af_control_ext_t
*)arg
)->ch
;
160 if(ch
>= AF_NCH
|| ch
< 0)
163 for(k
= 0 ; k
<KM
; k
++)
164 gain
[k
] = log10(s
->g
[ch
][k
]+1.0) * 20.0;
173 static void uninit(struct af_instance_s
* af
)
181 // Filter data through filter
182 static af_data_t
* play(struct af_instance_s
* af
, af_data_t
* data
)
184 af_data_t
* c
= data
; // Current working data
185 af_equalizer_t
* s
= (af_equalizer_t
*)af
->setup
; // Setup
186 uint32_t ci
= af
->data
->nch
; // Index for channels
187 uint32_t nch
= af
->data
->nch
; // Number of channels
190 float* g
= s
->g
[ci
]; // Gain factor
191 float* in
= ((float*)c
->audio
)+ci
;
192 float* out
= ((float*)c
->audio
)+ci
;
193 float* end
= in
+ c
->len
/4; // Block loop end
196 register int k
= 0; // Frequency band index
197 register float yt
= *in
; // Current input sample
202 // Pointer to circular buffer wq
203 register float* wq
= s
->wq
[ci
][k
];
204 // Calculate output from AR part of current filter
205 register float w
=yt
*s
->b
[k
][0] + wq
[0]*s
->a
[k
][0] + wq
[1]*s
->a
[k
][1];
206 // Calculate output form MA part of current filter
207 yt
+=(w
+ wq
[1]*s
->b
[k
][1])*g
[k
];
208 // Update circular buffer
213 *out
=yt
*s
->gain_factor
;
220 // Allocate memory and set function pointers
221 static int af_open(af_instance_t
* af
){
226 af
->data
=calloc(1,sizeof(af_data_t
));
227 af
->setup
=calloc(1,sizeof(af_equalizer_t
));
228 if(af
->data
== NULL
|| af
->setup
== NULL
)
233 // Description of this filter
234 af_info_t af_info_equalizer
= {
235 "Equalizer audio filter",
239 AF_FLAGS_NOT_REENTRANT
,