主な問題はZドメインから時間への変換だと思います。
Y(z)= H(z)* X(z)
H(z)= B(z)/ A(z)= Y(z)/ X(z)
B(z)* X(z)= A(z)* Y(z)
次に、ドキュメントから:
B(z)= b(1)* z ^ -n + ... + b(n + 1)A(z)= z ^ -n + ... + a(n + 1)
時間領域への変換:
b(1)* x(t)+ b(2)* x(t-1)+ ... + b(n + 1)* x(tn)= a(1)y(t)+..。 + a(n + 1)* y(tn)
次に、a(1)が1であるとすると、y(t)を「解く」。
y(t)= b(1)* x(t)+ b(2)* x(t-1)+ ... + b(n + 1)* x(tn)-a(2)* y( t-1)... --a(n + 1)* y(tn)
ここで、n = 7です。したがって、入力xとフィルター出力yの最後の6つの値を格納する配列が必要だとします。
/* Warning Warning Warning:
This has not been tested,
for illustration purposes only */
double filter_data(double x)
{
static double x_prev[6] = {0};
static double y_prev[6] = {0};
/* x is newest input value */
double y; /* output to be calculated */
int ii;
/* let's just keep it really simple for now, you can get more sophisticated later */
y = 0.2557*x[0] + -0.5115*x_prev[0] + -0.2557*x_prev[1] + 1.0230*x_prev[2] +
-0.2557*x_prev[3] + -0.5115*x_prev[4] + 0.2557*x_prev[5] - -4.0196*y_prev[0] -
6.1894*y_prev[1] - -4.4532*y_prev[2] - 1.4208*y_prev[3] - -0.1418*y_prev[4] -
0.0044*y_prev[5];
/* really really wasteful, but simple shift of previous values */
for(ii=5;ii>0;ii--)
{
y_prev[ii] = y_prev[ii-1]
x_prev[ii] = x_prev[ii-1]
}
y_prev[0] = y;
x_prev[0] = x;
return y;
}
それは素晴らしいことではありませんが、それはあなたを動かすはずだと思います。不明な点がある場合はお知らせください。