Update of /cvsroot/pure-data/externals/postlude/flib/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29337
Modified Files:
cc~.c flib.h
Log Message:
Corrected freq domain cc~ (provided by Charles Henry)
Index: flib.h
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/flib.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** flib.h 30 May 2006 13:42:23 -0000 1.5
--- flib.h 25 Aug 2006 15:49:30 -0000 1.6
***************
*** 22,26 ****
#include <string.h>
! #define VERSION "0.83"
void sc_tilde_setup(void);
--- 22,26 ----
#include <string.h>
! #define VERSION "0.84"
void sc_tilde_setup(void);
Index: cc~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/postlude/flib/src/cc~.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** cc~.c 30 May 2006 13:42:23 -0000 1.2
--- cc~.c 25 Aug 2006 15:49:29 -0000 1.3
***************
*** 31,35 ****
! #include "flib.h"
#define SQ(a) (a * a)
--- 31,38 ----
! #include <math.h>
! #include <stdlib.h>
! #include <stdio.h>
! #include <m_pd.h>
#define SQ(a) (a * a)
***************
*** 41,47 ****
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;
--- 44,50 ----
t_int delay;
t_int is_freq_domain;
! t_float *bufferNsig1, *bufferNsig2;
t_float *output_prev_block;
! t_int is_new_or_rszd;
t_int n;
} t_cc;
***************
*** 113,158 ****
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];
--- 116,176 ----
t_sample *out = (t_sample *)(w[4]);
t_int size = (int) w[5];
t_int size2 = size*2;
t_int half = size/2;
+ t_int thrhalf = 3*half;
t_float *expsig1 = NULL;
t_float *revsig2 = NULL;
t_float temp, temp2;
t_int i=0;
+ if (x->n!=size)
+ {
+ x->n = size;
+ x->is_new_or_rszd=1;
+ }
+
// 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_or_rszd)
{
! if (x->bufferNsig1!=NULL)
! {
! freebytes(x->bufferNsig1,size*sizeof(t_float));
! freebytes(x->bufferNsig2,size*sizeof(t_float));
! freebytes(x->output_prev_block,size*sizeof(t_float));
! }
! x->bufferNsig1=getbytes(size*sizeof(t_float));
! x->bufferNsig2=getbytes(size*sizeof(t_float));
! x->output_prev_block=getbytes(size*sizeof(t_float));
! for(i=0; i<size; i++)
! {
! x->bufferNsig1[i]=0;
! x->bufferNsig2[i]=0;
! x->output_prev_block[i]=0;
! }
! x->is_new_or_rszd=0;
}
! // The two signals are created, using a block size of 2N, --size2
! // expsig1 is the expanded signal1 x->bufferNsig1 + sig1
! // revsig2 is the reversed signal2 (reversed about i=0)
! // it is made 0.0 on 0 to half and thrhalf to size2
!
!
! expsig1=(t_float *) getbytes(size2*sizeof(t_float));
! revsig2=(t_float *) getbytes(size2*sizeof(t_float));
!
! // Loops for assignment of old values in new block + buffer
for (i=0; i < half ; i++)
{
! expsig1[i]=x->bufferNsig1[i];
! revsig2[i]=0.0;
}
for (i=half; i < size ; i++)
{
! expsig1[i]=x->bufferNsig1[i];
! revsig2[i]=sig2[size-i];
}
expsig1[size]=sig1[0];
***************
*** 161,212 ****
{
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);
-
}
--- 179,237 ----
{
expsig1[i]=sig1[i-size];
! revsig2[i]=x->bufferNsig2[size2-i];
}
for (i=thrhalf; i < size2 ; i++)
{
expsig1[i]=sig1[i-size];
! revsig2[i]=0.0;
! }
! // Here we set the buffers for the next round
! for(i=0; i < size; i++)
! {
! x->bufferNsig1[i]=(t_float) sig1[i];
! x->bufferNsig2[i]=(t_float) sig2[i];
}
// 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 < size; i++)
{
temp=expsig1[i];
temp2=expsig1[size2-i];
expsig1[i]=temp*revsig2[i]-temp2*revsig2[size2-i];
! expsig1[size2-i]=-1.0*(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[thrhalf+i]/size2;
! out[half + i]=expsig1[i]/size2;
! }
}
! else
{
! for(i=0; i < half; i++)
! {
! out[i]=x->output_prev_block[i] + expsig1[thrhalf+i]/size2;
! out[half + i]=x->output_prev_block[half + i] + expsig1[i]/size2;
! x->output_prev_block[i] = out[i];
! x->output_prev_block[half + i] = out[half + i];
! }
}
! freebytes(expsig1, size2*sizeof(t_float));
! freebytes(revsig2, size2*sizeof(t_float));
return(w+6);
}
***************
*** 250,256 ****
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;
--- 275,281 ----
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
outlet_new(&x->x_obj, &s_signal);
! x->is_new_or_rszd=1;
! x->bufferNsig1=NULL;
! x->bufferNsig2=NULL;
x->output_prev_block=NULL;
return (void *)x;
***************
*** 259,268 ****
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));
}
--- 284,293 ----
static void cc_free(t_cc *x)
{
! if (x->bufferNsig1 != NULL)
! freebytes(x->bufferNsig1, x->n*sizeof(t_float));
! if (x->bufferNsig2 != NULL)
! freebytes(x->bufferNsig2, x->n*sizeof(t_float));
if (x->output_prev_block != NULL)
! freebytes(x->output_prev_block, x->n*sizeof(t_float));
}
***************
*** 281,282 ****
--- 306,308 ----
}
+