在C#中实现FIR滤波器

5

目前我正在尝试在波形文件上实现一个FIR低通滤波器。使用MATLAB得到了40阶的FIR系数。现在我需要在C#中实现FIR算法,但发现很难实现。

有什么帮助吗?

谢谢


2
你有什么特别困难的地方吗? - ladenedge
我在实现以下这个系列时遇到了困难: y[n]=b0x[n]+b1x[n-1]+....bmx[n-M]其中,y[n]是输出结果,x[n]是输入。我不知道如何在C#中实现它。 - Tristan Demanuele
2个回答

6
这样怎么样?
private static double[] FIR(double[] b, double[] x)
{
    int M = b.Length;
    int n = x.Length;
    //y[n]=b0x[n]+b1x[n-1]+....bmx[n-M]
    var y = new double[n];
    for (int yi = 0; yi < n; yi++)
    {
        double t = 0.0;
        for (int bi = M-1; bi >=0; bi--)
        {
            if (yi - bi < 0) continue;

            t += b[bi] * x[yi - bi];
        }
        y[yi] = t;    
    }
    return y;
}

2

试试这个。它有帮助吗?

static void Main()
{
    var bb = new List<double> { 1, 2, 3, 4 };
    var xx = new List<double> { 3, 3, 4, 5 };

    var yy = func_FIR(bb, xx);

    for (int i = 0; i < yy.Count; i++)
    {
        Console.WriteLine("y[{0}] = {1}",i,yy[i]);
    }

}

public static List<double> func_FIR(List<double> b, List<double> x)
{
    //y[n]=b0x[n]+b1x[n-1]+....bmx[n-M]

    var y = new List<double>();

    int M = b.Count;
    int n = x.Count;

    double t = 0.0;

    for (int j = 0; j < n; j++)
    {
        for (int i = 0; i < M; i++)
        {
            t += b[i] * x[n - i-1];
        }
        y.Add(t);    
    }

    return y;
}

它听起来很有道理,我会尝试一下并看看它是否有效。谢谢。 - Tristan Demanuele
我尝试运行这段代码,但它没有起作用,或者是我做错了什么... 我的参数是:220500个样本,40个阶数(FIR滤波器)。 有没有可能将上述代码适应于我的解决方案? - Tristan Demanuele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接