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
|