107 lines
3.5 KiB
Markdown
107 lines
3.5 KiB
Markdown
|
---
|
|||
|
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 幅频特性更好。
|