用C++来写二阶IIR滤波的代码,并解释这些代码意思
时间: 2024-03-20 11:42:38 浏览: 23
下面是用C++来写二阶IIR滤波器的代码:
```C++
#include <iostream>
#include <cmath>
using namespace std;
class IIRFilter
{
private:
double a1, a2, b0, b1, b2;
double x1, x2, y1, y2;
public:
IIRFilter(double _a1, double _a2, double _b0, double _b1, double _b2);
double filter(double input);
};
IIRFilter::IIRFilter(double _a1, double _a2, double _b0, double _b1, double _b2)
{
a1 = _a1;
a2 = _a2;
b0 = _b0;
b1 = _b1;
b2 = _b2;
x1 = x2 = y1 = y2 = 0;
}
double IIRFilter::filter(double input)
{
double output = b0 * input + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2;
x2 = x1;
x1 = input;
y2 = y1;
y1 = output;
return output;
}
int main()
{
double a1 = -1.0;
double a2 = 0.5;
double b0 = 1.0;
double b1 = 0.0;
double b2 = -1.0;
IIRFilter filter(a1, a2, b0, b1, b2);
double input = 0;
double output = 0;
for (int i = 0; i < 10; i++)
{
input = sin(i);
output = filter.filter(input);
cout << "Input: " << input << "\tOutput: " << output << endl;
}
return 0;
}
```
这段代码实现了一个二阶IIR滤波器。在类`IIRFilter`的构造函数中,我们传入了滤波器的系数a1、a2、b0、b1、b2,并初始化了滤波器的状态变量。在成员函数`filter`中,我们根据差分方程计算出输出信号,并更新状态变量。在主函数中,我们构造了一个滤波器对象,并对输入信号进行了滤波。
具体来说,这个二阶IIR滤波器的传递函数为:
$$H(z) = \frac{b_0 + b_1z^{-1} + b_2z^{-2}}{1 + a_1z^{-1} + a_2z^{-2}}$$
其中,$a_1$、$a_2$、$b_0$、$b_1$、$b_2$是滤波器的系数。
在这个代码中,我们使用了类的封装来实现滤波器。在类的成员变量中,我们定义了滤波器的系数和状态变量。在类的成员函数中,我们实现了滤波器的差分方程,并更新了状态变量。在主函数中,我们构造了一个滤波器对象,并对输入信号进行了滤波。