Mercurial > hg > emotion-detection-top-level
diff Code/Descriptors/yin/private/src/interp_inplace.c @ 0:ea0c737c6323
first commit
author | Dawn Black <dawn.black@eecs.qmul.ac.uk> |
---|---|
date | Thu, 26 Jul 2012 14:46:25 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/Descriptors/yin/private/src/interp_inplace.c Thu Jul 26 14:46:25 2012 +0100 @@ -0,0 +1,101 @@ +/* +* interp_inplace.c +* linear interpolation +* +* Alain de Cheveigné, CNRS/Ircam +* (c) 2003 CNRS +*/ + +#include <math.h> +#include "mex.h" + +/* #define MWRAP */ +#include "mwrap_check.h" + +/* Input Arguments */ +#define X_IN prhs[0] +#define IDX_IN prhs[1] + +/* Output Arguments */ + +static void interp_inplace( + double *xp, /* input vector */ + double *idxp, /* index vector */ + int m, /* rows input vector */ + int midx /* rows index vector */ + ) +{ + int j,idxi; + double a,b,idx,idxf; + + + for (j=0;j<midx;j++) { /* for each index */ + idx=GET(idxp[j]); + idxi=floor(idx); + idxf=idx-idxi; + if (idxi<0) { + a=GET(xp[0]); + b=GET(xp[1]); + SET(idxp[j]) = a + idx*(b-a); + } else if (idxi>=m) { + a=GET(xp[m-2]); + b=GET(xp[m-1]); + SET(idxp[j]) = b + (idx-m+1)*(b-a); + } else { + a=GET(xp[idxi]); + b=GET(xp[idxi+1]); + SET(idxp[j]) = a + idxf*(b-a); + } + } + + return; +} + +void mexFunction( + int nlhs, mxArray *plhs[], + int nrhs, const mxArray *prhs[] + ) +{ + double *xp, *idxp; + int nx, mx, nidx, midx; + + /* Check for proper number of arguments */ + if (nrhs !=2 ) { + mexErrMsgTxt("INTERP_INPLACE takes 2 input arguments"); + } + + /* Check type of input */ + if (!mxIsNumeric(X_IN) || mxIsComplex(X_IN) || + mxIsSparse(X_IN) || !mxIsDouble(X_IN) ) { + mexErrMsgTxt("INTERP_INPLACE: X should be doubles"); + } + if (!mxIsNumeric(IDX_IN) || mxIsComplex(IDX_IN) || + mxIsSparse(IDX_IN) || !mxIsDouble(IDX_IN) ) { + mexErrMsgTxt("INTERP_INPLACE: Y should be doubles"); + } + mx=mxGetM(X_IN); /* rows */ + nx=mxGetN(X_IN); /* columns */ + midx=mxGetM(IDX_IN); + nidx=mxGetN(IDX_IN); + + if (nx>1 || nidx>1) { + mexErrMsgTxt("INTERP_INPLACE: X and IDX should be column vectors"); + } + if (mx<1) { + mexErrMsgTxt("INTERP_INPLACE: X should have at least two samples"); + } + + xp = mxGetPr(X_IN); + idxp = mxGetPr(IDX_IN); + + checkin_matrix((mxArray *) IDX_IN); + checkin_matrix((mxArray *) X_IN); + + /* Do the actual computations in a subroutine */ + interp_inplace(xp,idxp,mx,midx); + + checkout_matrix((mxArray *) X_IN); + checkout_matrix((mxArray *) IDX_IN); + return; +} +