BEAST/BSE - Better Audio System and Sound Engine
0.8.2
|
00001 // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html 00002 #ifndef __GSL_FILTER_H__ 00003 #define __GSL_FILTER_H__ 00004 00005 #include <bse/bsemath.hh> 00006 00007 #ifdef __cplusplus 00008 extern "C" { 00009 #endif /* __cplusplus */ 00010 00011 00012 /* --- transformations --- */ 00013 static inline BseComplex bse_trans_s2z (BseComplex s); 00014 static inline double bse_trans_freq2s (double w); 00015 static inline double bse_trans_zepsilon2ss (double epsilon); 00016 00017 00018 /* --- filter roots and poles --- */ 00019 void gsl_filter_butter_rp (uint iorder, 00020 double freq, /* 0..pi */ 00021 double epsilon, 00022 BseComplex *roots, /* [0..iorder-1] */ 00023 BseComplex *poles); 00024 void gsl_filter_tscheb1_rp (uint iorder, 00025 double freq, /* 0..pi */ 00026 double epsilon, 00027 BseComplex *roots, /* [0..iorder-1] */ 00028 BseComplex *poles); 00029 void gsl_filter_tscheb2_rp (uint iorder, 00030 double c_freq, /* 0..pi */ 00031 double steepness, 00032 double epsilon, 00033 BseComplex *roots, /* [0..iorder-1] */ 00034 BseComplex *poles); 00035 00036 00037 /* --- tschebyscheff type II steepness --- */ 00038 double gsl_filter_tscheb2_steepness_db (uint iorder, 00039 double c_freq, 00040 double epsilon, 00041 double stopband_db); 00042 double gsl_filter_tscheb2_steepness (uint iorder, 00043 double c_freq, 00044 double epsilon, 00045 double residue); 00046 00047 00048 /* --- lowpass filters --- */ 00049 void gsl_filter_butter_lp (uint iorder, 00050 double freq, /* 0..pi */ 00051 double epsilon, 00052 double *a, /* [0..iorder] */ 00053 double *b); 00054 void gsl_filter_tscheb1_lp (uint iorder, 00055 double freq, /* 0..pi */ 00056 double epsilon, 00057 double *a, /* [0..iorder] */ 00058 double *b); 00059 void gsl_filter_tscheb2_lp (uint iorder, 00060 double c_freq, /* 0..pi */ 00061 double steepness, 00062 double epsilon, 00063 double *a, /* [0..iorder] */ 00064 double *b); 00065 00066 00067 /* --- highpass filters --- */ 00068 void gsl_filter_butter_hp (uint iorder, 00069 double freq, /* 0..pi */ 00070 double epsilon, 00071 double *a, /* [0..iorder] */ 00072 double *b); 00073 void gsl_filter_tscheb1_hp (uint iorder, 00074 double freq, /* 0..pi */ 00075 double epsilon, 00076 double *a, /* [0..iorder] */ 00077 double *b); 00078 void gsl_filter_tscheb2_hp (uint iorder, 00079 double c_freq, /* 0..pi */ 00080 double steepness, 00081 double epsilon, 00082 double *a, /* [0..iorder] */ 00083 double *b); 00084 00085 00086 /* --- bandpass filters --- */ 00087 void gsl_filter_butter_bp (uint iorder, 00088 double freq1, /* 0..pi */ 00089 double freq2, /* 0..pi */ 00090 double epsilon, 00091 double *a, /* [0..iorder] */ 00092 double *b); 00093 void gsl_filter_tscheb1_bp (uint iorder, 00094 double freq1, /* 0..pi */ 00095 double freq2, /* 0..pi */ 00096 double epsilon, 00097 double *a, /* [0..iorder] */ 00098 double *b); 00099 void gsl_filter_tscheb2_bp (uint iorder, 00100 double freq1, /* 0..pi */ 00101 double freq2, /* 0..pi */ 00102 double steepness, 00103 double epsilon, 00104 double *a, /* [0..iorder] */ 00105 double *b); 00106 00107 00108 /* --- bandstop filters --- */ 00109 void gsl_filter_butter_bs (uint iorder, 00110 double freq1, /* 0..pi */ 00111 double freq2, /* 0..pi */ 00112 double epsilon, 00113 double *a, /* [0..iorder] */ 00114 double *b); 00115 void gsl_filter_tscheb1_bs (uint iorder, 00116 double freq1, /* 0..pi */ 00117 double freq2, /* 0..pi */ 00118 double epsilon, 00119 double *a, /* [0..iorder] */ 00120 double *b); 00121 void gsl_filter_tscheb2_bs (uint iorder, 00122 double freq1, /* 0..pi */ 00123 double freq2, /* 0..pi */ 00124 double steepness, 00125 double epsilon, 00126 double *a, /* [0..iorder] */ 00127 double *b); 00128 00129 00130 /* --- FIR Filters --- */ 00131 void gsl_filter_fir_approx (uint iorder, 00132 double *a, /* [0..iorder] */ 00133 uint n_points, 00134 const double *freq, 00135 const double *value, 00136 gboolean interpolate_db); 00137 00138 00139 /* --- IIR Filter Evaluation --- */ 00140 typedef struct { 00141 guint order; 00142 gdouble *a; /* [0..order] */ 00143 gdouble *b; /* [0..order] */ 00144 gdouble *w; /* [0..2*order] */ 00145 } GslIIRFilter; 00146 void gsl_iir_filter_setup (GslIIRFilter *f, 00147 guint order, 00148 const gdouble *a, 00149 const gdouble *b, 00150 gdouble *buffer); /* 4*(order+1) */ 00151 void gsl_iir_filter_change (GslIIRFilter *f, 00152 guint order, 00153 const gdouble *a, 00154 const gdouble *b, 00155 gdouble *buffer); /* 4*(order+1) */ 00156 void gsl_iir_filter_eval (GslIIRFilter *f, 00157 guint n_values, 00158 const gfloat *x, 00159 gfloat *y); 00160 00161 00162 /* --- Biquad Filters --- */ 00163 typedef enum /*< skip >*/ 00164 { 00165 GSL_BIQUAD_NORMALIZE_PASSBAND, 00166 GSL_BIQUAD_NORMALIZE_RESONANCE_GAIN, 00167 GSL_BIQUAD_NORMALIZE_PEAK_GAIN 00168 } GslBiquadNormalize; 00169 00170 typedef enum /*< skip >*/ 00171 { 00172 GSL_BIQUAD_RESONANT_LOWPASS = 1, 00173 GSL_BIQUAD_RESONANT_HIGHPASS, 00174 GSL_BIQUAD_LOWSHELVE, 00175 GSL_BIQUAD_HIGHSHELVE, 00176 GSL_BIQUAD_PEAK 00177 } GslBiquadType; 00178 00179 typedef struct { 00180 GslBiquadType type; 00181 GslBiquadNormalize normalize; /* high/low pass */ 00182 gfloat f_fn; 00183 gfloat gain; 00184 gfloat quality; /* peak/notch */ 00185 guint dirty : 1; /* post filter_config() changes? */ 00186 guint approx_values : 1; /* biquad_config_approx_*() called? */ 00187 /*< private >*/ 00188 gdouble k, v; 00189 } GslBiquadConfig; 00190 00191 typedef struct { 00192 gdouble xc0, xc1, xc2; 00193 gdouble yc1, yc2; /* yc0==1 */ 00194 gdouble xd1, xd2, yd1, yd2; /* history */ 00195 } GslBiquadFilter; 00196 00197 void gsl_biquad_config_init (GslBiquadConfig *c, 00198 GslBiquadType type, 00199 GslBiquadNormalize normalize); 00200 void gsl_biquad_config_setup (GslBiquadConfig *c, 00201 gfloat f_fn, 00202 gfloat gain, 00203 gfloat quality); 00204 void gsl_biquad_config_approx_freq (GslBiquadConfig *c, 00205 gfloat f_fn); 00206 void gsl_biquad_config_approx_gain (GslBiquadConfig *c, 00207 gfloat gain); 00208 void gsl_biquad_filter_config (GslBiquadFilter *f, 00209 GslBiquadConfig *c, 00210 gboolean reset_state); 00211 void gsl_biquad_filter_eval (GslBiquadFilter *f, 00212 guint n_values, 00213 const gfloat *x, 00214 gfloat *y); 00215 00216 00217 /* --- filter scanning -- */ 00218 gdouble gsl_filter_sine_scan (guint order, 00219 const gdouble *a, 00220 const gdouble *b, 00221 gdouble freq, 00222 gdouble mix_freq); 00223 00224 00225 /* --- implementations --- */ 00226 static inline BseComplex 00227 bse_trans_s2z (BseComplex s) 00228 { 00229 /* 1 + (Td/2) * s 00230 * z = ---------------- 00231 * 1 - (Td/2) * s 00232 */ 00233 BseComplex one = { 1, 0 }; 00234 return bse_complex_div (bse_complex_add (one, s), bse_complex_sub (one, s)); 00235 /* return bse_complex_div (bse_complex_sub (s, one), bse_complex_add (s, one)); */ 00236 } 00237 static inline double 00238 bse_trans_freq2s (double w) 00239 { 00240 return tan (w / 2.); 00241 } 00242 static inline double 00243 bse_trans_zepsilon2ss (double zepsilon) 00244 { 00245 double e2 = (1.0 - zepsilon) * (1.0 - zepsilon); 00246 /* 1___ _________________ 00247 * | \ | 1.0 00248 * |-----<---- 1 - zepsilon zepsilon = \ | ---------------- 00249 * |_______\________________ \| 1 + sepsilon^2 00250 */ 00251 return sqrt ((1.0 - e2) / e2); 00252 } 00253 static inline double 00254 bse_trans_freq2z (double w) 00255 { 00256 return atan (w) * 2.; 00257 } 00258 00259 00260 00261 #ifdef __cplusplus 00262 } 00263 #endif /* __cplusplus */ 00264 00265 #endif /* __GSL_FILTER_H__ */ /* vim:set ts=8 sw=2 sts=2: */