语法
说明
y = filter(b,a,x)
使用由分子和分母系数 b
和 a
定义的有理传递函数 对输入数据 x
进行滤波。
如果 a(1)
不等于 1
,则 filter
按 a(1)
对滤波器系数进行归一化。因此,a(1)
必须是非零值。
-
如果
x
为向量,则filter
将滤波后数据以大小与x
相同的向量形式返回。 -
如果
x
为矩阵,则filter
沿着第一维度操作并返回每列的滤波后的数据。 -
如果
x
为多维数组,则filter
沿大小不等于 1 的第一个数组维度进行计算。
y = filter(b,a,x,zi)
将初始条件 zi
用于滤波器延迟。zi
的长度必须等于 max(length(a),length(b))-1
。
y = filter(b,a,x,zi,dim)
沿维度 dim
进行计算。例如,如果 x
为矩阵,则 filter(b,a,x,zi,2)
返回每行滤波后的数据。
[y,zf] = filter(___)
还使用任一上述语法返回滤波器延迟的最终条件 zf
。
示例
移动平均滤波器
移动平均滤波器是用于对含噪数据进行平滑处理的常用方法。此示例使用 filter
函数计算沿数据向量的平均值。
创建一个由正弦曲线数据组成的 1×100 行向量,其中的正弦曲线被随机干扰所损坏。
t = linspace(-pi,pi,100);
rng default %initialize random number generator
x = sin(t) + 0.25*rand(size(t));
移动平均值滤波器沿数据移动长度为 windowSize 的窗口,并计算每个窗口中包含的数据的平均值。以下差分方程定义向量 x 的移动平均值滤波器:
y(n)=1windowSize(x(n)+x(n−1)+...+x(n−(windowSize−1))).
窗口大小为 5 时,计算有理传递函数的分子和分母系数。
windowSize = 5;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
求数据的移动平均值,并绘制其对原始数据的图。
y = filter(b,a,x);
plot(t,x)
hold on
plot(t,y)
legend('Input Data','Filtered Data')
对矩阵行进行滤波
此示例使用以下有理传递函数对数据的矩阵进行滤波。
H(z)=b(1)a(1)+a(2)z−1=11−0.2z−1
创建一个由随机输入数据组成的 2×15 矩阵。
rng default %initialize random number generator
x = rand(2,15);
定义有理传递函数的分子和分母系数。
b = 1;
a = [1 -0.2];
沿着 x
的第二维度应用传递函数并返回每行的一维数字滤波结果。绘制原始数据的第一行对已滤波数据的图。
y = filter(b,a,x,[],2);
t = 0:length(x)-1; %index vector
plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')
绘制输入数据的第二行对已滤波数据的图。
figure
plot(t,x(2,:))
hold on
plot(t,y(2,:))
legend('Input Data','Filtered Data')
title('Second Row')
对各部分中的数据进行滤波
使用滤波器延迟的初始条件和最终条件对各部分中的数据进行滤波,尤其是需要考虑内存限制时请执行此操作。
生成一个大型的随机数据序列并将其拆分为两段:x1
和 x2
。
x = randn(10000,1);
x1 = x(1:5000);
x2 = x(5001:end);
整个序列 x
是 x1
和 x2
的垂直串联。
定义有理传递函数的分子和分母系数,
H(z)=b(1)+b(2)z−1a(1)+a(2)z−1=2+3z−11+0.2z−1.
b = [2,3];
a = [1,0.2];
对子序列 x1
和 x2
进行滤波,一次一个。输出对 x1
进行滤波的最终条件,以便在第一段末尾存储滤波器的内部状态。
[y1,zf] = filter(b,a,x1);
将对 x1
进行滤波的最终条件用作对第二段也就是 x2
进行滤波的初始条件。
y2 = filter(b,a,x2,zf);
y1
是来自 x1
的滤波后的数据,而 y2
是来自 x2
的滤波后的数据。整个滤波后的序列是 y1
和 y2
的垂直串联。
同时对整个序列进行滤波以供比较。
y = filter(b,a,x);
isequal(y,[y1;y2])
ans = logical
1
提示
-
要将
filter
函数与来自 FIR 滤波器的b
系数结合使用,请使用y = filter(b,1,x)
。 -
如果您有 Signal Processing Toolbox™,请将
y = filter(d,x)
与 digitalFilter (Signal Processing Toolbox) 对象d
结合使用来对输入信号x
进行滤波。要根据频率响应设定生成d
,请使用 designfilt (Signal Processing Toolbox)。 -
有关滤波函数的详细信息,请参阅数字滤波 (Signal Processing Toolbox)。
参考
[1] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice-Hall, 1999.