[PD-cvs] externals/postlude/flib/src cc~.c, 1.1, 1.2 flib.h, 1.4, 1.5 irreg~.c, 1.1.1.1, 1.2 sfm~.c, 1.1.1.1, 1.2 ss~.c, 1.1.1.1, 1.2

Jamie Bullock postlude at users.sourceforge.net
Tue May 30 15:42:26 CEST 2006


Update of /cvsroot/pure-data/externals/postlude/flib/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29408/flib/src

Modified Files:
	cc~.c flib.h irreg~.c sfm~.c ss~.c 
Log Message:
New checkin after sf upgrade


Index: cc~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/cc~.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** cc~.c	19 Apr 2006 18:00:40 -0000	1.1
--- cc~.c	30 May 2006 13:42:23 -0000	1.2
***************
*** 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*/
  
  
--- 18,32 ----
  
  
! /*Calculate the cc 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,   
!  * or 'r' for the running cross covariance (not normalized)              instead of the numerical delay argument
!  * these two methods both have got positive delays on 0,N/2-1 and the negative delays (-N/2, -1) are indexed on N/2,N-1 */
  
  
***************
*** 31,44 ****
  #define SQ(a) (a * a)
  
! static t_class *cross_class;
  
! typedef struct _cross {
      t_object  x_obj;
      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]);
--- 34,51 ----
  #define SQ(a) (a * a)
  
! static t_class *cc_class;
  
! typedef struct _cc {
      t_object  x_obj;
      t_float f;
      t_int delay;
      t_int is_freq_domain;
!     t_float *buffer2Nsig1, *buffer2Nsig2;
!     t_float *output_prev_block;
!     t_int is_new;
!     t_int n;
! } t_cc;
  
! static t_int *cc_perform_time_domain(t_int *w)
  {
      t_sample *x = (t_sample *)(w[1]);
***************
*** 52,56 ****
     if(maxdelay > N * .5){
  	maxdelay = N * .5;
! 	post("cross~: invalid maxdelay, must be <= blocksize/2");
     }
   
--- 59,63 ----
     if(maxdelay > N * .5){
  	maxdelay = N * .5;
! 	post("cc~: invalid maxdelay, must be <= blocksize/2");
     }
   
***************
*** 98,199 ****
  
  
! 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);
      return (void *)x;
  }
  
  
! void cross_tilde_setup(void) {
!     cross_class = class_new(gensym("cross~"),
! 	    (t_newmethod)cross_new,
! 	    0, sizeof(t_cross),
  	    CLASS_DEFAULT, A_GIMME, 0);
  
!     class_addmethod(cross_class,
! 	    (t_method)cross_dsp, gensym("dsp"), 0);
!     CLASS_MAINSIGNALIN(cross_class, t_cross,f);
!     class_sethelpsymbol(cross_class, gensym("help-flib"));
  }
