如何在matlab中实现过滤器

信息处理 过滤器 z变换
2022-02-01 09:14:52

我想在 matlab 中实现“过滤器”函数,但我似乎无法复制使用 matlab 函数时得到的结果。

我对matlab函数的理解是它需要3个参数:'b'=分子系数数组,'a'=分母系数数组和'array'=要过滤的数组。所以如果你想用过滤器 H(z) 其中:

H(z)=b1+b2z1a1+a2z1

并将其存储在一个名为“result”的数组中,然后你会写

result = filter( [b1 b2] , [a1 a2] , array );

现在我尝试通过从 H(z) 获取差分方程然后使用它来获取结果数组来实现“过滤器”函数(分子和分母中的系数数量限制为 2),但这条路线似乎没有工作,即

H(z)=Y(z)X(z)=b1+b2z1a1+a2z1

X(z)(b1+b2z1)=Y(z)(a1+a2z1)

b1x[n]+b2x[n1]=a1y[n]+a2y[n1]

y[n]=b1a1x[n]+b2a1x[n1]a2a1y[n1]

这意味着 matlab 代码应该看起来像

function [ result ] = myFilter( b , a , audio )
%MyFilter
%a,b = Two Element Arrays
%array = the array we want to filter

N = size(audio,2);

for i = 1:N
   if( i == 1 )
       result(i) = ( b(2)/a(1)) * audio(i);

   else
       result(i) = ( b(1) / a(1) ) * audio(i) + ...
                   ( b(2) / a(1) ) * audio(i-1) - ...
                   ( a(2) / a(1) ) * result(i-1);
   end
end

end

上面的函数不会产生与matlab过滤函数相同的结果。有人知道我做错了什么吗?我是否了解 matlab 中的过滤器功能是如何工作的?

1个回答

你有一个错字:

result(i) = ( b(2)/a(1)) * audio(i);

那应该是:

result(i) = ( b(1)/a(1)) * audio(i);