1

在matlab中有没有办法创建一个低通滤波器,我知道我可以使用滤波器功能但不知道如何使用它,我的低通H(z)= 1(1 - z^-4)^2 / 16 (1 - z^-1)^2,截止频率为 20Hz

4

2 回答 2

3

filter函数允许您将过滤器应用于向量。您仍然需要提供滤波器系数。如果您查看filter 的文档,您会发现您需要指定两个向量ba其元素是 z 的降幂系数,其中 z 是 z 变换中的频域变量。由于您有一个作为 z 变换的滤波器表达式,因此很容易找到系数。首先,让我们写出过滤器的分子:

(1/16)*(1 - z^-4)^2 = (1/16)*(1 - 2z^-4 + z^-16)
= (1/16)*(1 + 0z^-1 + 0z^-2 + 0z^-3 - 2z^-4 + 0z^5 + 0z^-6 ... + z^-16)

所以b向量是b = (1/16)*[1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1]。同样,a向量是a = [1 -2 1]。因此,现在您可以通过简单地过滤数据向量x来获得结果。yy = filter(b,a,x);

说了这么多,您在上面指定的 H(z) 绝对不是低通滤波器。它更像是梳状滤波器本身的一些奇怪级联。

如果您想设计自己的滤波器,并且假设您有信号处理工具箱,那么绝对最简单的做法是使用 Matlab 的fir1函数设计一个滤波器:

h = fir1(N, 20/(Fs/2)); %# N is filter length, Fs is sampling frequency (Hz)

然后您可以在filter函数中使用它:

y = filter(h, 1, x); %# second param is 1 because this is an FIR filter

您需要自己选择 N。通常,较大的 N 值会产生更好的滤波器,其中更好 = 拒绝更多高于 20 Hz 的频率。如果您的 N 值开始变得如此之大以至于导致奇怪的行为(计算错误、缓慢的实现、结果数据中不可接受的启动/结束瞬态),您可能会考虑更复杂的滤波器设计。Mathworks 文档概述了各种数字滤波器设计技术。

于 2011-12-02T14:46:40.550 回答
2

您给出的公式: H(z) = 1 (1 - z^-4)^2 / 16 (1 - z^-1)^2 是过滤器的 Z 变换。这是一个有理函数,这意味着您的过滤器是递归 (IIR) 过滤器。Matlab 有一个函数叫做filter(b,a,X). b 是分子的系数,z 的幂递减,在您的情况下为 iE: (1*z^-0 + 0*z^-1 + 0*z^-2 + 0*z^-3 + 0* z^-4)^2,可conv()用于数量平方:

b = [1 0 0 0 -1]

b = conv(b,b)

分母的系数为:

a = [1 -1]

a = 16 * conv(a,a)

然后你调用 filter y = filter(b,a,x)x你的输入数据在哪里。

您还可以使用以下命令检查滤波器的频率响应freqz(b,a)

希望有帮助。

于 2011-12-03T20:30:01.027 回答