Here is the implementation of a program that analyses several days worth of data coming from a sensor that might change a tiny amount over that time. We were interested in how much of a change over time occurred, so I ‘fitted’ a line through the data points that would fit the best and calculated the slope of that line using linear regression using the recommended formula for the sensor and process used:

Here is the code used to implement the formula above: (Redlion Crimson 3)

float mu=0, s_t=0.0, s_b=0.0;
int i;
mu = (Sum(Regression1.x[0],Regression1.validPoints))/Regression1.validPoints;
for( i=0; i<Regression1.validPoints; i++ ) {
s_t += Regression1.y[i]*(Regression1.x[i]-mu);
s_b += Power((Regression1.x[i]-mu),2);
}
Regression1.slope=s_t/s_b;
if (Regression1.validPoints < 10)
Regression1.slopeValid = false;
else
Regression1.slopeValid = true;

This code below is executed each time a sample was to be taken. It shifts the data down in the array and places the newest data in the first location.

//call this program each time a sample is taken
//recorded x is in incrementing number
//recorded y is in mills (0.0 to 40.0)
//adds most recent data point to array place [0], and shifts all other points down
//assume array size is [1500]
int i;
//shift x and y arrays down 1 spot
for( i=0; i<1500; i++ ) {
Regression1.x[1499-i+1] = Regression1.x[1499-i];
Regression1.y[1499-i+1] = Regression1.y[1499-i];
}
//record the x
Regression1.x[0]++;
//record the y
Regression1.y[0] = Regression1.Xin;

And this bit of code checks to see if the current data collected is valid by comparing the current time to the last time a sample was taken. The sample size will grow to the size of the period.

//compare time stamp between current data and
// last data point to determine of valid points should be reset
int points_max;
points_max = int(Regression1.period * 24 * 60 / Regression1.sampleRate);
//if difference in current data point and last data point is more than sample period,
// reset valid points number
if (Abs(Regression1.lastTimeStamp - TimeNow) > (Regression1.period * 24 * 60 * 60))
Regression1.validPoints = 1;
else
{
Regression1.validPoints ++;
if (Regression1.validPoints > points_max)
Regression1.validPoints = points_max;
}
Regression1.lastTimeStamp = TimeNow;

### Like this:

Like Loading...