0

MatLABでいくつかのZ係数を取得しました。次に、Cでフィルターを実装する必要があります。これを行うにはどうすればよいですか?Zドメインの係数:

num = [0.2557 -0.5115 -0.2557 1.0230 -0.2557 -0.5115 0.2557];

den = [1.0000 -4.0196 6.1894 -4.4532 1.4208 -0.1418 0.0044];

どんな助けでも大歓迎です。

(グーグルを試しましたが、明確でわかりやすいものは見つかりませんでした。)

4

1 に答える 1

1

主な問題は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;
}

それは素晴らしいことではありませんが、それはあなたを動かすはずだと思います。不明な点がある場合はお知らせください。

于 2012-09-21T14:29:53.357 に答える