Main Content

filter

1 维数字滤波器

说明

示例

y = filter(b,a,x) 使用由分子和分母系数 ba 定义的有理传递函数 对输入数据 x 进行滤波。

如果 a(1) 不等于 1,则 filtera(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')

定义一个窗大小为 3 的移动平均滤波器。

windowSize = 3;
b = (1/windowSize)*ones(1,windowSize);
a = 1;

求数据的 1×6 行向量的三点移动平均值。

x = [2 1 6 2 4 3];
y = filter(b,a,x)
y = 1×6

    0.6667    1.0000    3.0000    3.0000    4.0000    3.0000

默认情况下,filter 函数将滤波器延迟初始化为零,并假设过去的输入和输出都为零。在这种情况下,y 的前两个元素分别是 x 的第一个元素和前两个元素的三点移动平均值。换句话说,第一个元素 0.6667 是 2 的三点平均值,第二个元素 1 是 2 和 1 的三点平均值。

要在数据中包含其他过去的输入和输出,请将初始条件指定为滤波器延迟。当前输入的这些初始条件是通过将相同的传递函数应用于过去的输入(和过去的输出)而获得的最终条件。例如,包括 [1 3] 的过去输入。在没有滤波器延迟的情况下,过去的输出是 (0+0+1)/3 和 (0+1+3)/3。

x_past = [1 3];
y_past = filter(b,a,x_past)
y_past = 1×2

    0.3333    1.3333

不过,您可以假设这些过去的输入的尾部为零,继续应用相同的传递函数来生成更多非零输出。这些进一步的输出是 (1+3+0)/3 和 (3+0+0)/3,它们表示从过去的输入中获得的最终条件。要计算这些最终条件,请指定 filter 函数的第二个输出参量。

[y_past,zf] = filter(b,a,x_past)
y_past = 1×2

    0.3333    1.3333

zf = 2×1

    1.3333
    1.0000

要在当前数据中包含过去的输入,请使用 filter 函数的第四个输入参量指定滤波器延迟。使用过去数据的最终条件作为当前数据的初始条件。

y = filter(b,a,x,zf)
y = 1×6

    2.0000    2.0000    3.0000    3.0000    4.0000    3.0000

在本例中,y 的第一个元素成为 1、3 和 2 的三点移动平均值,即 2,而 y 的第二个元素成为 3、2 和 1 的移动平均值,即 2。

使用滤波器延迟的初始条件和最终条件对各部分中的数据进行滤波,尤其是需要考虑内存限制时请执行此操作。

生成一个大型的随机数据序列并将其拆分为两段:x1x2

x = randn(10000,1);

x1 = x(1:5000);
x2 = x(5001:end);

整个序列 xx1x2 的垂直串联。

定义有理传递函数的分子和分母系数,

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];

对子序列 x1x2 进行滤波,一次一个。输出对 x1 进行滤波的最终条件,以便在第一段末尾存储滤波器的内部状态。

[y1,zf] = filter(b,a,x1);

将对 x1 进行滤波的最终条件用作对第二段也就是 x2 进行滤波的初始条件。

y2 = filter(b,a,x2,zf);

y1 是来自 x1 的滤波后的数据,而 y2 是来自 x2 的滤波后的数据。整个滤波后的序列是 y1y2 的垂直串联。

同时对整个序列进行滤波以供比较。

y = filter(b,a,x);

isequal(y,[y1;y2])
ans = logical
   1

输入参数

全部折叠

有理传递函数的分子系数,指定为向量。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
复数支持:

有理传递函数的分母系数,指定为向量。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
复数支持:

输入数据,指定为向量、矩阵或多维数组。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
复数支持:

滤波器延迟的初始条件,指定为向量、矩阵或多维数组。

  • 如果 zi 是向量,则它的长度必须是 max(length(a),length(b))-1

  • 如果 zi 是矩阵或多维数组,则主维度的大小必须为 max(length(a),length(b))-1。剩余的每个维度的大小必须与 x 的相应维度的大小匹配。例如,假设沿 3×4×5 数组 x 的第二个维度 (dim = 2) 使用 filter。数组 zi 的大小必须为 [max(length(a),length(b))-1]×3×5。

