BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
gslfilter.hh
Go to the documentation of this file.
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: */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines