3.5 KiB
3.5 KiB
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 |
|
|
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 性能差别
- FIR 可以做到线性相位;
- FIR 不易震荡,更加稳定;
- 阶数相同的情况下,IIR 幅频特性更好。