Update of /cvsroot/pure-data/externals/postlude/flib/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28768/src
Modified Files: cross~.c flib.h Log Message: Added frequency domain correlation to cross~
Index: flib.h =================================================================== RCS file: /cvsroot/pure-data/externals/postlude/flib/src/flib.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** flib.h 7 Apr 2006 20:11:49 -0000 1.2 --- flib.h 19 Apr 2006 17:48:38 -0000 1.3 *************** *** 22,26 **** #include <string.h>
! #define VERSION "0.8"
void sc_tilde_setup(void); --- 22,26 ---- #include <string.h>
! #define VERSION "0.82"
void sc_tilde_setup(void);
Index: cross~.c =================================================================== RCS file: /cvsroot/pure-data/externals/postlude/flib/src/cross~.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** cross~.c 7 Apr 2006 20:11:49 -0000 1.3 --- cross~.c 19 Apr 2006 17:48:38 -0000 1.4 *************** *** 18,23 ****
! /*Calculate the (non optimized) cross correlation of two signal vectors*/ ! /*Based on code by Phil Bourke */
--- 18,29 ----
! /*Calculate the cross correlation of two signal vectors*/ ! ! /*The time domain implementation is based on code by Phil Bourke ! * the frequency domain version is based on code by Charles Henry ! * ! * Specify a time delay as an argument for the time domain implemenation, for example an argument of 32 will give the correlation coefficients for delays from -32 to 32 samples between the two input vectors ! * ! * Specify an argument of 'f' for the frequency domain implementation*/
*************** *** 31,37 **** t_float f; t_int delay; } t_cross;
! static t_int *cross_perform(t_int *w) { t_sample *x = (t_sample *)(w[1]); --- 37,44 ---- t_float f; t_int delay; + t_int is_freq_domain; } t_cross;
! static t_int *cross_perform_time_domain(t_int *w) { t_sample *x = (t_sample *)(w[1]); *************** *** 46,55 **** maxdelay = N * .5; post("cross~: invalid maxdelay, must be <= blocksize/2"); - } - else if (!maxdelay){ - maxdelay = N * .5; }
! /* Calculate the mean of the two series x[], y[] */ mx = 0; my = 0; --- 53,59 ---- maxdelay = N * .5; post("cross~: invalid maxdelay, must be <= blocksize/2"); }
! /* Calculate the mean of the two series x[], y[] */ mx = 0; my = 0; *************** *** 93,106 **** }
static void cross_dsp(t_cross *x, t_signal **sp) { ! dsp_add(cross_perform, 5, ! sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n, x->delay); }
! static void *cross_new(t_floatarg f) { t_cross *x = (t_cross *)pd_new(cross_class); ! x->delay = (t_int)f; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); --- 97,184 ---- }
+ + t_int *cross_perform_freq_domain(t_int *w) + { + t_cross *x = (t_cross *)(w[1]); + + t_sample *sig1 = (t_sample *)(w[2]); + t_sample *sig2 = (t_sample *)(w[3]); + t_sample *out = (t_sample *)(w[4]); + long int size = (long int) w[5]; + long int k = size/2; + float *expsig1 = NULL; + float *revsig2 = NULL; + float temp, temp2; + long int i=0; + int well_defined=1; + int qtr, thrqtr; + + // The two signals are created, nonzero on 0 to N/4 and 3N/4 to N + // This will be revised + + expsig1=(float *) alloca(size*sizeof(float)); + revsig2=(float *) alloca(size*sizeof(float)); + qtr = size/4; + thrqtr = 3*size/4; + for (i=0; i < qtr ; i++) + { + expsig1[i]=sig1[i]; + revsig2[i]=0; + } + for (i=qtr; i < thrqtr ; i++) + { + expsig1[i]=sig1[i]; + revsig2[i]=sig2[size-i]; + } + for (i=thrqtr; i < size ; i++) + { + expsig1[i]=sig1[i]; + revsig2[i]=0; + } + + mayer_realfft(size, expsig1); + mayer_realfft(size, revsig2); + expsig1[0]*=revsig2[0]; + expsig1[k]*=revsig2[k]; + for(i=1; i < k; i++) + { + temp=expsig1[i]; + temp2=expsig1[size-i]; + expsig1[i]=temp*revsig2[i]-temp2*revsig2[size-i]; + expsig1[size-i]=temp*revsig2[size-i]+temp2*revsig2[i]; + } + + mayer_realifft(size, expsig1); + for(i=0; i < size; i++) + { + out[i]=expsig1[i]; + } + + return(w+6); + + } + static void cross_dsp(t_cross *x, t_signal **sp) { ! if(!x->is_freq_domain) ! dsp_add(cross_perform_time_domain, 5, ! sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n, x->delay); ! else ! dsp_add(cross_perform_freq_domain, 5, x, ! sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); }
! static void *cross_new(t_symbol *s, t_int argc, t_atom *argv) { t_cross *x = (t_cross *)pd_new(cross_class); ! ! if(atom_getsymbol(argv) == gensym("f")){ ! x->is_freq_domain = 1; ! post("flib: cross: Frequency domain selected"); ! } ! else { ! x->delay = atom_getfloat(argv); ! post("flib: cross: Time domain selected"); ! } inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); *************** *** 113,117 **** (t_newmethod)cross_new, 0, sizeof(t_cross), ! CLASS_DEFAULT, A_DEFFLOAT, 0);
class_addmethod(cross_class, --- 191,195 ---- (t_newmethod)cross_new, 0, sizeof(t_cross), ! CLASS_DEFAULT, A_GIMME, 0);
class_addmethod(cross_class,