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 )
31 /* ------------------- notch ----------------------------*/
33 static t_class
*notch_class
;
35 void notch_bang(t_rbjfilter
*x
)
38 t_float omega
= e_omega(x
->x_freq
,x
->x_rate
);
39 t_float alpha
= e_alpha(x
->x_bw
* 0.01,omega
);
40 t_float b1
= -2.*cos(omega
);
43 t_float a0
= 1 + alpha
;
44 t_float a1
= -2.*cos(omega
);
45 t_float a2
= 1 - alpha
;
47 /* post("bang %f %f %f",x->x_freq, x->x_gain, x->x_bw); */
49 if (!check_stability(-a1
/a0
,-a2
/a0
,b0
/a0
,b1
/a0
,b2
/a0
)) {
50 post("notch: filter unstable -> resetting");
56 SETFLOAT(at
+1,-a2
/a0
);
61 outlet_list(x
->x_obj
.ob_outlet
,&s_list
,5,at
);
65 void notch_float(t_rbjfilter
*x
,t_floatarg f
)
72 static void *notch_new(t_floatarg f
,t_floatarg bw
)
74 t_rbjfilter
*x
= (t_rbjfilter
*)pd_new(notch_class
);
77 outlet_new(&x
->x_obj
,&s_float
);
78 /* floatinlet_new(&x->x_obj, &x->x_gain); */
79 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 notch_setup(void)
88 notch_class
= class_new(gensym("notch"), (t_newmethod
)notch_new
, 0,
89 sizeof(t_rbjfilter
), 0,A_DEFFLOAT
,A_DEFFLOAT
,0);
90 class_addbang(notch_class
,notch_bang
);
91 class_addfloat(notch_class
,notch_float
);