aboutsummaryrefslogtreecommitdiff
path: root/src/mtx_rowrfft.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mtx_rowrfft.c')
-rw-r--r--src/mtx_rowrfft.c142
1 files changed, 63 insertions, 79 deletions
diff --git a/src/mtx_rowrfft.c b/src/mtx_rowrfft.c
index e7f0551..763003c 100644
--- a/src/mtx_rowrfft.c
+++ b/src/mtx_rowrfft.c
@@ -20,12 +20,8 @@ typedef struct _MTXRowrfft_ MTXRowrfft;
struct _MTXRowrfft_
{
t_object x_obj;
- int rows;
- int columns;
- int columns_re;
int size;
int size2;
- t_float renorm_fac;
t_float *f_re;
t_float *f_im;
@@ -37,31 +33,32 @@ struct _MTXRowrfft_
t_atom *list_im;
};
-static void deleteMTXRowrfft (MTXRowrfft *mtx_rowrfft_obj)
+static void deleteMTXRowrfft (MTXRowrfft *x)
{
- if (mtx_rowrfft_obj->f_re)
- freebytes (mtx_rowrfft_obj->f_re, sizeof(t_float)*mtx_rowrfft_obj->size);
- if (mtx_rowrfft_obj->f_im)
- freebytes (mtx_rowrfft_obj->f_im, sizeof(t_float)*mtx_rowrfft_obj->size);
- if (mtx_rowrfft_obj->list_re)
- freebytes (mtx_rowrfft_obj->list_re, sizeof(t_atom)*(mtx_rowrfft_obj->size2+2));
- if (mtx_rowrfft_obj->list_im)
- freebytes (mtx_rowrfft_obj->list_im, sizeof(t_atom)*(mtx_rowrfft_obj->size2+2));
+ free (x->f_re);
+ free (x->f_im);
+ free (x->list_re);
+ free (x->list_im);
}
static void *newMTXRowrfft (t_symbol *s, int argc, t_atom *argv)
{
- MTXRowrfft *mtx_rowrfft_obj = (MTXRowrfft *) pd_new (mtx_rowrfft_class);
- mtx_rowrfft_obj->list_re_out = outlet_new (&mtx_rowrfft_obj->x_obj, gensym("matrix"));
- mtx_rowrfft_obj->list_im_out = outlet_new (&mtx_rowrfft_obj->x_obj, gensym("matrix"));
- return ((void *) mtx_rowrfft_obj);
+ MTXRowrfft *x = (MTXRowrfft *) pd_new (mtx_rowrfft_class);
+ x->list_re_out = outlet_new (&x->x_obj, gensym("matrix"));
+ x->list_im_out = outlet_new (&x->x_obj, gensym("matrix"));
+
+ x->size=x->size2=0;
+ x->f_re=x->f_im=0;
+ x->list_re=x->list_im=0;
+
+ return ((void *) x);
}
-static void mTXrowrfftBang (MTXRowrfft *mtx_rowrfft_obj)
+static void mTXrowrfftBang (MTXRowrfft *x)
{
- if (mtx_rowrfft_obj->list_im) {
- outlet_anything(mtx_rowrfft_obj->list_im_out, gensym("matrix"), mtx_rowrfft_obj->size2+2, mtx_rowrfft_obj->list_im);
- outlet_anything(mtx_rowrfft_obj->list_re_out, gensym("matrix"), mtx_rowrfft_obj->size2+2, mtx_rowrfft_obj->list_re);
+ if (x->list_im) {
+ outlet_anything(x->list_im_out, gensym("matrix"), x->size2, x->list_im);
+ outlet_anything(x->list_re_out, gensym("matrix"), x->size2, x->list_re);
}
}
@@ -98,93 +95,80 @@ static void readFloatFromList (int n, t_atom *l, t_float *f)
*f++ = atom_getfloat (l++);
}
-static void mTXrowrfftMatrix (MTXRowrfft *mtx_rowrfft_obj, t_symbol *s,
+static void mTXrowrfftMatrix (MTXRowrfft *x, t_symbol *s,
int argc, t_atom *argv)
{
- //mTXrowrfftList (mtx_rowrfft_obj, s, argc-2, argv+2);
+ //mTXrowrfftList (x, s, argc-2, argv+2);
int rows = atom_getint (argv++);
int columns = atom_getint (argv++);
- int columns_re = (columns>>1)+1;
+ int columns_re = (columns>>1);
int size = rows * columns;
int in_size = argc-2;
- int size2 = columns_re * rows;
+ int size2 = columns_re * rows + 2; /* +2 since the list also contains matrix row+col */
int fft_count;
- t_atom *ptr_re = mtx_rowrfft_obj->list_re;
- t_atom *ptr_im = mtx_rowrfft_obj->list_im;
- t_float *f_re = mtx_rowrfft_obj->f_re;
- t_float *f_im = mtx_rowrfft_obj->f_im;
+ t_atom *list_re = x->list_re;
+ t_atom *list_im = x->list_im;
+ t_float *f_re = x->f_re;
+ t_float *f_im = x->f_im;
// fftsize check
if (!size)
post("mtx_rowrfft: invalid dimensions");
else if (in_size<size)
post("mtx_rowrfft: sparse matrix not yet supported: use \"mtx_check\"");
+ else if (columns < 4){
+ post("mtx_rowrfft: matrix must have at least 4 columns");
+ }
else if (columns == (1 << ilog2(columns))) {
+ /* ok, do the FFT! */
+
// memory things
- if (f_re) {
- if (size != mtx_rowrfft_obj->size) {
- f_re = (t_float *) resizebytes (f_re,
- sizeof (t_float) * mtx_rowrfft_obj->size,
- sizeof (t_float) * size);
- f_im = (t_float *) resizebytes (f_im,
- sizeof (t_float) * mtx_rowrfft_obj->size,
- sizeof (t_float) * size);
- ptr_re = (t_atom *) resizebytes (ptr_re,
- sizeof (t_atom) * (mtx_rowrfft_obj->size2+2),
- sizeof (t_atom) * (size2 + 2));
- ptr_im = (t_atom *) resizebytes (ptr_im,
- sizeof (t_atom) * (mtx_rowrfft_obj->size2+2),
- sizeof (t_atom) * (size2 + 2));
- }
- }
- else {
- f_re = (t_float *) getbytes (sizeof (t_float) * size);
- f_im = (t_float *) getbytes (sizeof (t_float) * size);
- ptr_re = (t_atom *) getbytes (sizeof (t_atom) * (size2+2));
- ptr_im = (t_atom *) getbytes (sizeof (t_atom) * (size2+2));
- }
- mtx_rowrfft_obj->size = size;
- mtx_rowrfft_obj->size2 = size2;
- mtx_rowrfft_obj->rows = rows;
- mtx_rowrfft_obj->columns = columns;
- mtx_rowrfft_obj->columns_re = columns_re;
- mtx_rowrfft_obj->list_im = ptr_im;
- mtx_rowrfft_obj->list_re = ptr_re;
- mtx_rowrfft_obj->f_re = f_re;
- mtx_rowrfft_obj->f_im = f_im;
-
+ f_re=(t_float*)realloc(f_re, sizeof(t_float)*size);
+ f_im=(t_float*)realloc(f_im, sizeof(t_float)*size);
+ list_re=(t_atom*)realloc(list_re, sizeof(t_atom)*size2);
+ list_im=(t_atom*)realloc(list_im, sizeof(t_atom)*size2);
+
+ x->size = size;
+ x->size2 = size2;
+ x->list_im = list_im;
+ x->list_re = list_re;
+ x->f_re = f_re;
+ x->f_im = f_im;
+
// main part
readFloatFromList (size, argv, f_re);
fft_count = rows;
- ptr_re += 2;
- ptr_im += 2;
+ list_re += 2;
+ list_im += 2;
while (fft_count--){
mayer_realfft (columns, f_re);
fftRestoreImag (columns, f_re, f_im);
- writeFloatIntoList (columns_re, ptr_re, f_re);
- writeFloatIntoList (columns_re, ptr_im, f_im);
+ writeFloatIntoList (columns_re, list_re, f_re);
+ writeFloatIntoList (columns_re, list_im, f_im);
f_im += columns;
f_re += columns;
- ptr_re += columns_re;
- ptr_im += columns_re;
+ list_re += columns_re;
+ list_im += columns_re;
}
- ptr_re = mtx_rowrfft_obj->list_re;
- ptr_im = mtx_rowrfft_obj->list_im;
+
+ list_re = x->list_re;
+ list_im = x->list_im;
- SETSYMBOL(ptr_re, gensym("matrix"));
- SETSYMBOL(ptr_im, gensym("matrix"));
- SETFLOAT(ptr_re, rows);
- SETFLOAT(ptr_im, rows);
- SETFLOAT(&ptr_re[1], columns_re);
- SETFLOAT(&ptr_im[1], columns_re);
- outlet_anything(mtx_rowrfft_obj->list_im_out, gensym("matrix"),
- mtx_rowrfft_obj->size2+2, ptr_im);
- outlet_anything(mtx_rowrfft_obj->list_re_out, gensym("matrix"),
- mtx_rowrfft_obj->size2+2, ptr_re);
+ SETSYMBOL(list_re, gensym("matrix"));
+ SETSYMBOL(list_im, gensym("matrix"));
+ SETFLOAT(list_re, rows);
+ SETFLOAT(list_im, rows);
+ SETFLOAT(list_re+1, columns_re);
+ SETFLOAT(list_im+1, columns_re);
+ outlet_anything(x->list_im_out, gensym("matrix"),
+ x->size2, list_im);
+ outlet_anything(x->list_re_out, gensym("matrix"),
+ x->size2, list_re);
}
else
post("mtx_rowfft: rowvector size no power of 2!");
+
}
void mtx_rowrfft_setup (void)