blob: 1264a20f593672e6668e52c9c2f2e484cffa3b64 [file] [log] [blame]
Brian Silverman6ae77dd2013-03-29 22:28:08 -07001
2#include "SensorProcessor.h"
3#include <stdio.h>
4
5// give a set of x -> fx pairs find a range for our value
6// then interpolate between and return an interpolated fx.
7// If the value is off the end just extend the line to
8// meet our point. If something does go wrong (and it
9// never should) it will return -1.
10double interpolate(int num_interp_vals,
11 const Interpolation *interp, double value) {
12 double dy;
13 double dx;
14 double a;
15 double intercept;
16 //printf("for val %.1f\n", value);
17 if (value < interp[0].x) {
18 // if closer than nearest
19 dy = interp[1].fx - interp[0].fx;
20 dx = interp[1].x - interp[0].x;
21 a = value - interp[0].x;
22 intercept = interp[0].fx;
23 //printf("LESS THAN\n");
24 } else if (value > interp[num_interp_vals-1].x){
25 // if further than furthest
26 dy = interp[num_interp_vals-1].fx - interp[num_interp_vals-2].fx;
27 dx = interp[num_interp_vals-1].x - interp[num_interp_vals-2].x;
28 a = value - interp[num_interp_vals-2].x;
29 intercept = interp[num_interp_vals-2].fx;
30 //printf("GT THAN\n");
31 } else {
32 //printf("gh0\n");
33 // scan for range
34 for(int i=0; i<num_interp_vals-1; i++){
35 if(value >= interp[i].x && value <= interp[i+1].x){
36 // printf("(%.1f,%.1f)=(%.1f,%.1f)\n",
37 // interp[i].x, interp[i+1].x,
38 // interp[i].fx, interp[i+1].fx);
39 double lambda =
40 (value - interp[i].x)/(interp[i+1].x - interp[i].x);
41 return (1-lambda)*interp[i].fx + lambda*interp[i+1].fx;
42 }
43 }
44 // this should maybe be an assert
45 return -1;
46 }
47
48 return ( (dy/dx)*a + intercept );
49}
50