filter
1 维数字滤波器
说明
示例
移动平均滤波器
移动平均滤波器是用于对含噪数据进行平滑处理的常用方法。此示例使用 filter
函数计算沿数据向量的平均值。
创建一个由正弦曲线数据组成的 1×100 行向量,其中的正弦曲线被随机干扰所损坏。
t = linspace(-pi,pi,100); rng default %initialize random number generator x = sin(t) + 0.25*rand(size(t));
移动平均滤波器沿数据移动长度为 的窗口,并计算每个窗口中包含的数据的平均值。以下差分方程定义向量 的移动平均滤波器:
窗口大小为 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')
对矩阵行进行滤波
此示例使用以下有理传递函数对数据的矩阵进行滤波。
创建一个由随机输入数据组成的 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。
对各部分中的数据进行滤波
使用滤波器延迟的初始条件和最终条件对各部分中的数据进行滤波,尤其是需要考虑内存限制时请执行此操作。
生成一个大型的随机数据序列并将其拆分为两段:x1
和 x2
。
x = randn(10000,1); x1 = x(1:5000); x2 = x(5001:end);
整个序列 x
是 x1
和 x2
的垂直串联。
定义有理传递函数的分子和分母系数,
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
输入参数
b
— 有理传递函数的分子系数
向量
有理传递函数的分子系数,指定为向量。
数据类型: double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
a
— 有理传递函数的分母系数
向量
有理传递函数的分母系数,指定为向量。
数据类型: double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
x
— 输入数据
向量 | 矩阵 | 多维数组
输入数据,指定为向量、矩阵或多维数组。
数据类型: double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
复数支持: 是
zi
— 滤波器延迟的初始条件
[]
(默认) | 向量 | 矩阵 | 多维数组
滤波器延迟的初始条件,指定为向量、矩阵或多维数组。
如果
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
复数支持: 是
dim
— 沿其运算的维度
正整数标量
沿其运算的维度,指定为正整数标量。如果不指定维度,则默认为第一个大于 1 的数组维度。
以一个二维输入数组 x
为例。
如果
dim = 1
,则filter(b,a,x,zi,1)
对x
的列进行运算,并返回应用于每列的过滤器。如果
dim = 2
,则filter(b,a,x,zi,2)
对x
的行进行运算,并返回应用于每行的过滤器。
如果 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
输出参量
y
— 滤波后的数据
向量 | 矩阵 | 多维数组
滤波后的数据,返回为大小与输入数组 x
相同的向量、矩阵或多维数组。
如果 x
的类型为 single
,则 filter
本身以单精度进行计算,y
的类型也是 single
。否则,y
以 double
类型返回。
数据类型: double
| single
zf
— 滤波器延迟的最终条件
向量 | 矩阵 | 多维数组
滤波器延迟的最终条件,以向量、矩阵或多维数组的形式返回。
如果
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
运算的输入-输出说明是一种有理传递函数。有理传递函数的形式为
它可处理有限冲激响应 (FIR) 和无限冲激响应 (IIR) 滤波器 [1]。此处,X(z) 是输入信号 x 的 Z 变换,Y(z) 是输出信号 y 的 Z 变换,na 是反馈滤波器阶数,nb 是前馈滤波器阶数。由于归一化,假定 a(1) = 1。
对于具有 L 个元素的离散信号,您也可以将有理传递函数表示为差分方程
此外,也可以使用如以下 IIR 数字滤波器图所示的直接 II 型转置实现表示有理传递函数。在图中,na = nb = n–1。如果您的反馈和前馈滤波器阶数不同,即 na ≠ nb,则您可以将高阶项视为 0。例如,对于 a = [1,2]
且 b = [2,3,2,4]
的滤波器,您可以假设 a = [1,2,0,0]
。
filter
在样本点 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.
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
如果提供
dim
,则它必须为常量。请参阅Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder)。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
如果提供
dim
,则它必须为常量。请参阅Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder)。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
使用说明:
digitalFilter
对象d
和gpuArray
输入x
支持y = filter(d,x)
。对于 IIR 滤波器,digitalFilter
对象将滤波器系数存储为二阶节 (SOS) 的矩阵。对于gpuArray
输入,不需要将 SOS 矩阵转换为gpuArray
。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)