我正在尝试在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
答案 0 :(得分:1)
您可以阅读Direct Form II Transposed。但是,阅读有关Direct Forms和Implementation 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;
}