annotate Code/Descriptors/yin/private/src/dftoperiod.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 * dftoperiod.c
dawn@0 3 * estimate period from df
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 D_IN prhs[0]
dawn@0 17 #define B_IN prhs[1]
dawn@0 18 #define T_IN prhs[2]
dawn@0 19
dawn@0 20 /* output arguments */
dawn@0 21 #define PRD_OUT plhs[0]
dawn@0 22
dawn@0 23 static void ddftoperiods(
dawn@0 24 double *dp, /* input df */
dawn@0 25 double *bp, /* bounds */
dawn@0 26 double *prdp, /* periods */
dawn@0 27 double thresh, /* threshold */
dawn@0 28 int m, /* nrows of df */
dawn@0 29 int n /* ncols of df */
dawn@0 30 )
dawn@0 31 {
dawn@0 32 int j,k, p, lo, hi, maxj, goodflag;
dawn@0 33 double z, min, globalmin;
dawn@0 34
dawn@0 35 /* bounds */
dawn@0 36 lo= GET(bp[0]);
dawn@0 37 hi= GET(bp[1]);
dawn@0 38 if (lo<0 || hi>m ) {
dawn@0 39 mexPrintf("%d %d\n", lo, hi);
dawn@0 40 mexErrMsgTxt("DFTOPERIOD: bounds are out of bounds");
dawn@0 41 }
dawn@0 42
dawn@0 43 #define MARGIN 1.5
dawn@0 44
dawn@0 45 for (k=0;k<n;k++) { /* for each col */
dawn@0 46
dawn@0 47 goodflag=0;
dawn@0 48
dawn@0 49 /* estimate global min
dawn@0 50 globalmin=GET(dp[k*m+lo]);
dawn@0 51 for (j=lo;j<hi; j++) {
dawn@0 52 z = GET(dp[k*m+j]);
dawn@0 53 if (z<globalmin) {
dawn@0 54 globalmin = z;
dawn@0 55 }
dawn@0 56 }
dawn@0 57
dawn@0 58 thresh += globalmin; */
dawn@0 59
dawn@0 60 /* estimate period */
dawn@0 61 p=lo;
dawn@0 62 min=GET(dp[k*m+lo]);
dawn@0 63 maxj=hi;
dawn@0 64 for (j=lo;j<maxj; j++) { /* for each row */
dawn@0 65
dawn@0 66 z = GET(dp[k*m+j]);
dawn@0 67
dawn@0 68 if (z<thresh && z <= min) { /* good candidate, restrict search range */
dawn@0 69 maxj=j*MARGIN;
dawn@0 70 if (maxj> hi) { maxj = hi; }
dawn@0 71 }
dawn@0 72
dawn@0 73 if (z<min) { /* update min & period estimate */
dawn@0 74 min = z;
dawn@0 75 p=j;
dawn@0 76 }
dawn@0 77
dawn@0 78 }
dawn@0 79
dawn@0 80 /* mexPrintf("%f %d %f\n", thresh, p, min); */
dawn@0 81
dawn@0 82 SET(prdp[k])=p;
dawn@0 83 }
dawn@0 84
dawn@0 85 return;
dawn@0 86 }
dawn@0 87
dawn@0 88 void mexFunction(
dawn@0 89 int nlhs, mxArray *plhs[],
dawn@0 90 int nrhs, const mxArray *prhs[]
dawn@0 91 )
dawn@0 92 {
dawn@0 93 double *dp, *bp, *tp, *prdp, thresh;
dawn@0 94 int m, n;
dawn@0 95
dawn@0 96 /* Check for proper number of arguments */
dawn@0 97 if (nrhs != 3){
dawn@0 98 mexErrMsgTxt("DFTOPERIOD requires 3 input arguments");
dawn@0 99 }
dawn@0 100
dawn@0 101 /* Check type of input */
dawn@0 102 if (!mxIsNumeric(D_IN) || mxIsComplex(D_IN) ||
dawn@0 103 mxIsSparse(D_IN) || !mxIsDouble(D_IN) ) {
dawn@0 104 mexErrMsgTxt("DFTOPERIOD: D should be doubles");
dawn@0 105 }
dawn@0 106 if (!mxIsNumeric(B_IN) || mxIsComplex(B_IN) ||
dawn@0 107 mxIsSparse(B_IN) || !mxIsDouble(B_IN) ) {
dawn@0 108 mexErrMsgTxt("DFTOPERIOD: B should be doubles");
dawn@0 109 }
dawn@0 110 if (!mxIsNumeric(T_IN) || mxIsComplex(T_IN) ||
dawn@0 111 mxIsSparse(T_IN) || !mxIsDouble(T_IN) ) {
dawn@0 112 mexErrMsgTxt("DFTOPERIOD: T should be double");
dawn@0 113 }
dawn@0 114 m=mxGetM(D_IN); /* rows */
dawn@0 115 n=mxGetN(D_IN); /* columns */
dawn@0 116
dawn@0 117 if (mxGetM(B_IN) * mxGetN(B_IN) != 2) {
dawn@0 118 mexErrMsgTxt("DFTOPERIOD: B should be a size 2 vector");
dawn@0 119 }
dawn@0 120 if (mxGetM(T_IN)*mxGetN(T_IN) != 1) {
dawn@0 121 mexErrMsgTxt("DFTOPERIOD: T should be scalar");
dawn@0 122 }
dawn@0 123
dawn@0 124 /* Create matrix to return */
dawn@0 125 PRD_OUT = mxCreateDoubleMatrix(1,n, mxREAL);
dawn@0 126
dawn@0 127 dp = mxGetPr(D_IN);
dawn@0 128 bp = mxGetPr(B_IN);
dawn@0 129 tp = mxGetPr(T_IN); thresh=tp[0];
dawn@0 130 prdp = mxGetPr(PRD_OUT);
dawn@0 131
dawn@0 132 checkin_matrix((mxArray *) D_IN);
dawn@0 133 checkin_matrix((mxArray *) B_IN);
dawn@0 134 checkin_matrix((mxArray *) PRD_OUT);
dawn@0 135
dawn@0 136 /* Do the actual computations in a subroutine */
dawn@0 137 ddftoperiods(dp,bp,prdp,thresh,m,n);
dawn@0 138
dawn@0 139 checkout_matrix((mxArray *) D_IN);
dawn@0 140 checkout_matrix((mxArray *) B_IN);
dawn@0 141 checkout_matrix((mxArray *) PRD_OUT);
dawn@0 142 return;
dawn@0 143 }
dawn@0 144