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
|