diff options
author | Franz Zotter <fzotter@users.sourceforge.net> | 2009-06-17 08:39:06 +0000 |
---|---|---|
committer | Franz Zotter <fzotter@users.sourceforge.net> | 2009-06-17 08:39:06 +0000 |
commit | 243b48abf7922957fc3e0876bf9f12f893a8327f (patch) | |
tree | 49b015b2b8b4941152174c7e1212f1a139f49fe3 /src/mtx_spherical_harmonics.c | |
parent | 8e1cc253f0fd94d792f6bef9f0ac83cb2f41ffac (diff) |
modified the chebyshev12 routine to put out readily normalized circular harmonics and added
[mtx_circular_harmonics] to the file mtx_spherical_harmonics, as well as a corresponding helpfile.
why: useful for circular (1D) ambisonics, e.g. ...
svn path=/trunk/externals/iem/iemmatrix/; revision=11792
Diffstat (limited to 'src/mtx_spherical_harmonics.c')
-rw-r--r-- | src/mtx_spherical_harmonics.c | 121 |
1 files changed, 119 insertions, 2 deletions
diff --git a/src/mtx_spherical_harmonics.c b/src/mtx_spherical_harmonics.c index b0c270a..8ecc9a4 100644 --- a/src/mtx_spherical_harmonics.c +++ b/src/mtx_spherical_harmonics.c @@ -35,7 +35,22 @@ struct _MTXSh_ size_t l; }; -static void allocMTXdata (MTXSh *x) +static t_class *mtx_circular_harmonics_class; + +typedef struct _MTXCh_ MTXCh; +struct _MTXCh_ +{ + t_object x_obj; + t_outlet *list_ch_out; + t_atom *list_ch; + double *phi; + Cheby12WorkSpace *wc; + size_t nmax; + size_t l; +}; + + +static void allocMTXShdata (MTXSh *x) { x->phi=(double*)calloc(x->l,sizeof(double)); x->theta=(double*)calloc(x->l,sizeof(double)); @@ -104,7 +119,7 @@ static void mTXShMatrix (MTXSh *x, t_symbol *s, if (x->l!=columns) { deleteMTXShdata(x); x->l=columns; - allocMTXdata(x); + allocMTXShdata(x); } for (n=0;n<x->l;n++) { x->phi[n]=(double) atom_getfloat(argv+n); @@ -127,6 +142,92 @@ static void mTXShMatrix (MTXSh *x, t_symbol *s, } +static void allocMTXChdata (MTXCh *x) +{ + x->phi=(double*)calloc(x->l,sizeof(double)); + x->wc=chebyshev12_alloc(x->nmax,x->l); + x->list_ch=(t_atom*)calloc(x->l*(2*x->nmax+1)+2,sizeof(t_atom)); +} + +static void deleteMTXChdata (MTXCh *x) +{ + if (x->phi!=0) + free(x->phi); + if (x->list_ch!=0) + free(x->list_ch); + chebyshev12_free(x->wc); + x->wc=0; + x->list_ch=0; + x->phi=0; +} + +static void *newMTXCh (t_symbol *s, int argc, t_atom *argv) +{ + int nmax; + MTXCh *x = (MTXCh *) pd_new (mtx_circular_harmonics_class); + x->list_ch_out = outlet_new (&x->x_obj, gensym("matrix")); + x->list_ch = 0; + x->phi = 0; + x->wc = 0; + x->l=0; + nmax=(int) atom_getfloat(argv); + if (nmax<0) + nmax=0; + x->nmax=nmax; + + return ((void *) x); +} + +static void mTXChBang (MTXCh *x) +{ + if (x->list_ch!=0) { + outlet_anything(x->list_ch_out, gensym("matrix"), x->l*(2*x->nmax+1)+2, x->list_ch); + } +} + +static void mTXChMatrix (MTXCh *x, t_symbol *s, + int argc, t_atom *argv) +{ + int rows = atom_getint (argv++); + int columns = atom_getint (argv++); + int size = rows * columns; + int in_size = argc-2; + int n; + + + /* size check */ + if (!size) + post("mtx_circular_harmonics: invalid dimensions"); + else if (in_size<size) + post("mtx_circular_harmonics: sparse matrix not yet supported: use \"mtx_check\""); + else if ((rows!=1)||(columns<1)) + post("mtx_circular_harmonics: 1 X L matrix expected with phi vector, but got more rows/no entries"); + else { + if (x->l!=columns) { + deleteMTXChdata(x); + x->l=columns; + allocMTXChdata(x); + } + for (n=0;n<x->l;n++) { + x->phi[n]=(double) atom_getfloat(argv+n); + } + + if (x->wc!=0) { + chebyshev12(x->phi, x->wc); + in_size=x->l*(2*x->nmax+1); + SETFLOAT(x->list_ch,(float)x->l); + SETFLOAT(x->list_ch+1,(float)(2*x->nmax+1)); + for (n=0;n<in_size; n++) + SETFLOAT(x->list_ch+n+2,(float)x->wc->t[n]); + mTXChBang(x); + } + else + post("mtx_circular_harmonics: memory error, no operation"); + } + + +} + void mtx_spherical_harmonics_setup (void) { mtx_spherical_harmonics_class = class_new @@ -139,6 +240,22 @@ void mtx_spherical_harmonics_setup (void) class_addmethod (mtx_spherical_harmonics_class, (t_method) mTXShMatrix, gensym("matrix"), A_GIMME,0); } + +void mtx_circular_harmonics_setup (void) +{ + mtx_circular_harmonics_class = class_new + (gensym("mtx_circular_harmonics"), + (t_newmethod) newMTXCh, + (t_method) deleteMTXChdata, + sizeof (MTXCh), + CLASS_DEFAULT, A_GIMME, 0); + class_addbang (mtx_circular_harmonics_class, (t_method) mTXChBang); + class_addmethod (mtx_circular_harmonics_class, (t_method) mTXChMatrix, gensym("matrix"), A_GIMME,0); +} + void iemtx_spherical_harmonics_setup(void){ + mtx_circular_harmonics_setup(); mtx_spherical_harmonics_setup(); } + + |