For a project I am trying a transformation from the z-transforms to s-transforms. For this I wrote the code that uses the bilinear transformation and checked the results with Matlab. Unfortunately they are wrong and I don't see the error. Maybe someone can help me on the hint.
public double[] BiliTransf(double[] a, double Ts)
{
int n = a.Length;
double[] bil_p = { 2, Ts };
double[] bil_m = { 2, -Ts };
init[0] = 1;
for (int i = 1; i < n; i++)
{
init[i] = 0;
}
int j;
for (int i=0; i<n; i++)
{
// (1+s)^i
s_p = init;
for (j = 0; j < i; j++)
{
alglib.convr1d(s_p, 1+j, bil_p, 2, out s2_p);
s_p = s2_p;
}
// (1-s)^n-1-i
s_m = init;
for (j = 0; j < n-1-i; j++)
{
alglib.convr1d(s_m, 1+j, bil_m, 2, out s2_m);
s_m = s2_m;
}
// s_m * s_p
alglib.convr1d(s_m, s_m.Length, s_p, s_p.Length, out s2_m);
VektorMulti(ref s2_m, a[n-1-j]);
VektorAddV2ToV1(ref a_cont, ref s2_m);
}
return a_cont;
}
Call C# Fbk:
a_tf = sv.BiliTransf(new double { 1, 0.5, 0.1}, 0.05);
a_tf[0]/a_tf[0] ; a_tf[0]/a_tf[1] ; a_tf[0]/a_tf[2]);
Result: a0: 1 / a1: -35,56 / a2: 4266,67
Call Matlab:
H = tf([1 0.5 0.1],[1 0.5 0.1 ],0.05)
sysc = d2c(H, 'tustin')
Result: a0: 1 / a1: 120/ a2: 4267