A Object to Calibrate and Scale Analog Inputs to Engineering Units( In three installments)
Part 2 Linear Regression
Now to add a method to perform a calibration.
This is done by collecting data and performing a linear regression.
Look at the numerical example in the following link: https://en.wikipedia.org/wiki/Simple_linear_regression
The X values are the raw analog readings and the Y values are the values from the calibration device. We need five sums:
Sx=Sum of Xi values,
Sy= Sum of Yi values,
Sxx= Sum of the product Xi*Xi,
Sxy= Sum of the product Xi*Yi, and the
Syy =Sum of the product Yi*Yi.
The slope is given by:
Slope = (N*Sxy - Sx*Sy)/( NSxx - Sx Sx),
And the Intercept is given by:
Intercept = Sy/N - (Slope * Sx) / N, where
N = the number of samples.
A linear regression object is defined as follows:
//The constructor for LinRegObj
function LinRegObj(a,nn){
this.Sx=0;
this.Sy=0;
this.Sxy=0;
this.Sxx=0;
this.Syy=0;
this.N=0;
this.A=a;
this.NN=nn;
this.slope=0;
this.intercept=0;
}//end LinRegObj
//Methods for LinRegObj
//LinRegObj.prototype.TakeData=function(y){
LinRegObj.prototype.TakeData=function(x,y){ for(i=0;i<this.NN;i++){
// var x=analogRead(this.A.pin);
this.Sx+=x;
this.Sy+=y;
this.Sxy+=(x*y);
this.Sxx+=(x*x);
this.Syy+=(y*y);
this.N++;
}//next i
};//endTakeData
LinRegObj.prototype.Calculate=function(){
this.slope=(this.N*this.Sxy-this.Sx*this.Sy)/
(this.N*this.Sxx - this.Sx*this.Sx);
this.intercept=this.Sy/this.N-(this.slope*this.Sx)/this.N;
//this.A.slope=this.slope;
//this.A.Intercept=this.intercept;
};//end Calculate
//end LinRegObj methods
//test example calculation
var Q=new LinRegObj(1,5);
Q.TakeData(0,0);
Q.TakeData(1,80);
Q.Calculate();
console.log("Slope= ",Q.slope);
console.log("Intercept= ",Q.intercept);
The object is commented to omit actual analogRead() and the X values are simulated to test the math.
The left WebIDE screen displays the following correct answer:
>echo(0);
Slope= 80
Intercept= 0
=undefined
>
Part 3 will follow soon.
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
A Object to Calibrate and Scale Analog Inputs to Engineering Units( In three installments)
Part 2 Linear Regression
Now to add a method to perform a calibration.
This is done by collecting data and performing a linear regression.
Look at the numerical example in the following link:
https://en.wikipedia.org/wiki/Simple_linear_regression
The X values are the raw analog readings and the Y values are the values from the calibration device. We need five sums:
Sx=Sum of Xi values,
Sy= Sum of Yi values,
Sxx= Sum of the product Xi*Xi,
Sxy= Sum of the product Xi*Yi, and the
Syy =Sum of the product Yi*Yi.
The slope is given by:
Slope = (N*Sxy - Sx*Sy)/( NSxx - Sx Sx),
And the Intercept is given by:
Intercept = Sy/N - (Slope * Sx) / N, where
N = the number of samples.
A linear regression object is defined as follows:
The object is commented to omit actual analogRead() and the X values are simulated to test the math.
The left WebIDE screen displays the following correct answer: