Mathnet过滤截止频率

时间:2017-04-25 16:23:11

标签: c# filter signal-processing mathnet

所以我一直在尝试使用Mathnet过滤库在C#中实现低通过滤器。我有一个问题,因为我不知道如何使用该方法为过滤器创建系数。有人能告诉我如何指定截止频率(它必须是每单位样本)? 例如,如果我希望截止频率为400Hz,那么每单位样本中的截止频率是多少? 感谢。

public Filter(ISampleProvider _source, long Length, int _cutoff)
    {
        source = _source;
        cutoffFrequency = _cutoff;

        float[] s = new float[Length];
        _source.Read(s, 0, (int)Length);
        Normalize(s);

        var coefficients = MathNet.Filtering.FIR.FirCoefficients.LowPass(_source.WaveFormat.SampleRate, (double)400/ ((double)source.WaveFormat.SampleRate/(double)Length), 2);
        MathNet.Filtering.FIR.OnlineFirFilter filter = new MathNet.Filtering.FIR.OnlineFirFilter(coefficients);
        double[] output = Array.ConvertAll(s, x => (double)x);

        double[] output2 = filter.ProcessSamples(output);

        output1 = new float[output2.Length];
        for (int i = 0; i < output2.Length; i++)
        {
            output1[i] = Convert.ToSingle(output2[i]);
        }

    }

我试图通过信号的频率分辨率来划分我想要的频率,但这样信号似乎根本没有变化。

1 个答案:

答案 0 :(得分:0)

我最近一直在试验这个图书馆。下面是一个简单的示例,设置一个具有窗口函数的杉木滤波器来改善它(对于2 MSPS输入和125 kHz截止频率):

            double samplingRate = 2000000;
            double cutoffFreq = 125000;
            int filterWidth = 130;

            var mathNetCoeffs = MathNet.Filtering.FIR.FirCoefficients.LowPass(samplingRate, cutoffFreq, filterWidth/2);
            MathNet.Filtering.Windowing.BlackmanWindow blackmanWindow = new MathNet.Filtering.Windowing.BlackmanWindow();
            blackmanWindow.Width = mathNetCoeffs.Length;
            var windowArr = blackmanWindow.CopyToArray();
            for (int i = 0; i < mathNetCoeffs.Length; i++) mathNetCoeffs[i] *= windowArr[i];
            MathNet.Filtering.FIR.OnlineFirFilter mathNetFilter = new MathNet.Filtering.FIR.OnlineFirFilter(mathNetCoeffs);

窗口功能对于制作工作过滤器非常重要。  汉明是另一个受欢迎的选择,但我在这里使用布莱克曼。然后通过调用ProcessSample或ProcessSamples来使用过滤器:

double mathNetFiltered = mathNetFilter.ProcessSample(value);

另请注意,实际滤镜宽度为filterWidth + 1.您希望实际滤镜宽度为奇数(为了获得良好的滤镜对称性),因此请将filterWidth设置为偶数值。