BEAST - Free Software Audio Synthesizer and Tracker  0.10.0
gslfilter.hh
Go to the documentation of this file.
1  // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html
2 #ifndef __GSL_FILTER_H__
3 #define __GSL_FILTER_H__
4 
5 #include <bse/bsemath.hh>
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif /* __cplusplus */
10 
11 
12 /* --- transformations --- */
13 static inline BseComplex bse_trans_s2z (BseComplex s);
14 static inline double bse_trans_freq2s (double w);
15 static inline double bse_trans_zepsilon2ss (double epsilon);
16 
17 
18 /* --- filter roots and poles --- */
19 void gsl_filter_butter_rp (uint iorder,
20  double freq, /* 0..pi */
21  double epsilon,
22  BseComplex *roots, /* [0..iorder-1] */
23  BseComplex *poles);
24 void gsl_filter_tscheb1_rp (uint iorder,
25  double freq, /* 0..pi */
26  double epsilon,
27  BseComplex *roots, /* [0..iorder-1] */
28  BseComplex *poles);
29 void gsl_filter_tscheb2_rp (uint iorder,
30  double c_freq, /* 0..pi */
31  double steepness,
32  double epsilon,
33  BseComplex *roots, /* [0..iorder-1] */
34  BseComplex *poles);
35 
36 
37 /* --- tschebyscheff type II steepness --- */
38 double gsl_filter_tscheb2_steepness_db (uint iorder,
39  double c_freq,
40  double epsilon,
41  double stopband_db);
42 double gsl_filter_tscheb2_steepness (uint iorder,
43  double c_freq,
44  double epsilon,
45  double residue);
46 
47 
48 /* --- lowpass filters --- */
49 void gsl_filter_butter_lp (uint iorder,
50  double freq, /* 0..pi */
51  double epsilon,
52  double *a, /* [0..iorder] */
53  double *b);
54 void gsl_filter_tscheb1_lp (uint iorder,
55  double freq, /* 0..pi */
56  double epsilon,
57  double *a, /* [0..iorder] */
58  double *b);
59 void gsl_filter_tscheb2_lp (uint iorder,
60  double c_freq, /* 0..pi */
61  double steepness,
62  double epsilon,
63  double *a, /* [0..iorder] */
64  double *b);
65 
66 
67 /* --- highpass filters --- */
68 void gsl_filter_butter_hp (uint iorder,
69  double freq, /* 0..pi */
70  double epsilon,
71  double *a, /* [0..iorder] */
72  double *b);
73 void gsl_filter_tscheb1_hp (uint iorder,
74  double freq, /* 0..pi */
75  double epsilon,
76  double *a, /* [0..iorder] */
77  double *b);
78 void gsl_filter_tscheb2_hp (uint iorder,
79  double c_freq, /* 0..pi */
80  double steepness,
81  double epsilon,
82  double *a, /* [0..iorder] */
83  double *b);
84 
85 
86 /* --- bandpass filters --- */
87 void gsl_filter_butter_bp (uint iorder,
88  double freq1, /* 0..pi */
89  double freq2, /* 0..pi */
90  double epsilon,
91  double *a, /* [0..iorder] */
92  double *b);
93 void gsl_filter_tscheb1_bp (uint iorder,
94  double freq1, /* 0..pi */
95  double freq2, /* 0..pi */
96  double epsilon,
97  double *a, /* [0..iorder] */
98  double *b);
99 void gsl_filter_tscheb2_bp (uint iorder,
100  double freq1, /* 0..pi */
101  double freq2, /* 0..pi */
102  double steepness,
103  double epsilon,
104  double *a, /* [0..iorder] */
105  double *b);
106 
107 
108 /* --- bandstop filters --- */
109 void gsl_filter_butter_bs (uint iorder,
110  double freq1, /* 0..pi */
111  double freq2, /* 0..pi */
112  double epsilon,
113  double *a, /* [0..iorder] */
114  double *b);
115 void gsl_filter_tscheb1_bs (uint iorder,
116  double freq1, /* 0..pi */
117  double freq2, /* 0..pi */
118  double epsilon,
119  double *a, /* [0..iorder] */
120  double *b);
121 void gsl_filter_tscheb2_bs (uint iorder,
122  double freq1, /* 0..pi */
123  double freq2, /* 0..pi */
124  double steepness,
125  double epsilon,
126  double *a, /* [0..iorder] */
127  double *b);
128 
129 
130 /* --- FIR Filters --- */
131 void gsl_filter_fir_approx (uint iorder,
132  double *a, /* [0..iorder] */
133  uint n_points,
134  const double *freq,
135  const double *value,
136  gboolean interpolate_db);
137 
138 
139 /* --- IIR Filter Evaluation --- */
140 typedef struct {
141  guint order;
142  gdouble *a; /* [0..order] */
143  gdouble *b; /* [0..order] */
144  gdouble *w; /* [0..2*order] */
145 } GslIIRFilter;
146 void gsl_iir_filter_setup (GslIIRFilter *f,
147  guint order,
148  const gdouble *a,
149  const gdouble *b,
150  gdouble *buffer); /* 4*(order+1) */
151 void gsl_iir_filter_change (GslIIRFilter *f,
152  guint order,
153  const gdouble *a,
154  const gdouble *b,
155  gdouble *buffer); /* 4*(order+1) */
156 void gsl_iir_filter_eval (GslIIRFilter *f,
157  guint n_values,
158  const gfloat *x,
159  gfloat *y);
160 
161 
162 /* --- Biquad Filters --- */
163 typedef enum /*< skip >*/
164 {
165  GSL_BIQUAD_NORMALIZE_PASSBAND,
166  GSL_BIQUAD_NORMALIZE_RESONANCE_GAIN,
167  GSL_BIQUAD_NORMALIZE_PEAK_GAIN
168 } GslBiquadNormalize;
169 
170 typedef enum /*< skip >*/
171 {
172  GSL_BIQUAD_RESONANT_LOWPASS = 1,
173  GSL_BIQUAD_RESONANT_HIGHPASS,
174  GSL_BIQUAD_LOWSHELVE,
175  GSL_BIQUAD_HIGHSHELVE,
176  GSL_BIQUAD_PEAK
177 } GslBiquadType;
178 
179 typedef struct {
180  GslBiquadType type;
181  GslBiquadNormalize normalize; /* high/low pass */
182  gfloat f_fn;
183  gfloat gain;
184  gfloat quality; /* peak/notch */
185  guint dirty : 1; /* post filter_config() changes? */
186  guint approx_values : 1; /* biquad_config_approx_*() called? */
187  /*< private >*/
188  gdouble k, v;
190 
191 typedef struct {
192  gdouble xc0, xc1, xc2;
193  gdouble yc1, yc2; /* yc0==1 */
194  gdouble xd1, xd2, yd1, yd2; /* history */
196 
197 void gsl_biquad_config_init (GslBiquadConfig *c,
198  GslBiquadType type,
199  GslBiquadNormalize normalize);
200 void gsl_biquad_config_setup (GslBiquadConfig *c,
201  gfloat f_fn,
202  gfloat gain,
203  gfloat quality);
204 void gsl_biquad_config_approx_freq (GslBiquadConfig *c,
205  gfloat f_fn);
206 void gsl_biquad_config_approx_gain (GslBiquadConfig *c,
207  gfloat gain);
208 void gsl_biquad_filter_config (GslBiquadFilter *f,
209  GslBiquadConfig *c,
210  gboolean reset_state);
211 void gsl_biquad_filter_eval (GslBiquadFilter *f,
212  guint n_values,
213  const gfloat *x,
214  gfloat *y);
215 
216 
217 /* --- filter scanning -- */
218 gdouble gsl_filter_sine_scan (guint order,
219  const gdouble *a,
220  const gdouble *b,
221  gdouble freq,
222  gdouble mix_freq);
223 
224 
225 /* --- implementations --- */
226 static inline BseComplex
227 bse_trans_s2z (BseComplex s)
228 {
229  /* 1 + (Td/2) * s
230  * z = ----------------
231  * 1 - (Td/2) * s
232  */
233  BseComplex one = { 1, 0 };
234  return bse_complex_div (bse_complex_add (one, s), bse_complex_sub (one, s));
235  /* return bse_complex_div (bse_complex_sub (s, one), bse_complex_add (s, one)); */
236 }
237 static inline double
238 bse_trans_freq2s (double w)
239 {
240  return tan (w / 2.);
241 }
242 static inline double
243 bse_trans_zepsilon2ss (double zepsilon)
244 {
245  double e2 = (1.0 - zepsilon) * (1.0 - zepsilon);
246  /* 1___ _________________
247  * | \ | 1.0
248  * |-----<---- 1 - zepsilon zepsilon = \ | ----------------
249  * |_______\________________ \| 1 + sepsilon^2
250  */
251  return sqrt ((1.0 - e2) / e2);
252 }
253 static inline double
254 bse_trans_freq2z (double w)
255 {
256  return atan (w) * 2.;
257 }
258 
259 
260 
261 #ifdef __cplusplus
262 }
263 #endif /* __cplusplus */
264 
265 #endif /* __GSL_FILTER_H__ */ /* vim:set ts=8 sw=2 sts=2: */
void gsl_filter_butter_hp(uint iorder, double freq, double epsilon, double *a, double *b)
Definition: gslfilter.cc:447
double gsl_filter_tscheb2_steepness_db(uint iorder, double c_freq, double epsilon, double stopband_db)
Definition: gslfilter.cc:298
Definition: gslfilter.hh:191
void gsl_filter_tscheb2_bp(uint iorder, double freq1, double freq2, double steepness, double epsilon, double *a, double *b)
Definition: gslfilter.cc:590
sqrt
Definition: bsemath.hh:39
Definition: gslfilter.hh:140
atan
void gsl_filter_tscheb1_hp(uint iorder, double freq, double epsilon, double *a, double *b)
Definition: gslfilter.cc:470
gdouble gsl_filter_sine_scan(guint order, const gdouble *a, const gdouble *b, gdouble freq, gdouble mix_freq)
Definition: gslfilter.cc:1310
double gsl_filter_tscheb2_steepness(uint iorder, double c_freq, double epsilon, double residue)
Definition: gslfilter.cc:316
void gsl_filter_fir_approx(uint iorder, double *a, uint n_points, const double *freq, const double *value, gboolean interpolate_db)
Definition: gslfilter.cc:851
void gsl_filter_tscheb2_lp(uint iorder, double c_freq, double steepness, double epsilon, double *a, double *b)
Definition: gslfilter.cc:412
void gsl_filter_tscheb2_bs(uint iorder, double freq1, double freq2, double steepness, double epsilon, double *a, double *b)
Definition: gslfilter.cc:696
void gsl_filter_butter_bp(uint iorder, double freq1, double freq2, double epsilon, double *a, double *b)
Definition: gslfilter.cc:521
void gsl_filter_tscheb1_bs(uint iorder, double freq1, double freq2, double epsilon, double *a, double *b)
Definition: gslfilter.cc:661
tan
void gsl_filter_butter_bs(uint iorder, double freq1, double freq2, double epsilon, double *a, double *b)
Definition: gslfilter.cc:627
void gsl_filter_tscheb2_hp(uint iorder, double c_freq, double steepness, double epsilon, double *a, double *b)
Definition: gslfilter.cc:494
void gsl_filter_tscheb1_bp(uint iorder, double freq1, double freq2, double epsilon, double *a, double *b)
Definition: gslfilter.cc:555
void gsl_filter_tscheb1_lp(uint iorder, double freq, double epsilon, double *a, double *b)
Definition: gslfilter.cc:373
void gsl_filter_butter_lp(uint iorder, double freq, double epsilon, double *a, double *b)
Definition: gslfilter.cc:343
Definition: gslfilter.hh:179