Ehlers swiss army knife.





var Ehlers_swiss_army_knife(int type, vars src, var len)
{
//Variables....
var pi = 2 * asin(1);
var c0 = 1;
var c1 = 0;
var b0 = 1;
var b1 = 0;
var b2 = 0;
var a1 = 0;
var a2 = 0;
var alpha = 0;
var beta = 0;
var gamma = 0;
var cycle = 2 * pi / len;






switch(type){

//ehlers EMA
case 1:
alpha = (cos(cycle) + sin(cycle) - 1) / cos(cycle);
b0 = alpha;
a1 = 1 - alpha;
//Gaussian
case 2:
beta = 2.415 * (1 - cos(cycle));
alpha = -beta + sqrt((beta * beta) + (2 * beta));
c0 = alpha * alpha;
a1 = 2 * (1 - alpha);
a2 = -(1 - alpha) * (1 - alpha);
//butterworth
case 3:
beta = 2.415 * (1 - cos(cycle));
alpha = -beta + sqrt((beta * beta) + (2 * beta));
c0 = alpha * alpha / 4;
b1 = 2;
b2 = 1;
a1 = 2 * (1 - alpha);
a2 = -(1 - alpha) * (1 - alpha);
//Bandstop...
case 4:
beta = cos(cycle);
gamma = 1 / cos(cycle*2*0.1); // delta default to 0.1. Acceptable delta -- 0.05<d<0.5
alpha = gamma - sqrt((gamma * gamma) - 1);
c0 = (1 + alpha) / 2;
b1 = -2 * beta;
b2 = 1;
a1 = beta * (1 + alpha);
a2 = -alpha;
//plain old sma
case 5:
c1 = 1 / len;
b0 = 1 / len;
a1 = 1;
//exponential
case 6:
alpha = 2/(len+1);
b0 = alpha;
a1 = 1 - alpha;
case 7:
alpha = 1 / len;
b0 = alpha;
a1 = 1 - alpha;
}
vars output = series(src[0]);

output[0] = (c0 * ((b0 * src[0]) + (b1 * src[1]) + (b2 * src[2]))) + (a1 * output[1]) + (a2 * output[2]) - (c1 * src[len]);




return output[0];

}