aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Bullock <postlude@users.sourceforge.net>2006-08-25 15:49:30 +0000
committerJamie Bullock <postlude@users.sourceforge.net>2006-08-25 15:49:30 +0000
commit8d697ba21f076ce500a190dca638cf80455c1214 (patch)
treefb4793176570dad085b2ef0b4b6b37dbb40b2d2f
parentf3249f0b1076fb77b7c815606c6007e26198bb25 (diff)
Corrected freq domain cc~ (provided by Charles Henry)
svn path=/trunk/externals/postlude/; revision=5739
-rw-r--r--flib/src/cc~.c140
-rw-r--r--flib/src/flib.h2
2 files changed, 84 insertions, 58 deletions
diff --git a/flib/src/cc~.c b/flib/src/cc~.c
index da2d50b..4c58abe 100644
--- a/flib/src/cc~.c
+++ b/flib/src/cc~.c
@@ -30,7 +30,10 @@
* 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 */
-#include "flib.h"
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <m_pd.h>
#define SQ(a) (a * a)
static t_class *cc_class;
@@ -40,9 +43,9 @@ typedef struct _cc {
t_float f;
t_int delay;
t_int is_freq_domain;
- t_float *buffer2Nsig1, *buffer2Nsig2;
+ t_float *bufferNsig1, *bufferNsig2;
t_float *output_prev_block;
- t_int is_new;
+ t_int is_new_or_rszd;
t_int n;
} t_cc;
@@ -112,102 +115,124 @@ static t_int *cc_perform_freq_domain(t_int *w)
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_int thrhalf = 3*half;
t_float *expsig1 = NULL;
t_float *revsig2 = NULL;
t_float temp, temp2;
t_int i=0;
- t_int thrhalf;
+ 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)
+ if (x->is_new_or_rszd)
{
- 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];
+ 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, 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));
+// 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
-// 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;
+ expsig1[i]=x->bufferNsig1[i];
+ revsig2[i]=0.0;
}
for (i=half; i < size ; i++)
{
- expsig1[i]=x->buffer2Nsig1[i];
- revsig2[i]=sig2[size-i]; /// Needs revision here, not too clear
+ expsig1[i]=x->bufferNsig1[i];
+ revsig2[i]=sig2[size-i];
}
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];
+ revsig2[i]=x->bufferNsig2[size2-i];
}
for (i=thrhalf; i < size2 ; i++)
{
expsig1[i]=sig1[i-size];
- revsig2[i]=0;
+ 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 < size2; i++)
+
+
+ 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]=temp*revsig2[size2-i]+temp2*revsig2[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++)
+ if (x->is_freq_domain == 1)
{
- out[i]=expsig1[i]/size2;
- out[half + i]=expsig1[half + i]/size2;
+ 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++)
+ else
{
- 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];
+ 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(float));
-freebytes(revsig2, size2*sizeof(float));
+ freebytes(expsig1, size2*sizeof(t_float));
+ freebytes(revsig2, size2*sizeof(t_float));
return(w+6);
-
}
static void cc_dsp(t_cc *x, t_signal **sp)
@@ -249,21 +274,21 @@ static void *cc_new(t_symbol *s, t_int argc, t_atom *argv)
}
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->is_new_or_rszd=1;
+ x->bufferNsig1=NULL;
+ x->bufferNsig2=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->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(float));
+ freebytes(x->output_prev_block, x->n*sizeof(t_float));
}
@@ -280,3 +305,4 @@ void cc_tilde_setup(void) {
class_sethelpsymbol(cc_class, gensym("help-flib"));
}
+
diff --git a/flib/src/flib.h b/flib/src/flib.h
index 4e93d2e..3efd649 100644
--- a/flib/src/flib.h
+++ b/flib/src/flib.h
@@ -21,7 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <stdlib.h>
#include <string.h>
-#define VERSION "0.83"
+#define VERSION "0.84"
void sc_tilde_setup(void);
void ss_tilde_setup(void);