NotePublic/Algorithm/DSP/有限冲击响应滤波器_无限冲击响应滤波器及其_C_语言实...

3.6 KiB
Raw Blame History

layout title subtitle description excerpt date author tags categories published math
post 有限冲击响应滤波器、无限冲击响应滤波器及其 C 语言实现 简要介绍 FIR 和 IIR 的实现及特性差别。 介绍 FIR 和 IIR 的实现及特性差别。 2022-09-07 14:59:00 Rick Chan
DSP
FIR
IIR
Algorithm
true true

如果滤波器的输出结果只取决于输入,则为有限冲激响应滤波器。

如果滤波器的输出不仅取决于输入,还取决于输出,则为无限冲激响应滤波器。

1. 有限冲击响应滤波器

y(n)=\sum_{k=0}^{M}b(k)x(n-k)
double x[3] = {0, 0, 0};
const double b[4] = {0.4, 0.3, 0.2, 0.1}

double fir(double x) {
    double y;

    y = b[3]*x[0]+b[2]*x[1]+b[1]*x[2]+b[0]*x;
    x[0] = x[1];
    x[1] = x[2];
    x[2] = x;
    return y;
}

2. 无限冲击响应滤波器

y(n)=\sum_{k=0}^{M}b(k)x(n-k)-\sum_{l=1}^{N}a(l)y(n-l)
double y[3] = [0, 0, 0];
// 由于该项为减数,因此系数 a 依次取反
const double a[3] = {-0.577241, -0.421787, -0.056297};
double x[3] = {0, 0, 0};
const double b[4] = {0.2569, 0.7707, 0.7707, 0.2569a};

double iir(double x) {
    double y;

    y = b[3]*x[0]+b[2]*x[1]+b[1]*x[2]+b[0]*x
       +a[2]*y[0]+a[1]*y[1]+a[0]*y[2];
    
    x[0] = x[1];
    x[1] = x[2];
    x[2] = x;

    y[0] = y[1];
    y[1] = y[2];
    y[2] = y;

    return y;
}

3. 有限了什么,无限了什么

“有限冲击响应”、“无限冲击响应”中的“有限”和“无限”分别用于形容“响应”的。也就是滤波结果对系统造成了有限的影响还是无限的影响。

能够看到,无限冲击响应滤波器的当前输出结果不仅取决于输入,还取决于之前的输出,因此之后任意时刻的输出都将受到之前输入的影响,虽然过滤次数越多,这个影响越小,但其影响依然存在,因此响应是无限的。

有限冲击响应滤波器任意时刻的结果与之前的输出都没有关系,只有有限个输入对当前结果构成影响,因此响应是有限的。

由于无限冲击响应的存在IIR 滤波器有可能出现震荡,从而变得不稳定。

4. 滤波器对相位的影响

如果滤波器的结果:

y_i=a_0x_{i-2}+a_1x_{i-1}+a_2x_i

那么,由于其输出只收到之前时刻的影响,因此其输出将落后原始信号两个相位。

如果滤波器的结果:

y_i=a_0x_{i-1}+a_1x_i+a_2x_{i+1}

那么,由于其输出不仅受到之前时刻的影响,也受到之后时刻的影响,因此其输出与输入相位相同。

可以看到,对于一个实时系统而言,由于无法预测之后的输出,因此其当前输出只能受到之前输出的影响,从而使滤波结果存在相位差。而对于一个非实时的系统来说,其使用当前的输入来修正之前的输出,因此其输出可以与原信号同相位。

为了满足相位相同,其计算公式必须为对称形式。

FIR 滤波器存在线性相位,而 IIR 滤波器存在非线性相位,在实际操作时 FIR 滤波器能偶做到与原信号同相位。

5. IIR 与 FIR 性能差别

  1. FIR 可以做到线性相位;
  2. FIR 不易震荡,更加稳定;
  3. 阶数相同的情况下IIR 幅频特性更好。