1 /*=============================================================================
3 // This software has been released under the terms of the GNU 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
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
:{
86 if(!arg
) return AF_ERROR
;
88 af
->data
->rate
= ((af_data_t
*)arg
)->rate
;
89 af
->data
->nch
= ((af_data_t
*)arg
)->nch
;
90 af
->data
->format
= AF_FORMAT_NE
| AF_FORMAT_F
;
93 // Calculate number of active filters
95 while(F
[s
->K
-1] > (float)af
->data
->rate
/2.2)
99 af_msg(AF_MSG_INFO
,"[equalizer] Limiting the number of filters to"
100 " %i due to low sample rate.\n",s
->K
);
102 // Generate filter taps
104 bp2(s
->a
[k
],s
->b
[k
],F
[k
]/((float)af
->data
->rate
),Q
);
106 // Calculate how much this plugin adds to the overall time delay
107 af
->delay
+= 2000.0/((float)af
->data
->rate
);
109 return af_test_output(af
,arg
);
111 case AF_CONTROL_COMMAND_LINE
:{
112 float g
[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
114 sscanf((char*)arg
,"%f:%f:%f:%f:%f:%f:%f:%f:%f:%f", &g
[0], &g
[1],
115 &g
[2], &g
[3], &g
[4], &g
[5], &g
[6], &g
[7], &g
[8] ,&g
[9]);
116 for(i
=0;i
<AF_NCH
;i
++){
118 ((af_equalizer_t
*)af
->setup
)->g
[i
][j
] =
119 pow(10.0,clamp(g
[j
],G_MIN
,G_MAX
)/20.0)-1.0;
124 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_SET
:{
125 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
126 int ch
= ((af_control_ext_t
*)arg
)->ch
;
128 if(ch
> AF_NCH
|| ch
< 0)
131 for(k
= 0 ; k
<KM
; k
++)
132 s
->g
[ch
][k
] = pow(10.0,clamp(gain
[k
],G_MIN
,G_MAX
)/20.0)-1.0;
136 case AF_CONTROL_EQUALIZER_GAIN
| AF_CONTROL_GET
:{
137 float* gain
= ((af_control_ext_t
*)arg
)->arg
;
138 int ch
= ((af_control_ext_t
*)arg
)->ch
;
140 if(ch
> AF_NCH
|| ch
< 0)
143 for(k
= 0 ; k
<KM
; k
++)
144 gain
[k
] = log10(s
->g
[ch
][k
]+1.0) * 20.0;
153 static void uninit(struct af_instance_s
* af
)
161 // Filter data through filter
162 static af_data_t
* play(struct af_instance_s
* af
, af_data_t
* data
)
164 af_data_t
* c
= data
; // Current working data
165 af_equalizer_t
* s
= (af_equalizer_t
*)af
->setup
; // Setup
166 uint32_t ci
= af
->data
->nch
; // Index for channels
167 uint32_t nch
= af
->data
->nch
; // Number of channels
170 float* g
= s
->g
[ci
]; // Gain factor
171 float* in
= ((float*)c
->audio
)+ci
;
172 float* out
= ((float*)c
->audio
)+ci
;
173 float* end
= in
+ c
->len
/4; // Block loop end
176 register uint32_t k
= 0; // Frequency band index
177 register float yt
= *in
; // Current input sample
182 // Pointer to circular buffer wq
183 register float* wq
= s
->wq
[ci
][k
];
184 // Calculate output from AR part of current filter
185 register float w
=yt
*s
->b
[k
][0] + wq
[0]*s
->a
[k
][0] + wq
[1]*s
->a
[k
][1];
186 // Calculate output form MA part of current filter
187 yt
+=(w
+ wq
[1]*s
->b
[k
][1])*g
[k
];
188 // Update circular buffer
200 // Allocate memory and set function pointers
201 static int open(af_instance_t
* af
){
207 af
->data
=calloc(1,sizeof(af_data_t
));
208 af
->setup
=calloc(1,sizeof(af_equalizer_t
));
209 if(af
->data
== NULL
|| af
->setup
== NULL
)
214 // Description of this filter
215 af_info_t af_info_equalizer
= {
216 "Equalizer audio filter",
220 AF_FLAGS_NOT_REENTRANT
,