annotate Code/Descriptors/yin/private/src/interp_inplace.c @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents ea0c737c6323
children
rev   line source
dawn@0 1 /*
dawn@0 2 * interp_inplace.c
dawn@0 3 * linear interpolation
dawn@0 4 *
dawn@0 5 * Alain de Cheveigné, CNRS/Ircam
dawn@0 6 * (c) 2003 CNRS
dawn@0 7 */
dawn@0 8
dawn@0 9 #include <math.h>
dawn@0 10 #include "mex.h"
dawn@0 11
dawn@0 12 /* #define MWRAP */
dawn@0 13 #include "mwrap_check.h"
dawn@0 14
dawn@0 15 /* Input Arguments */
dawn@0 16 #define X_IN prhs[0]
dawn@0 17 #define IDX_IN prhs[1]
dawn@0 18
dawn@0 19 /* Output Arguments */
dawn@0 20
dawn@0 21 static void interp_inplace(
dawn@0 22 double *xp, /* input vector */
dawn@0 23 double *idxp, /* index vector */
dawn@0 24 int m, /* rows input vector */
dawn@0 25 int midx /* rows index vector */
dawn@0 26 )
dawn@0 27 {
dawn@0 28 int j,idxi;
dawn@0 29 double a,b,idx,idxf;
dawn@0 30
dawn@0 31
dawn@0 32 for (j=0;j<midx;j++) { /* for each index */
dawn@0 33 idx=GET(idxp[j]);
dawn@0 34 idxi=floor(idx);
dawn@0 35 idxf=idx-idxi;
dawn@0 36 if (idxi<0) {
dawn@0 37 a=GET(xp[0]);
dawn@0 38 b=GET(xp[1]);
dawn@0 39 SET(idxp[j]) = a + idx*(b-a);
dawn@0 40 } else if (idxi>=m) {
dawn@0 41 a=GET(xp[m-2]);
dawn@0 42 b=GET(xp[m-1]);
dawn@0 43 SET(idxp[j]) = b + (idx-m+1)*(b-a);
dawn@0 44 } else {
dawn@0 45 a=GET(xp[idxi]);
dawn@0 46 b=GET(xp[idxi+1]);
dawn@0 47 SET(idxp[j]) = a + idxf*(b-a);
dawn@0 48 }
dawn@0 49 }
dawn@0 50
dawn@0 51 return;
dawn@0 52 }
dawn@0 53
dawn@0 54 void mexFunction(
dawn@0 55 int nlhs, mxArray *plhs[],
dawn@0 56 int nrhs, const mxArray *prhs[]
dawn@0 57 )
dawn@0 58 {
dawn@0 59 double *xp, *idxp;
dawn@0 60 int nx, mx, nidx, midx;
dawn@0 61
dawn@0 62 /* Check for proper number of arguments */
dawn@0 63 if (nrhs !=2 ) {
dawn@0 64 mexErrMsgTxt("INTERP_INPLACE takes 2 input arguments");
dawn@0 65 }
dawn@0 66
dawn@0 67 /* Check type of input */
dawn@0 68 if (!mxIsNumeric(X_IN) || mxIsComplex(X_IN) ||
dawn@0 69 mxIsSparse(X_IN) || !mxIsDouble(X_IN) ) {
dawn@0 70 mexErrMsgTxt("INTERP_INPLACE: X should be doubles");
dawn@0 71 }
dawn@0 72 if (!mxIsNumeric(IDX_IN) || mxIsComplex(IDX_IN) ||
dawn@0 73 mxIsSparse(IDX_IN) || !mxIsDouble(IDX_IN) ) {
dawn@0 74 mexErrMsgTxt("INTERP_INPLACE: Y should be doubles");
dawn@0 75 }
dawn@0 76 mx=mxGetM(X_IN); /* rows */
dawn@0 77 nx=mxGetN(X_IN); /* columns */
dawn@0 78 midx=mxGetM(IDX_IN);
dawn@0 79 nidx=mxGetN(IDX_IN);
dawn@0 80
dawn@0 81 if (nx>1 || nidx>1) {
dawn@0 82 mexErrMsgTxt("INTERP_INPLACE: X and IDX should be column vectors");
dawn@0 83 }
dawn@0 84 if (mx<1) {
dawn@0 85 mexErrMsgTxt("INTERP_INPLACE: X should have at least two samples");
dawn@0 86 }
dawn@0 87
dawn@0 88 xp = mxGetPr(X_IN);
dawn@0 89 idxp = mxGetPr(IDX_IN);
dawn@0 90
dawn@0 91 checkin_matrix((mxArray *) IDX_IN);
dawn@0 92 checkin_matrix((mxArray *) X_IN);
dawn@0 93
dawn@0 94 /* Do the actual computations in a subroutine */
dawn@0 95 interp_inplace(xp,idxp,mx,midx);
dawn@0 96
dawn@0 97 checkout_matrix((mxArray *) X_IN);
dawn@0 98 checkout_matrix((mxArray *) IDX_IN);
dawn@0 99 return;
dawn@0 100 }
dawn@0 101