Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3780
Modified Files: Tag: desiredata builtins_dsp.c Log Message: interleaved the code of the FFT classes
Index: builtins_dsp.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/builtins_dsp.c,v retrieving revision 1.1.2.27 retrieving revision 1.1.2.28 diff -C2 -d -r1.1.2.27 -r1.1.2.28 *** builtins_dsp.c 19 Jul 2007 18:53:39 -0000 1.1.2.27 --- builtins_dsp.c 19 Jul 2007 19:20:19 -0000 1.1.2.28 *************** *** 11,14 **** --- 11,16 ---- */
+ //#define HAVE_LIBFFTW3F + #define PD_PLUSPLUS_FACE #include "desire.h" *************** *** 2015,2023 **** #ifndef HAVE_LIBFFTW3F /* ------------------------ fft~ and ifft~ -------------------------------- */ ! static t_class *sigfft_class, *sigifft_class; ! ! struct t_sigfft : t_object { ! float a; ! };
static void *sigfft_new() { --- 2017,2026 ---- #ifndef HAVE_LIBFFTW3F /* ------------------------ fft~ and ifft~ -------------------------------- */ ! /* ----------------------- rfft~ -------------------------------- */ ! /* ----------------------- rifft~ -------------------------------- */ ! static t_class *sigfft_class; struct t_sigfft : t_object {float a;}; ! static t_class *sigifft_class; struct t_sigifft : t_object {float a;}; ! static t_class *sigrfft_class; struct t_sigrfft : t_object {float a;}; ! static t_class *sigrifft_class; struct t_sigrifft : t_object {float a;};
static void *sigfft_new() { *************** *** 2025,2041 **** outlet_new(x, &s_signal); outlet_new(x, &s_signal); ! inlet_new(x, x, &s_signal, &s_signal); ! x->a = 0; ! return x; ! } ! static void *sigifft_new() { ! t_sigfft *x = (t_sigfft *)pd_new(sigifft_class); outlet_new(x, &s_signal); outlet_new(x, &s_signal); inlet_new(x, x, &s_signal, &s_signal); ! x->a = 0; ! return x; ! }
static t_int *sigfft_swap(t_int *w) { --- 2028,2047 ---- outlet_new(x, &s_signal); outlet_new(x, &s_signal); ! inlet_new(x, x, &s_signal, &s_signal); x->a=0; return x;} static void *sigifft_new() { ! t_sigifft *x = (t_sigifft *)pd_new(sigifft_class); ! outlet_new(x, &s_signal); ! outlet_new(x, &s_signal); ! inlet_new(x, x, &s_signal, &s_signal); x->a=0; return x;} ! static void *sigrfft_new() { ! t_sigrfft *x = (t_sigrfft *)pd_new(sigrfft_class); outlet_new(x, &s_signal); outlet_new(x, &s_signal); + x->a = 0; return x;} + static void *sigrifft_new() { + t_sigrifft *x = (t_sigrifft *)pd_new(sigrifft_class); inlet_new(x, x, &s_signal, &s_signal); ! outlet_new(x, &s_signal); ! x->a = 0; return x;}
static t_int *sigfft_swap(t_int *w) { *************** *** 2050,2067 **** return w+4; } ! static t_int *sigfft_perform(t_int *w) { ! float *in1 = (t_float *)w[1]; ! float *in2 = (t_float *)w[2]; ! int n = w[3]; ! mayer_fft(n, in1, in2); ! return w+4; ! } ! static t_int *sigifft_perform(t_int *w) { ! float *in1 = (t_float *)w[1]; ! float *in2 = (t_float *)w[2]; ! int n = w[3]; ! mayer_ifft(n, in1, in2); ! return w+4; ! } static void sigfft_dspx(t_sigfft *x, t_signal **sp, t_int *(*f)(t_int *w)) { int n = sp[0]->n; --- 2056,2064 ---- return w+4; } ! static t_int * sigfft_perform(t_int *w) {float *in1=(t_float *)w[1], *in2=(t_float *)w[2]; int n=w[3]; mayer_fft(n,in1,in2); return w+4;} ! static t_int * sigifft_perform(t_int *w) {float *in1=(t_float *)w[1], *in2=(t_float *)w[2]; int n=w[3]; mayer_ifft(n,in1,in2); return w+4;} ! static t_int * sigrfft_perform(t_int *w) {float *in =(t_float *)w[1]; int n = w[2]; mayer_realfft(n, in); return w+3;} ! static t_int *sigrifft_perform(t_int *w) {float *in =(t_float *)w[1]; int n = w[2]; mayer_realifft(n, in); return w+3;} ! static void sigfft_dspx(t_sigfft *x, t_signal **sp, t_int *(*f)(t_int *w)) { int n = sp[0]->n; *************** *** 2081,2112 **** dsp_add(f, 3, sp[2]->v, sp[3]->v, n); } ! static void sigfft_dsp(t_sigfft *x, t_signal **sp) { ! sigfft_dspx(x, sp, sigfft_perform); ! } ! static void sigifft_dsp(t_sigfft *x, t_signal **sp) { ! sigfft_dspx(x, sp, sigifft_perform); ! } ! static void sigfft_setup() { ! sigfft_class = class_new2("fft~",sigfft_new,0,sizeof(t_sigfft),0,""); ! CLASS_MAINSIGNALIN(sigfft_class, t_sigfft, a); ! class_addmethod2(sigfft_class, sigfft_dsp, "dsp",""); ! sigifft_class = class_new2("ifft~",sigifft_new,0,sizeof(t_sigfft),0,""); ! CLASS_MAINSIGNALIN(sigifft_class, t_sigfft, a); ! class_addmethod2(sigifft_class, sigifft_dsp, "dsp",""); ! class_sethelpsymbol(sigifft_class, gensym("fft~")); ! }
- /* ----------------------- rfft~ -------------------------------- */ - static t_class *sigrfft_class; - struct t_sigrfft : t_object { - float a; - }; - static void *sigrfft_new() { - t_sigrfft *x = (t_sigrfft *)pd_new(sigrfft_class); - outlet_new(x, &s_signal); - outlet_new(x, &s_signal); - x->a = 0; - return x; - } static t_int *sigrfft_flip(t_int *w) { float *in = (t_float *)w[1]; --- 2078,2084 ---- dsp_add(f, 3, sp[2]->v, sp[3]->v, n); } ! static void sigfft_dsp(t_sigfft *x, t_signal **sp) {sigfft_dspx(x, sp, sigfft_perform);} ! static void sigifft_dsp(t_sigfft *x, t_signal **sp) {sigfft_dspx(x, sp, sigifft_perform);}
static t_int *sigrfft_flip(t_int *w) { float *in = (t_float *)w[1]; *************** *** 2114,2126 **** int n = w[3]; while (n--) *(--out) = *in++; ! *(--out) = 0; /* to hell with it */ return w+4; } - static t_int *sigrfft_perform(t_int *w) { - float *in = (t_float *)w[1]; - int n = w[2]; - mayer_realfft(n, in); - return w+3; - } static void sigrfft_dsp(t_sigrfft *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); --- 2086,2092 ---- int n = w[3]; while (n--) *(--out) = *in++; ! *(--out) = 0; /* to hell with it */ return w+4; } static void sigrfft_dsp(t_sigrfft *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); *************** *** 2145,2173 **** dsp_add_zero(out2 + n2, n2); } - static void sigrfft_setup() { - sigrfft_class = class_new2("rfft~",sigrfft_new,0,sizeof(t_sigrfft),0,""); - CLASS_MAINSIGNALIN(sigrfft_class, t_sigrfft, a); - class_addmethod2(sigrfft_class, sigrfft_dsp, "dsp",""); - class_sethelpsymbol(sigrfft_class, gensym("fft~")); - }
- /* ----------------------- rifft~ -------------------------------- */ - static t_class *sigrifft_class; - struct t_sigrifft : t_object { - float a; - }; - static void *sigrifft_new() { - t_sigrifft *x = (t_sigrifft *)pd_new(sigrifft_class); - inlet_new(x, x, &s_signal, &s_signal); - outlet_new(x, &s_signal); - x->a = 0; - return x; - } - static t_int *sigrifft_perform(t_int *w) { - float *in = (t_float *)w[1]; - int n = w[2]; - mayer_realifft(n, in); - return w+3; - } static void sigrifft_dsp(t_sigrifft *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); --- 2111,2115 ---- *************** *** 2185,2193 **** dsp_add(sigrifft_perform, 2, out1, n); } ! static void sigrifft_setup() { sigrifft_class = class_new2("rifft~",sigrifft_new,0,sizeof(t_sigrifft),0,""); ! CLASS_MAINSIGNALIN(sigrifft_class, t_sigrifft, a); ! class_addmethod2(sigrifft_class, sigrifft_dsp, "dsp",""); ! class_sethelpsymbol(sigrifft_class, gensym("fft~")); }
--- 2127,2146 ---- dsp_add(sigrifft_perform, 2, out1, n); } ! static void sigfft_setup() { ! sigfft_class = class_new2("fft~", sigfft_new, 0,sizeof(t_sigfft), 0,""); ! sigifft_class = class_new2("ifft~", sigifft_new, 0,sizeof(t_sigfft), 0,""); ! sigrfft_class = class_new2("rfft~", sigrfft_new, 0,sizeof(t_sigrfft), 0,""); sigrifft_class = class_new2("rifft~",sigrifft_new,0,sizeof(t_sigrifft),0,""); ! CLASS_MAINSIGNALIN(sigfft_class, t_sigfft, a); ! CLASS_MAINSIGNALIN(sigifft_class, t_sigfft, a); ! CLASS_MAINSIGNALIN(sigrfft_class, t_sigrfft, a); ! CLASS_MAINSIGNALIN(sigrifft_class,t_sigrifft,a); ! class_addmethod2(sigfft_class, sigfft_dsp, "dsp",""); ! class_addmethod2(sigifft_class, sigifft_dsp, "dsp",""); ! class_addmethod2(sigrfft_class, sigrfft_dsp, "dsp",""); ! class_addmethod2(sigrifft_class,sigrifft_dsp,"dsp",""); ! class_sethelpsymbol(sigifft_class, gensym("fft~")); ! class_sethelpsymbol(sigrfft_class, gensym("fft~")); ! class_sethelpsymbol(sigrifft_class,gensym("fft~")); }
*************** *** 2195,2215 **** /* Support for fftw3 by Tim Blechmann */ /* ------------------------ fft~ and ifft~ -------------------------------- */
- static t_class *sigfftw_class, *sigifftw_class; - struct t_sigfftw : t_object { - float a; - fftwf_plan plan; - fftwf_iodim dim; - } t_sigfftw; static void *sigfftw_new() { ! t_sigfftw *x = (t_sigfftw *)pd_new(sigfftw_class); ! outlet_new(x, &s_signal); ! outlet_new(x, &s_signal); inlet_new(x, x, &s_signal, &s_signal); ! x->a = 0; ! return x; ! } ! static void sigfftw_free(t_sigfftw * x) { ! fftwf_destroy_plan(x->plan); } static t_int *sigfftw_perform(t_int *w) { --- 2148,2181 ---- /* Support for fftw3 by Tim Blechmann */ /* ------------------------ fft~ and ifft~ -------------------------------- */ + /* ----------------------- rfft~ --------------------------------- */ + /* ----------------------- rifft~ -------------------------------- */ + + static t_class *sigfftw_class; struct t_sigfftw : t_object {float a; fftwf_plan plan; fftwf_iodim dim;}; + static t_class *sigifftw_class; struct t_sigifftw : t_object {float a; fftwf_plan plan; fftwf_iodim dim;}; + static t_class *sigrfftw_class; struct t_sigrfftw : t_object {float a; fftwf_plan plan; fftwf_iodim dim;}; + static t_class *sigrifftw_class;struct t_sigrifftw : t_object {float a; fftwf_plan plan; fftwf_iodim dim;};
static void *sigfftw_new() { ! t_sigfftw *x = (t_sigfftw *)pd_new(sigfftw_class); outlet_new(x, &s_signal); outlet_new(x, &s_signal); ! inlet_new(x, x, &s_signal, &s_signal); x->a=0; return x;} ! static void *sigifftw_new() { ! t_sigifftw *x = (t_sigifftw *)pd_new(sigfftw_class); outlet_new(x, &s_signal); outlet_new(x, &s_signal); ! inlet_new(x, x, &s_signal, &s_signal); x->a=0; return x;} ! static void *sigrfftw_new() { ! t_sigrfftw *x = (t_sigrfftw *)pd_new(sigrfftw_class); ! outlet_new(x, &s_signal); outlet_new(x, &s_signal); x->a=0; return x;} ! static void *sigrifftw_new() { ! t_sigrifftw *x = (t_sigrifftw *)pd_new(sigrifftw_class); inlet_new(x, x, &s_signal, &s_signal); ! outlet_new(x, &s_signal); x->a=0; return x;} ! ! static void sigfftw_free( t_sigfftw *x) {fftwf_destroy_plan(x->plan);} ! static void sigifftw_free( t_sigifftw *x) {fftwf_destroy_plan(x->plan);} ! static void sigrfftw_free( t_sigrfftw *x) {fftwf_destroy_plan(x->plan);} ! static void sigrifftw_free(t_sigrifftw *x) {fftwf_destroy_plan(x->plan);} ! ! /* for compatibility reasons with the mayer fft, we'll have to invert some samples. this is ugly, but someone might rely on that. */ ! static void sigrfftw_invert(t_sample * s, t_int n) { ! while (n!=0) {--n; s[n]=-s[n];} } static t_int *sigfftw_perform(t_int *w) { *************** *** 2217,2220 **** --- 2183,2197 ---- return w+2; } + static t_int *sigrfftw_perform(t_int *w) { + fftwf_execute(*(fftwf_plan*)w[1]); + sigrfftw_invert((t_sample*)w[2],(t_int)w[3]); + return w+4; + } + static t_int *sigrifftw_perform(t_int *w) { + sigrfftw_invert((t_sample *)w[2],w[3]); + fftwf_execute(*(fftwf_plan*)w[1]); + return w+4; + } + static void sigfftw_dsp(t_sigfftw *x, t_signal **sp) { int n = sp[0]->n; *************** *** 2241,2283 **** dsp_add(sigfftw_perform, 1, &x->plan); } - static void sigfftw_setup() { - sigfftw_class = class_new2("fft~",sigfftw_new,sigfftw_free,sizeof(t_sigfftw),0,""); - CLASS_MAINSIGNALIN(sigfftw_class, t_sigfftw, a); - class_addmethod2(sigfftw_class, sigfftw_dsp,"dsp",""); - sigifftw_class = class_new2("ifft~",sigfftw_new,sigfftw_free,sizeof(t_sigfftw),0,""); - CLASS_MAINSIGNALIN(sigifftw_class, t_sigfftw, a); - class_addmethod2(sigifftw_class, sigifftw_dsp,"dsp",""); - class_sethelpsymbol(sigifftw_class, gensym("fft~")); - } - - /* ----------------------- rfft~ --------------------------------- */ - static t_class *sigrfftw_class; - struct t_sigrfftw : t_object { - float a; - fftwf_plan plan; - fftwf_iodim dim; - }; - static void *sigrfftw_new() { - t_sigrfftw *x = (t_sigrfftw *)pd_new(sigrfftw_class); - outlet_new(x, &s_signal); - outlet_new(x, &s_signal); - x->a = 0; - return x; - } - static void sigrfftw_free(t_sigrfftw *x) {fftwf_destroy_plan(x->plan);}
- /* for compatibility reasons with the mayer fft, we'll have to invert - * some samples ... this is ugly, but someone might rely on that ... */ - static void sigrfftw_invert(t_sample * s, t_int n) { - while (n!=0) { - --n; - s[n]=-s[n]; - } - } - static t_int *sigrfftw_perform(t_int *w) { - fftwf_execute(*(fftwf_plan*)w[1]); - sigrfftw_invert((t_sample*)w[2],(t_int)w[3]); - return w+4; - } static void sigrfftw_dsp(t_sigrfftw *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); --- 2218,2222 ---- *************** *** 2285,2332 **** float *out1 = sp[1]->v; float *out2 = sp[2]->v; ! if (n < 4) { ! error("fft: minimum 4 points"); ! return; ! } else { ! x->dim.n=n; ! x->dim.is=1; ! x->dim.os=1; ! x->plan = fftwf_plan_guru_split_dft_r2c(1, &(x->dim), 0, NULL, ! in, out1, out2, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT); dsp_add(sigrfftw_perform,3,&x->plan,out2+1,n2-1); - } dsp_add_zero(out1 + n2, n2); dsp_add_zero(out2 + n2, n2); } - static void sigrfftw_setup() { - sigrfftw_class = class_new2("rfft~",sigrfftw_new,sigrfftw_free,sizeof(t_sigrfftw),0,0); - CLASS_MAINSIGNALIN(sigrfftw_class, t_sigrfftw, a); - class_addmethod2(sigrfftw_class, sigrfftw_dsp,"dsp",""); - class_sethelpsymbol(sigrfftw_class, gensym("fft~")); - }
- /* ----------------------- rifft~ -------------------------------- */ - static t_class *sigrifftw_class; - struct t_sigrifftw : t_object { - t_object obj; - float a; - fftwf_plan plan; - fftwf_iodim dim; - } t_sigrifftw; - static void *sigrifftw_new() { - t_sigrifftw *x = (t_sigrifftw *)pd_new(sigrifftw_class); - inlet_new(x, x, &s_signal, &s_signal); - outlet_new(x, &s_signal); - x->a = 0; - return x; - } - static void sigrifftw_free(t_sigrifftw *x) { - fftwf_destroy_plan(x->plan); - } - static t_int *sigrifftw_perform(t_int *w) { - sigrfftw_invert((t_sample *)w[2],w[3]); - fftwf_execute(*(fftwf_plan*)w[1]); - return w+4; - } static void sigrifftw_dsp(t_sigrifftw *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); --- 2224,2237 ---- float *out1 = sp[1]->v; float *out2 = sp[2]->v; ! if (n < 4) {error("fft: minimum 4 points"); return;} ! x->dim.n=n; ! x->dim.is=1; ! x->dim.os=1; ! x->plan = fftwf_plan_guru_split_dft_r2c(1, &(x->dim), 0, NULL, in, out1, out2, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT); dsp_add(sigrfftw_perform,3,&x->plan,out2+1,n2-1); dsp_add_zero(out1 + n2, n2); dsp_add_zero(out2 + n2, n2); }
static void sigrifftw_dsp(t_sigrifftw *x, t_signal **sp) { int n = sp[0]->n, n2 = (n>>1); *************** *** 2347,2355 **** } } ! static void sigrifftw_setup() { sigrifftw_class = class_new2("rifft~",sigrifftw_new,sigrifftw_free,sizeof(t_sigrifftw),0,""); ! CLASS_MAINSIGNALIN(sigrifftw_class, t_sigrifftw, a); ! class_addmethod2(sigrifftw_class, sigrifftw_dsp, "dsp",""); ! class_sethelpsymbol(sigrifftw_class, gensym("fft~")); } #endif /* HAVE_LIBFFTW3F */ --- 2252,2271 ---- } } ! static void sigfftw_setup() { ! sigfftw_class = class_new2( "fft~",sigfftw_new, sigfftw_free, sizeof(t_sigfftw), 0,""); ! sigifftw_class = class_new2( "ifft~",sigifftw_new, sigifftw_free, sizeof(t_sigfftw), 0,""); ! sigrfftw_class = class_new2( "rfft~",sigrfftw_new, sigrfftw_free, sizeof(t_sigrfftw), 0,""); sigrifftw_class = class_new2("rifft~",sigrifftw_new,sigrifftw_free,sizeof(t_sigrifftw),0,""); ! CLASS_MAINSIGNALIN(sigfftw_class, t_sigfftw, a); ! CLASS_MAINSIGNALIN(sigifftw_class, t_sigfftw, a); ! CLASS_MAINSIGNALIN(sigrfftw_class, t_sigrfftw, a); ! CLASS_MAINSIGNALIN(sigrifftw_class,t_sigrifftw,a); ! class_addmethod2(sigfftw_class, sigfftw_dsp, "dsp",""); ! class_addmethod2(sigifftw_class, sigifftw_dsp, "dsp",""); ! class_addmethod2(sigrfftw_class, sigrfftw_dsp, "dsp",""); ! class_addmethod2(sigrifftw_class, sigrifftw_dsp,"dsp",""); ! class_sethelpsymbol(sigifftw_class, gensym("fft~")); ! class_sethelpsymbol(sigrfftw_class, gensym("fft~")); ! class_sethelpsymbol(sigrifftw_class,gensym("fft~")); } #endif /* HAVE_LIBFFTW3F */ *************** *** 3918,3925 ****
sig_tilde_setup(); ! line_tilde_setup(); ! vline_tilde_setup(); ! snapshot_tilde_setup(); ! vsnapshot_tilde_setup(); env_tilde_setup(); threshold_tilde_setup(); --- 3834,3839 ----
sig_tilde_setup(); ! line_tilde_setup(); snapshot_tilde_setup(); ! vline_tilde_setup(); vsnapshot_tilde_setup(); env_tilde_setup(); threshold_tilde_setup(); *************** *** 3933,3944 ****
sigframp_setup(); ! #ifndef HAVE_LIBFFTW3F ! sigfft_setup(); ! sigrfft_setup(); ! sigrifft_setup(); ! #else sigfftw_setup(); /* added by Tim Blechmann to support fftw */ ! sigrifftw_setup(); ! sigrfftw_setup(); #endif /* HAVE_LIBFFTW3F */
--- 3847,3854 ----
sigframp_setup(); ! #ifdef HAVE_LIBFFTW3F sigfftw_setup(); /* added by Tim Blechmann to support fftw */ ! #else ! sigfft_setup(); #endif /* HAVE_LIBFFTW3F */