[] 指定的默认值将所有滤波器延迟初始化为零。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
复数支持:

沿其运算的维度,指定为正整数标量。如果不指定维度,则默认为第一个大于 1 的数组维度。

以一个二维输入数组 x 为例。

  • 如果 dim = 1,则 filter(b,a,x,zi,1)x 的列进行运算,并返回应用于每列的过滤器。

    filter(b,a,x,zi,1) column-wise operation

  • 如果 dim = 2,则 filter(b,a,x,zi,2)x 的行进行运算,并返回应用于每行的过滤器。

    filter(b,a,x,zi,2) row-wise operation

如果 dim 大于 ndims(x),则 filter 认为 x 具有额外维度,总维数为 dim,且额外维度的大小为 1。例如,如果 x 是大小为 2×3 且 dim = 3 的矩阵,则 filter 沿 x 的第三个维度执行运算,和 x 大小为 2×3×1 的情况一样。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

输出参量

全部折叠

滤波后的数据,返回为大小与输入数组 x 相同的向量、矩阵或多维数组。

如果 x 的类型为 single,则 filter 本身以单精度进行计算,y 的类型也是 single。否则,ydouble 类型返回。

数据类型: double | single

滤波器延迟的最终条件,以向量、矩阵或多维数组的形式返回。

  • 如果 x 是一个向量,则 zf 是长度为 max(length(a),length(b))-1 的列向量。

  • 如果 x 是矩阵或多维数组,则 zf 是长度为 max(length(a),length(b))-1 的列向量数组,其中 zf 中的列数等于 x 中的列数。例如,假设沿 3×4×5 数组 x 的第二个维度 (dim = 2) 使用 filter。数组 zf 的大小为 [max(length(a),length(b))-1]×3×5。

数据类型: double | single

详细信息

全部折叠

有理传递函数

Z 变换域中这种 filter 运算的输入-输出说明是一种有理传递函数。有理传递函数的形式为

Y(z)=b(1)+b(2)z1+...+b(nb+1)znb1+a(2)z1+...+a(na+1)znaX(z),

它可处理有限冲激响应 (FIR) 和无限冲激响应 (IIR) 滤波器 [1]。此处,X(z) 是输入信号 x 的 Z 变换,Y(z) 是输出信号 y 的 Z 变换,na 是反馈滤波器阶数,nb 是前馈滤波器阶数。由于归一化,假定 a(1) = 1。

对于具有 L 个元素的离散信号,您也可以将有理传递函数表示为差分方程

a(1)y(L)=b(1)x(L)+b(2)x(L1)+...+b(nb+1)x(Lnb)a(2)y(L1)...a(na+1)y(Lna).

此外,也可以使用如以下 IIR 数字滤波器图所示的直接 II 型转置实现表示有理传递函数。在图中,na = nb = n–1。如果您的反馈和前馈滤波器阶数不同,即 na ≠ nb,则您可以将高阶项视为 0。例如,对于 a = [1,2]b = [2,3,2,4] 的滤波器,您可以假设 a = [1,2,0,0]

Block diagram that illustrates the direct-form II transposed implementation of an IIR digital filter with order n-1

filter 在样本点 m 处的运算由时域差分方程给出,如下所示:

y(m)=b(1)x(m)+w1(m1)w1(m)=b(2)x(m)+w2(m1)a(2)y(m)       =                 wn2(m)=b(n1)x(m)+wn1(m1)a(n1)y(m)wn1(m)=b(n)x(m)a(n)y(m).

默认情况下,filter 函数将滤波器延迟初始化为零,其中 wk(0) = 0。这种初始化假设过去的输入和输出都为零。要在当前数据中包括非零的过去输入,请将当前数据的初始条件指定为滤波器延迟。您可以将滤波器延迟视为对过去的输入(和输出)应用相同的传递函数所获得的最终条件。使用 filter 设置滤波器延迟时,您可以指定第四个输入参量 zi,其中 wk(0) = zi(k)。当使用 filter 访问最终条件时,您还可以指定第二个输出参量 zf,其中 wk(L) = zf(k)

提示

  • 要将 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.

扩展功能

版本历史记录

在 R2006a 之前推出

另请参阅

|