xxxxxxxxxx
85
const chebyshev = (R, ripple, order)=> {
const epsilon = Math.sqrt( 10**(0.1*ripple) - 1 );
let A = 4*R / (R+1)**2;
if(!(order & 1))
A *= 1 + epsilon**2;
if(A > 1)
return [];
const gamma = (1/epsilon + Math.sqrt(1/epsilon**2 + 1))**(1/order),
sigma = (Math.sqrt((1-A)/epsilon**2) + Math.sqrt((1-A)/epsilon**2 + 1))**(1/order),
X = gamma - 1/gamma,
Y = sigma - 1/sigma,
alpha_i = (i)=> 2*Math.sin(Math.PI * i / 2 / order),
beta_i = (i)=> 2*Math.cos(Math.PI * i / 2 / order),
B_i = (i)=> X**2 + Y**2 - X*Y*beta_i(2*i) + alpha_i(2*i)**2;
let elements = [ 2 * alpha_i(1) / (X - Y) ],
t1, t2, t3, sub1, sub2, sub3, element_next;
for(let i = 2; i <= order; i++) {
[t1, t2, t3] = [-3, -1, -1];
if(i & 1)
[t1, t2, t3] = [-1, 1, 0];
sub1 = 4 * Math.floor(i/2) + t1;
sub2 = 4 * Math.floor(i/2) + t2;
sub3 = 2 * Math.floor(i/2) + t3;
element_next = 4 * alpha_i(sub1) * alpha_i(sub2) / (B_i(sub3) * elements[i-2]);
elements.push(element_next);
}
return elements;
};
const low_pass = (Rs, Rl, ripple, order, Fc, isC)=> {
const elements = chebyshev(Rl/Rs, ripple, order);
let L = [], C = [];
elements.forEach((e)=> {
e = e / (2 * Math.PI * Fc);
if(isC) C.push(e / Rs);
else L.push(e * Rs);
isC = !isC;
});
return [C, L];
};
const high_pass = (Rs, Rl, ripple, order, Fc, isC)=> {
const elements = chebyshev(Rl/Rs, ripple, order);
let L = [], C = [];
elements.forEach((e)=> {
e = 1 / (2 * Math.PI * Fc * e);
if(isC) C.push(e / Rs);
else L.push(e * Rs);
isC = !isC;
});
return [C, L];
};
const band_pass = (Rs, Rl, ripple, order, Fo, BW, isC)=> {
const elements = chebyshev(Rl/Rs, ripple, order);
const D = 1 / (2 * Math.PI**2 * Fo**2);
let L = [], C = [];
elements.forEach((e)=> {
e = e / (Math.PI * BW);
e = isC ? e / Rs : e * Rs;
C.push(isC ? e/2 : D/e);
L.push(isC ? D/e : e/2);
isC = !isC;
});
return [C, L];
};
const CalcFilter = (Ri, Ro, ripple, N, Fc, BW, type)=> {
if(type == 0) return low_pass(Ri, Ro, ripple, N, Fc, true);
else if(type == 1) return low_pass(Ri, Ro, ripple, N, Fc, false);
else if(type == 2) return high_pass(Ri, Ro, ripple, N, Fc, false);
else if(type == 3) return high_pass(Ri, Ro, ripple, N, Fc, true);
else if(type == 4) return band_pass(Ri, Ro, ripple, N, Fc, BW, true);
return band_pass(Ri, Ro, ripple, N, Fc, BW, false);
}