0

我在 MatLAB 中获得了一些 Z 系数。现在我需要在 C 中实现过滤器。我该怎么做?Z域中的系数:

数量 = [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)

然后'求解' y(t),假设 a(1) 为 1:

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 回答