annotate Code/Descriptors/yin/private/src/cumnorm_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 * cumnorm_inplace.c
dawn@0 3 * cumulative mean-normalization of diff function
dawn@0 4 *
dawn@0 5 * Alain de Cheveigné, CNRS/Ircam Dec 2001
dawn@0 6 * (c) 2001 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
dawn@0 18 /* Output Arguments */
dawn@0 19
dawn@0 20 static void cumsum_inplace(
dawn@0 21 double *xp, /* matrix to cumulative-mean-normalize (along columns) */
dawn@0 22 int m, /* rows */
dawn@0 23 int n /* columns */
dawn@0 24 )
dawn@0 25 {
dawn@0 26 int j,k;
dawn@0 27 double z, sum, mean;
dawn@0 28
dawn@0 29
dawn@0 30 for (k=0; k<n; k++) { /* for each column */
dawn@0 31 SET(xp[k*m+0])=1;
dawn@0 32 sum = 0.0;
dawn@0 33 for (j=1;j<m;j++) { /* for each row */
dawn@0 34 z = GET(xp[k*m+j]);
dawn@0 35 z = (z > 0) ? z:0; /* clip to remove numerical artifacts */
dawn@0 36 sum += z;
dawn@0 37 z = (sum>0) ? (z / (sum/j)) : 1; /* cumulative-mean-normalize */
dawn@0 38 SET(xp[k*m+j])=z;
dawn@0 39 }
dawn@0 40 }
dawn@0 41 /*
dawn@0 42 for (j=0;j<m;j++) { // for each row (time)
dawn@0 43 sum=0;
dawn@0 44 SET(xp[j])=1;
dawn@0 45 for (k=1; k<n; k++) { // for each column (lag)
dawn@0 46 z=GET(xp[m*k+j]);
dawn@0 47 sum+=z;
dawn@0 48 mean=sum/k;
dawn@0 49 SET(xp[m*k+j]) = (mean > 0) ? z/mean : 1;
dawn@0 50 }
dawn@0 51 }
dawn@0 52 */
dawn@0 53
dawn@0 54
dawn@0 55 return;
dawn@0 56 }
dawn@0 57
dawn@0 58 void mexFunction(
dawn@0 59 int nlhs, mxArray *plhs[],
dawn@0 60 int nrhs, const mxArray *prhs[]
dawn@0 61 )
dawn@0 62 {
dawn@0 63 double *xp;
dawn@0 64 int nx, mx;
dawn@0 65
dawn@0 66 /* Check for proper number of arguments */
dawn@0 67 if (nrhs != 1) {
dawn@0 68 mexErrMsgTxt("CUMSUM_INPLACE takes 1 input argument");
dawn@0 69 }
dawn@0 70
dawn@0 71 /* Check type of input */
dawn@0 72 if (!mxIsNumeric(X_IN) || mxIsComplex(X_IN) ||
dawn@0 73 mxIsSparse(X_IN) || !mxIsDouble(X_IN) ) {
dawn@0 74 mexErrMsgTxt("CUMSUM_INPLACE: X 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 if (nx*mx == 0) {
dawn@0 79 mexErrMsgTxt("CUMSUM_INPLACE: input matrix is empty");
dawn@0 80 }
dawn@0 81
dawn@0 82 xp = mxGetPr(X_IN);
dawn@0 83 checkin_matrix((mxArray *) X_IN);
dawn@0 84
dawn@0 85
dawn@0 86 /* Do the actual computations in a subroutine */
dawn@0 87 cumsum_inplace(xp,mx,nx);
dawn@0 88
dawn@0 89 checkout_matrix((mxArray *) X_IN);
dawn@0 90 return;
dawn@0 91 }
dawn@0 92