Matlab在Java中的过滤器

时间:2011-12-14 12:56:29

标签: java matlab

我正在尝试在Java中实现Java Matlab的函数“filter”。

Y = FILTER(B,A,X)

它说:过滤器是标准差分方程的“直接形式II转置”实现:

 a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                         - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

有人可以帮助我,因为我不太了解上述公式。有人可以使用这些参数向我展示上述公式的示例:

e.g。 filter([1 -1],[1 -hpf_pole],S')

其中hpf_pole = 0.98

S =

-3.26368263029463   0.598694437762099   0.925551549649237
-3.15561902947223   0.00249461257261130 2.35703360665011
-2.89398994439634   1.98384531062216    3.67478741307554

3 个答案:

答案 0 :(得分:1)

您可以阅读Direct Form II Transposed。但是,阅读有关Direct FormsImplementation of discrete transfer functions的更多内容以了解它为何有用以及何时使用它会很有用。

答案 1 :(得分:0)

好的,我在Java中实现了一些看起来像是在完成工作的东西:

   public void filter(){
         double hpfPole = 0.98;
         double[] b = new double[]{1,-1};
         double[] a = new double[]{1, -hpfPole};
         double[] x = new double[]{-7.3416, -7.3416, -7.3416};
         double[] y = new double[x.length];

         for (int n = 0; n < y.length; n++) {
             if(n-1 < 0){
                 y[n] = b[0]*x[n];
             }else{
                y[n]= b[0]*x[n]+b[1]*x[n-1]-a[1]*y[n-1]; 
             }

         }


     }
Input: -7.3416, -7.3416, -7.3416
Output: -7.3416, -7.194768, -7.05087264

答案 2 :(得分:0)

更一般地说,它会是这样的:

public double[] filter(double[] b, double[] a, double[] x) {
    int nx = x.length;
    int na = a.length;
    int nb = b.length;

    double[] y = new double[nx];
    for (int k = 0; k < nx; k++) {
        y[k] = 0;
        for (int i = 0; i < nb; i++) {
            if (k - i >= 0 && k - i < nx) {
                y[k] += b[i] * x[k - i];
            }
        }
        for (int i = 1; i < na; i++) {
            if (k - i >= 0 && k - i < nx) {
                y[k] -= a[i] * y[k - i];
            }
        }
        if (Math.abs(a[0] - 1) > 1.e-9) {
            y[k] /= a[0];
        }

    }
    return y;
}