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;
+}
+