--- 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 math: 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 幅频特性更好。