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

108 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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