Фильтр Matlab в Java - PullRequest
       4

Фильтр Matlab в Java

2 голосов
/ 14 декабря 2011

Я пытаюсь реализовать в Java функцию Matlab «фильтр» в Java.

Y = FILTER(B,A,X)

В нем говорится, что: Фильтр - это реализация «Direct Form II Transposed» стандартного разностного уравнения:

 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)

Может ли кто-нибудь помочь мне с этим, поскольку я действительно не понимаю вышеупомянутую формулу.Может кто-нибудь показать мне пример приведенной выше формулы, используя эти параметры:

например, 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 ]

1 голос
/ 14 декабря 2011

Вы можете прочитать о Прямая форма II транспонированная . Но полезно прочитать больше о прямых формах и Реализация дискретных передаточных функций в целом, чтобы узнать, почему это полезно и когда его использовать.

0 голосов
/ 06 апреля 2018

В общем, это будет что-то вроде:

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;
}
0 голосов
/ 14 декабря 2011

ОК. Я реализовал кое-что в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...