--- 105,282 ----
  
  
! static t_int *cc_perform_freq_domain(t_int *w)
  {
!   t_cc *x = (t_cc *)(w[1]);
  
    t_sample *sig1 = (t_sample *)(w[2]);
    t_sample *sig2 = (t_sample *)(w[3]);
    t_sample *out  = (t_sample *)(w[4]);
!   t_int size  = (int) w[5];
!   x->n = size;
!   t_int size2 = size*2;
!   t_int half = size/2;
!   t_float *expsig1 = NULL;
!   t_float *revsig2 = NULL;
!   t_float temp, temp2;
!   t_int i=0;
!   t_int thrhalf;
  
! // This stuff here sets up two buffers to hold the previous N samples
! // To get the usual overlapping block (2) design on each input
  
!   if (x->is_new)
    {
!     x->buffer2Nsig1=getbytes(size*sizeof(t_float));    
!     x->buffer2Nsig2=getbytes(size*sizeof(t_float));
!     x->output_prev_block=getbytes(size*sizeof(t_float));        
!     x->is_new=0;
!   }
! //  Here we set the buffers for the next round
!   for(i=half; i < size; i++)
!  {
!     x->buffer2Nsig1[i]=sig1[i];
!     x->buffer2Nsig2[i]=sig2[i];
!   }
! // The two signals are created, nonzero on 0 to 1/4 and 3/4 to 1
! // Using a block size of 2N, --size2
! 
!   expsig1=(float *) getbytes(size2*sizeof(float));
!   revsig2=(float *) getbytes(size2*sizeof(float));
! 
! // Loops for assignment of old values in buffer + new block
!   thrhalf = 3*half;
!   for (i=0; i < half ; i++)
!   {
!     expsig1[i]=x->buffer2Nsig1[i];
      revsig2[i]=0;
    }
!   for (i=half; i < size ; i++)
    {
!     expsig1[i]=x->buffer2Nsig1[i];
!     revsig2[i]=sig2[size-i];            /// Needs revision here, not too clear
    }
!   expsig1[size]=sig1[0];
!   revsig2[size]=sig2[0];
!   for (i=size+1; i < thrhalf ; i++)
    {
!     expsig1[i]=sig1[i-size];
!     revsig2[i]=x->buffer2Nsig2[size2-i];
!   }
!   for (i=thrhalf; i < size2 ; i++)
!   {
!     expsig1[i]=sig1[i-size];
      revsig2[i]=0;
    }
  
! //  fft the two blocks and multiply them
!   mayer_realfft(size2, expsig1);
!   mayer_realfft(size2, revsig2);
! 
    expsig1[0]*=revsig2[0];
!   expsig1[size]*=revsig2[size];
!   for(i=1; i < size2; i++)  
    {
      temp=expsig1[i];
!     temp2=expsig1[size2-i];
!     expsig1[i]=temp*revsig2[i]-temp2*revsig2[size2-i];
!     expsig1[size2-i]=temp*revsig2[size2-i]+temp2*revsig2[i];
    }
    
! //  ifft
!   mayer_realifft(size2, expsig1);
! 
! //  format the output:  this section formats the ouptut either as
! //  a simple cc or as a running cc
! if (x->is_freq_domain == 1)
! {
!   for(i=0; i < half; i++)
    {
!     out[i]=expsig1[i]/size2;
!     out[half + i]=expsig1[half + i]/size2;
    }
+ } else {
+   for(i=0; i < half; i++)
+   {
+     out[i]=x->output_prev_block[i] + expsig1[i]/size2;
+     out[half + i]=x->output_prev_block[half + i] + expsig1[half + i]/size2;
+     x->output_prev_block[i] = out[i];
+     x->output_prev_block[half + i] = out[half + i];
+   }
+ }
  
+ freebytes(expsig1, size2*sizeof(float));
+ freebytes(revsig2, size2*sizeof(float));
    return(w+6);
  
  }
  
