From 79a083f28e9df04768151c8a916934716b4a2646 Mon Sep 17 00:00:00 2001 From: Richard Knight Date: Mon, 24 Aug 2020 05:20:46 +0100 Subject: initial --- src/windowing.cpp | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 src/windowing.cpp (limited to 'src/windowing.cpp') diff --git a/src/windowing.cpp b/src/windowing.cpp new file mode 100644 index 0000000..bdc7fdf --- /dev/null +++ b/src/windowing.cpp @@ -0,0 +1,208 @@ +#include + +typedef struct _fft { + OPDS h; + ARRAYDAT *out; + ARRAYDAT *in, *in2; + MYFLT *f; + MYFLT b; + int32_t n; + void *setup; + AUXCH mem; +} FFT; + + +static inline void tabinit(CSOUND *csound, ARRAYDAT *p, int size) +{ + size_t ss; + if (p->dimensions==0) { + p->dimensions = 1; + p->sizes = (int32_t*)csound->Malloc(csound, sizeof(int32_t)); + } + if (p->data == NULL) { + CS_VARIABLE* var = p->arrayType->createVariable(csound, NULL); + p->arrayMemberSize = var->memBlockSize; + ss = p->arrayMemberSize*size; + p->data = (MYFLT*)csound->Calloc(csound, ss); + p->allocated = ss; + } else if( (ss = p->arrayMemberSize*size) > p->allocated) { + p->data = (MYFLT*) csound->ReAlloc(csound, p->data, ss); + p->allocated = ss; + } + if (p->dimensions==1) p->sizes[0] = size; + //p->dimensions = 1; +} + +int32_t shiftin_init(CSOUND *csound, FFT *p) { + int32_t sizs = CS_KSMPS; + if(p->out->sizes[0] < sizs) + tabinit(csound, p->out, sizs); + p->n = 0; + return OK; +} + +int32_t shiftin_perf(CSOUND *csound, FFT *p) { + IGN(csound); + uint32_t siz = p->out->sizes[0], n = p->n; + MYFLT *in = ((MYFLT *) p->in); + if (n + CS_KSMPS < siz) { + memcpy(p->out->data+n,in,CS_KSMPS*sizeof(MYFLT)); + } + else { + int32_t num = siz - n; + memcpy(p->out->data+n,in,num*sizeof(MYFLT)); + memcpy(p->out->data,in+num,(CS_KSMPS-num)*sizeof(MYFLT)); + } + p->n = (n + CS_KSMPS)%siz; + return OK; +} + + +int32_t shiftout_init(CSOUND *csound, FFT *p) { + int32_t siz = p->in->sizes[0]; + p->n = ((int32_t)*((MYFLT *)p->in2) % siz); + if (UNLIKELY((uint32_t) siz < CS_KSMPS)) + return csound->InitError(csound, "%s", Str("input array too small\n")); + return OK; +} + +int32_t shiftout_perf(CSOUND *csound, FFT *p) { + IGN(csound); + uint32_t siz = p->in->sizes[0], n = p->n; + MYFLT *out = ((MYFLT *) p->out); + + if (n + CS_KSMPS < siz) { + memcpy(out,p->in->data+n,CS_KSMPS*sizeof(MYFLT)); + } + else { + int32_t num = siz - n; + memcpy(out,p->in->data+n,num*sizeof(MYFLT)); + memcpy(out+num,p->in->data,(CS_KSMPS-num)*sizeof(MYFLT)); + } + p->n = (n + CS_KSMPS)%siz; + return OK; +} + + +struct windowing : csnd::Plugin<1, 1> { + static constexpr char const *otypes = "k[]"; + static constexpr char const *itypes = "k[]"; + FWT fwt; + + int init() { + csnd::Vector &out = outargs.vector_data(0); + csnd::Vector &in = inargs.vector_data(0); + out.init(csound, in.len()); + return OK; + } + + int kperf() { + csnd::Vector &out = outargs.vector_data(0); + csnd::Vector &in = inargs.vector_data(0); + std::copy(in.begin(), in.end(), out.begin()); + fwt.fwtanal(out); + return OK; + } +}; + +int32_t init_window(CSOUND *csound, FFT *p) { + int32_t N = p->in->sizes[0]; + int32_t i,type = (int32_t) *p->f; + MYFLT *w; + tabinit(csound, p->out, N); + if (p->mem.auxp == 0 || p->mem.size < N*sizeof(MYFLT)) + csound->AuxAlloc(csound, N*sizeof(MYFLT), &p->mem); + w = (MYFLT *) p->mem.auxp; + switch(type) { + case 0: + for (i=0; iout->sizes[0], off = *((MYFLT *)p->in2); + MYFLT *in, *out, *w; + in = p->in->data; + out = p->out->data; + w = (MYFLT *) p->mem.auxp; + /*while (off < 0) off += end; + for (i=0;idata==NULL || p->dimensions == 0 || + (p->dimensions==2 && (p->sizes[0] < rows || p->sizes[1] < columns))) { + size_t ss; + if (p->data == NULL) { + CS_VARIABLE* var = p->arrayType->createVariable(csound, NULL); + p->arrayMemberSize = var->memBlockSize; + } + ss = p->arrayMemberSize*rows*columns; + if (p->data==NULL) { + p->data = (MYFLT*)csound->Calloc(csound, ss); + p->dimensions = 2; + p->sizes = (int32_t*)csound->Malloc(csound, sizeof(int32_t)*2); + } + else p->data = (MYFLT*) csound->ReAlloc(csound, p->data, ss); + p->sizes[0] = rows; p->sizes[1] = columns; + } +} +// setrow +int32_t set_rows_init(CSOUND *csound, FFT *p) { + int32_t sizs = p->in->sizes[0]; + int32_t row = *((MYFLT *)p->in2); + tabensure2D(csound, p->out, row+1, sizs); + return OK; +} + +int32_t set_rows_perf(CSOUND *csound, FFT *p) { + int32_t start = *((MYFLT *)p->in2); + if (UNLIKELY(start < 0 || start >= p->out->sizes[0])) + return csound->PerfError(csound, &(p->h), + Str("Error: index out of range\n")); + int32_t bytes = p->in->sizes[0]*sizeof(MYFLT); + start *= p->out->sizes[1]; + memcpy(p->out->data+start,p->in->data,bytes); + return OK; +} + + +// getrow +int32_t rows_init(CSOUND *csound, FFT *p) { + if (p->in->dimensions == 2) { + int32_t siz = p->in->sizes[1]; + tabinit(csound, p->out, siz); + return OK; + } + else + return csound->InitError(csound, "%s", + Str("in array not 2-dimensional\n")); +} + +int32_t rows_perf(CSOUND *csound, FFT *p) { + int32_t start = *((MYFLT *)p->in2); + if (LIKELY(start < p->in->sizes[0])) { + int32_t bytes = p->in->sizes[1]*sizeof(MYFLT); + start *= p->in->sizes[1]; + memcpy(p->out->data,p->in->data+start,bytes); + return OK; + } + else return csound->PerfError(csound, &(p->h), + Str("requested row is out of range\n")); +} \ No newline at end of file -- cgit v1.2.3