C#实现巴特沃斯滤波器
时间: 2023-07-12 16:40:59 浏览: 184
以下是一个使用 C# 实现巴特沃斯滤波器的代码示例:
```csharp
using System;
class ButterworthFilter
{
private double[] x_reg;
private double[] y_reg;
private int n;
private int m;
private double fc;
private double fs;
public ButterworthFilter(int n, int m, double fc, double fs)
{
this.n = n;
this.m = m;
this.fc = fc;
this.fs = fs;
this.x_reg = new double[n];
this.y_reg = new double[n];
}
public double Filter(double input)
{
// 巴特沃斯滤波器系数计算
double wc = 2 * Math.PI * fc / fs;
double a = 1.0;
double b = Math.Sqrt(2) * wc;
double c = wc * wc;
double d = 2 * Math.Cos(wc) * wc;
double e = wc * wc;
double pre_gain = Math.Pow(wc, n) / (Math.Pow(wc, 2 * m) + b * Math.Pow(wc, 2 * m - 1) + c * Math.Pow(wc, 2 * m));
// 巴特沃斯滤波器递推式计算
for (int i = n - 1; i > 0; i--)
{
x_reg[i] = x_reg[i - 1];
y_reg[i] = pre_gain * (a * x_reg[i] + d * x_reg[i - 1] + e * x_reg[i - 2] - b * y_reg[i - 1] - c * y_reg[i - 2]);
}
x_reg[0] = input;
y_reg[0] = pre_gain * input;
double output = y_reg[0];
for (int i = 1; i < n; i++)
{
output += y_reg[i];
}
return output;
}
}
class Program
{
static void Main()
{
ButterworthFilter filter = new ButterworthFilter(10, 2, 2, 10);
double[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
double[] output = new double[10];
for (int i = 0; i < input.Length; i++)
{
output[i] = filter.Filter(input[i]);
Console.WriteLine(output[i]);
}
}
}
```
该代码定义了一个名为 `ButterworthFilter` 的类,用于实现巴特沃斯滤波器的功能。在类的构造函数中,初始化了滤波器的阶数、截止频率和采样率,并创建了两个 double 数组 `x_reg` 和 `y_reg`,用于存储输入信号和滤波器输出信号的历史数据。在类的 `Filter` 方法中,根据给定的参数计算出巴特沃斯滤波器的系数,并使用递推式对输入信号进行滤波,得到滤波后的输出结果。在递推式计算过程中,使用了预先计算的增益进行输出结果的缩放。最终,将输出信号的所有历史数据相加得到最终的输出结果。
在 `Main` 方法中,创建了一个 `ButterworthFilter` 实例,并使用该实例对输入信号进行滤波,得到滤波后的输出结果,并输出到控制台。
阅读全文