diff --git a/Algorithm/DSP/有限冲击响应滤波器_无限冲击响应滤波器及其_C_语言实现.md b/Algorithm/DSP/有限冲击响应滤波器_无限冲击响应滤波器及其_C_语言实现.md new file mode 100644 index 0000000..181c364 --- /dev/null +++ b/Algorithm/DSP/有限冲击响应滤波器_无限冲击响应滤波器及其_C_语言实现.md @@ -0,0 +1,106 @@ +--- +layout: post +title: "有限冲击响应滤波器、无限冲击响应滤波器及其 C 语言实现" +subtitle: "" +description: "简要介绍 FIR 和 IIR 的实现及特性差别。" +excerpt: "介绍 FIR 和 IIR 的实现及特性差别。" +date: 2022-09-07 14:59:00 +author: "Rick Chan" +tags: ["DSP", "FIR", "IIR"] +categories: ["Algorithm"] +published: true +--- + +- [1. 有限冲击响应滤波器](#1-有限冲击响应滤波器) +- [2. 无限冲击响应滤波器](#2-无限冲击响应滤波器) +- [3. 有限了什么,无限了什么](#3-有限了什么无限了什么) +- [4. 滤波器对相位的影响](#4-滤波器对相位的影响) +- [5. IIR 与 FIR 性能差别](#5-iir-与-fir-性能差别) + +如果滤波器的输出结果只取决于输入,则为有限冲激响应滤波器。 + +如果滤波器的输出不仅取决于输入,还取决于输出,则为无限冲激响应滤波器。 + +## 1. 有限冲击响应滤波器 + +$$y(n)=\sum_{k=0}^{M}b(k)x(n-k)$$ + +```cpp +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)$$ + +```cpp +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 幅频特性更好。