! static void cc_dsp(t_cc *x, t_signal **sp)
  {
      if(!x->is_freq_domain)
! 	dsp_add(cc_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(cc_perform_freq_domain, 5, x,
  		sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
  }
  
! 
! //  For using with running calculation, send a bang to clear the buffer
! //  and start over with calculations
! 
! static void cc_bang(t_cc *x)
  {
!   int i;
!   for(i=0;i<x->n;i++)
!     x->output_prev_block[i]=0;
! }
! 
  
+ static void *cc_new(t_symbol *s, t_int argc, t_atom *argv)
+ {
+     t_cc *x = (t_cc *)pd_new(cc_class);
      if(atom_getsymbol(argv) == gensym("f")){
  	    x->is_freq_domain = 1;
! 	    post("flib: cc: Frequency domain selected");
!     }
!     else if(atom_getsymbol(argv) == gensym("r")){
! 	    x->is_freq_domain = 2;
! 	    post("flib: cc: Running frequency domain selected");
      }
      else {
  	x->delay = atom_getfloat(argv);
! 	post("flib: cc: Time domain selected");
      } 
      inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
      outlet_new(&x->x_obj, &s_signal);
+     x->is_new=1;
+     x->buffer2Nsig1=NULL;
+     x->buffer2Nsig2=NULL;
+     x->output_prev_block=NULL;
      return (void *)x;
  }
  
+ static void cc_free(t_cc *x)
+ {
+   if     (x->buffer2Nsig1 != NULL)
+     freebytes(x->buffer2Nsig1, x->n*sizeof(float));
+   if     (x->buffer2Nsig2 != NULL)
+     freebytes(x->buffer2Nsig2, x->n*sizeof(float));
+   if     (x->output_prev_block != NULL)
+     freebytes(x->output_prev_block, x->n*sizeof(float));
+ }
+ 
  
! void cc_tilde_setup(void) {
!     cc_class = class_new(gensym("cc~"),
! 	    (t_newmethod)cc_new,
! 	    (t_method)cc_free, sizeof(t_cc),
  	    CLASS_DEFAULT, A_GIMME, 0);
  
!     class_addbang(cc_class, (t_method)cc_bang);
!     class_addmethod(cc_class,
! 	    (t_method)cc_dsp, gensym("dsp"), 0);
!     CLASS_MAINSIGNALIN(cc_class, t_cc,f);
!     class_sethelpsymbol(cc_class, gensym("help-flib"));
  }
+ 

Index: sfm~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/sfm~.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** sfm~.c	10 Jan 2006 11:49:01 -0000	1.1.1.1
--- sfm~.c	30 May 2006 13:42:23 -0000	1.2
***************
*** 19,23 ****
  
  
! /* calculates spectral flatness measure as described by Tae Hong Park*/
  
  #include "m_pd.h"
--- 19,23 ----
  
  
! /* calculates spectral flatness measure: Geometric Mean/ Arithemtic Mean (In this case converted to a DB scale */
  
  #include "m_pd.h"

Index: irreg~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/irreg~.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** irreg~.c	10 Jan 2006 11:49:01 -0000	1.1.1.1
--- irreg~.c	30 May 2006 13:42:23 -0000	1.2
***************
*** 19,23 ****
  
  
! /* calculates the spectral irreg of one frame according to Jensen et al 1999*/
  
  #include "flib.h"
--- 19,23 ----
  
  
! /* calculates the spectral irreg of one frame according to Jensen  1999. Original formula by Krimphoff et al 1994*/
  
  #include "flib.h"

Index: ss~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/ss~.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** ss~.c	10 Jan 2006 11:49:01 -0000	1.1.1.1
--- ss~.c	30 May 2006 13:42:23 -0000	1.2
***************
*** 19,23 ****
  
  
! /* calculates the spectral smoothness of one frame according to Krimphoff et al. 1994*/
  
  #include "flib.h"
--- 19,23 ----
  
  
! /* calculates the spectral smoothness of one frame according to McAdams 1999. Takes magnitude spectrum as input*/
  
  #include "flib.h"
***************
*** 36,42 ****
    t_float I = 0, buf[M];
    for(n = 0; n < M; buf[n++] = *in++);
!   for(n = 2; n < M - 1; n++){
  	  if(buf[n] != 0 && buf[n-1] != 0 && buf[n+1] != 0)
! 		  I += (buf[n] - (buf[n-1] + buf[n] + buf[n+1]) / 3);
    }
  
--- 36,42 ----
    t_float I = 0, buf[M];
    for(n = 0; n < M; buf[n++] = *in++);
!   for(n = 2; n < M - 1; n++){ 
  	  if(buf[n] != 0 && buf[n-1] != 0 && buf[n+1] != 0)
! 		  I += (20 * log10(buf[n]) - (20 * log10(buf[n-1]) + 20 * log10(buf[n]) + 20 * log10(buf[n+1])) / 3);
    }
  

Index: flib.h
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/flib.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** flib.h	19 Apr 2006 18:00:40 -0000	1.4
--- flib.h	30 May 2006 13:42:23 -0000	1.5
***************
*** 22,26 ****
  #include <string.h>
  
! #define VERSION "0.82"
  
  void sc_tilde_setup(void);
--- 22,26 ----
  #include <string.h>
  
! #define VERSION "0.83"
  
  void sc_tilde_setup(void);





More information about the Pd-cvs mailing list