IIR数字滤波器简介与实现

一、简介:
IIR是一种数字滤波器,其输出是输入信号和过去输出的某些加权和。IIR滤波器由反馈和前馈组成,可以用于滤除或增强信号的特定频率成分。
IIR滤波器的输出表示为:

y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + … - a1 * y[n-1] - a2 * y[n-2] - …

其中,x[n]是输入信号,y[n]是输出信号,b0、b1、b2等是前馈系数,a1、a2等是反馈系数。

IIR滤波器可以实现各种滤波器类型,如低通、高通、带通和带阻滤波器。IIR滤波器的设计通常基于数字滤波器设计方法,如Butterworth滤波器、Chebyshev滤波器和Elliptic滤波器等。

二、IIR滤波器具有以下优点:

较小的计算开销:由于IIR滤波器只考虑过去的输出,因此计算开销较小。

较高的滤波器阶数:由于IIR滤波器具有较小的计算开销,因此可以实现较高的滤波器阶数。

较小的延迟:由于IIR滤波器只考虑过去的输出,因此延迟较小。

IIR滤波器的缺点是可能会发生不稳定性和相位畸变。在设计IIR滤波器时,需要考虑这些问题,并采取相应的措施来解决它们。

三、示例代码
该代码实现了一个IIR低通滤波器,其设计基于Butterworth滤波器设计方法。在代码中,我们使用design_lpf函数计算低通滤波器系数,然后使用iir_lpf函数应用低通滤波器来滤除输入信号中的高频成分。具体来说,我们将输入信号x[n]和过去的输出y[n-1]和y[n-2]的加权和作为输出信号y[n]。我们使用i1、i2、o1和o2来存储过去的输入和输出信号,以便在下一个采样时使用。在代码中,我们将产生的滤波后的信号输出到控制台上,以供进一步处理或保存到文件中。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SAMPLE_RATE 44100.0
#define CUTOFF_FREQ 1000.0

float b0, b1, b2, a1, a2; // IIR滤波器系数

// 设计低通滤波器系数
void design_lpf(float cutoff_freq, float sample_rate) {
float c = 1.0 / tanf(2.0 * M_PI * cutoff_freq / sample_rate);
float a0 = 1.0 / (1.0 + sqrtf(2.0) * c + c * c);
b0 = a0;
b1 = 2.0 * a0;
b2 = a0;
a1 = 2.0 * a0 * (1.0 - c * c);
a2 = a0 * (1.0 - sqrtf(2.0) * c + c * c);
}

// 应用IIR低通滤波器
float iir_lpf(float input) {
float output = b0 * input + b1 * i1 + b2 * i2 - a1 * o1 - a2 * o2;
i2 = i1;
i1 = input;
o2 = o1;
o1 = output;
return output;
}

int main() {
design_lpf(CUTOFF_FREQ, SAMPLE_RATE); // 设计低通滤波器系数
float input = 0.0;
float output = 0.0;
for (int i = 0; i < SAMPLE_RATE * 2; i++) {
input = sinf(2.0 * M_PI * 1000.0 * i / SAMPLE_RATE); // 1000 Hz正弦波输入信号
output = iir_lpf(input); // 应用IIR低通滤波器
printf(“%!!(MISSING)!(MISSING)!(MISSING)!(MISSING)f(MISSING)\n”, output);
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_48408892/article/details/129874155