在matlab中有没有办法创建一个低通滤波器,我知道我可以使用滤波器功能但不知道如何使用它,我已经为我的低通H(z)= 1给出了以下公式(1 - z ^ -4)^ 2/16(1 - z ^ -1)^ 2,截止频率为20Hz
答案 0 :(得分:3)
filter
功能允许您将过滤器应用于矢量。您仍需要提供滤波器系数。如果您查看the documentation for filter,您会发现需要指定两个向量b
和a
,其元素是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
即可过滤数据向量y
以获得结果y = 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文档中有an overview种各种数字滤波器设计技术。
答案 1 :(得分:2)
您给出的公式:H(z)= 1(1 - z ^ -4)^ 2/16(1 - z ^ -1)^ 2是滤波器的Z变换。它是一个有理的函数,这意味着您的过滤器是一个递归(IIR)过滤器。
Matlab有一个名为filter(b,a,X)
的函数。 b是分子的系数,其中z的功率减小,即i。在你的情况下:(1 * z ^ -0 + 0 * z ^ -1 + 0 * z ^ -2 + 0 * z ^ -3 + 0 * z ^ -4)^ 2,你可以使用{{1}数量方块:
conv()
b = [1 0 0 0 -1]
和分母的系数是:
b = conv(b,b)
a = [1 -1]
然后您调用过滤器a = 16 * conv(a,a)
,其中y = filter(b,a,x)
是您的输入数据。
您还可以使用x
希望有所帮助。