1 /* (C) Guenter Geiger <geiger@epy.co.at> */
6 These filter coefficients computations are taken from
7 http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt
9 written by Robert Bristow-Johnson
15 #include "../../pdbox.h"
16 #include "../src/m_pd.h"
20 #include "../src/m_pd.h"
22 #pragma warning( disable : 4244 )
23 #pragma warning( disable : 4305 )
30 /* ------------------- lowpass ----------------------------*/
32 static t_class
*lowpass_class
;
34 void lowpass_bang(t_rbjfilter
*x
)
37 t_float omega
= e_omega(x
->x_freq
,x
->x_rate
);
38 t_float alpha
= e_alpha(x
->x_bw
*0.01,omega
);
39 t_float b1
= 1 - cos(omega
);
42 t_float a0
= 1 + alpha
;
43 t_float a1
= -2.*cos(omega
);
44 t_float a2
= 1 - alpha
;
46 /* post("bang %f %f %f",x->x_freq, x->x_gain, x->x_bw); */
48 if (!check_stability(-a1
/a0
,-a2
/a0
,b0
/a0
,b1
/a0
,b2
/a0
)) {
49 post("lowpass: filter unstable -> resetting");
55 SETFLOAT(at
+1,-a2
/a0
);
60 outlet_list(x
->x_obj
.ob_outlet
,&s_list
,5,at
);
64 void lowpass_float(t_rbjfilter
*x
,t_floatarg f
)
71 static void *lowpass_new(t_floatarg f
,t_floatarg bw
)
73 t_rbjfilter
*x
= (t_rbjfilter
*)pd_new(lowpass_class
);
76 outlet_new(&x
->x_obj
,&s_float
);
77 /* floatinlet_new(&x->x_obj, &x->x_gain); */
78 floatinlet_new(&x
->x_obj
, &x
->x_bw
);
80 if (f
> 0.) x
->x_freq
= f
;
81 if (bw
> 0.) x
->x_bw
= bw
;
86 void lowpass_setup(void)
88 lowpass_class
= class_new(gensym("lowpass"), (t_newmethod
)lowpass_new
, 0,
89 sizeof(t_rbjfilter
), 0,A_DEFFLOAT
,A_DEFFLOAT
,0);
90 class_addbang(lowpass_class
,lowpass_bang
);
91 class_addfloat(lowpass_class
,lowpass_float
);