滤波器实现
卷积和滤波
滤波的数学基础是卷积。对于有限冲激响应 (FIR) 滤波器,滤波运算的输出 y(k) 是输入信号 x(k) 与冲激响应 h(k) 的卷积:
y(k)=∞∑l=−∞h(l) x(k−l).
如果输入信号也是有限长度的,您可以使用 MATLAB® conv 函数来执行滤波运算。例如,要用三阶平均值滤波器对包含五个样本的随机向量进行滤波,可以将 x(k) 存储在向量 x
中,将 h(k) 存储在向量 h
中,并求这两个向量的卷积:
x = randn(5,1);
h = [1 1 1 1]/4; % A third-order filter has length 4
y = conv(h,x)
y = -0.3375 0.4213 0.6026 0.5868 1.1030 0.3443 0.1629 0.1787
y
的长度比 x
和 h
的长度之和小 1。
滤波器和传递函数
滤波器的传递函数是其冲激响应的 Z 变换。对于 FIR 滤波器,输出 y 的 Z 变换 Y(z) 是传递函数和输入 x 的 Z 变换 X(z) 的乘积:
Y(z)=H(z)X(z)=(h(1)+h(2)z−1+⋯+h(n+1)z−n)X(z).
多项式系数 h(1), h(2), …, h(n + 1) 对应于第 n 阶滤波器的冲激响应的系数。
注意
滤波器系数索引从 1 到 (n + 1),而不是从 0 到 n。这反映了用于 MATLAB 向量的标准索引方案。
FIR 滤波器也称为全零、非递归或移动平均值 (MA) 滤波器。
对于无限冲激响应 (IIR) 滤波器,传递函数不是多项式,而是有理函数。输入和输出信号的 Z 变换的关系是:
Y(z) = H(z)X(z) = b(1)+b(2)z−1+...+b(n+1)z−na(1)+a(2)z−1+...+a(m+1)z−mX(z),
其中 b(i) 和 a(i) 是滤波器系数。在本例中,滤波器的阶是 n 和 m 的最大值。n = 0 的 IIR 滤波器也称为全极点、递归或自回归 (AR) 滤波器。n 和 m 均大于零的 IIR 滤波器也称为零极点、递归或自回归移动平均值 (ARMA) 滤波器。缩写 AR、MA 和 ARMA 通常应用于与滤波随机过程相关联的滤波器。
使用 filter
函数进行滤波
对于 IIR 滤波器,滤波运算不能用简单的卷积来说明,而需要用可从传递函数关系中找到的差分方程来说明。假设 a(1) = 1,将分母移到左侧,并进行逆 Z 变换,以获得
y(k)+a(2) y(k−1)+…+a(m+1) y(k−m)=b(1) x(k)+b(2) x(k−1)+⋯+b(n+1) x(k−n).
对于当前输入、过去的输入以及过去的输出,y(k) 是
y(k)=b(1) x(k)+b(2) x(k−1)+⋯+b(n+1) x(k−n)−a(2) y(k−1)−⋯−a(m+1) y(k−m),
这是数字滤波器的标准时域表示。从 y(1) 开始,假设一个初始条件为零的因果系统,表示等效于
y(1)=b(1) x(1)y(2)=b(1) x(2)+b(2) x(1)−a(2) y(1)y(3)=b(1) x(3)+b(2) x(2)+b(3) x(1)−a(2) y(2)−a(3) y(1) ⋮ y(n)=b(1) x(n)+⋯+b(n) x(1)−a(2) y(n−1)−⋯−a(n) y(1).
要实现此滤波运算,您可以使用 MATLAB filter 函数。filter
将系数存储在两个行向量中,其中一个为分子,一个为分母。例如,要求解差分方程
y(n)−0.9y(n−1)=x(n) ⇒ Y(z)=11−0.9 z−1X(z)=H(z) X(z),
,您可以使用
b = 1;
a = [1 -0.9];
y = filter(b,a,x);
filter
提供的输出样本的数量与输入样本一样多,即 y
的长度与 x
的长度相同。如果 a 的第一个元素不是 1,则 filter
在实现差分方程之前,将系数除以 a(1)。
另请参阅
App
- 滤波器设计工具
函数
- conv | designfilt | filter