MathNet.Filter不过滤数据

时间:2015-05-18 19:39:21

标签: c# .net signal-processing mathnet

我使用Math.Net.Numerics首先使用正弦波填充数组,然后使用Math.Net.Filtering创建带通以过滤数据,如下所示:

void Main()
{
    double[] preProcessedData = new double[128];
    double[] postProcessedData = new double[128];

    //Generate sinewave (350Hz, 250 samples) 
    preProcessedData = MathNet.Numerics.Generate.Sinusoidal(250, 44100, 350, 20);

    postProcessedData = preProcessedData;


    MathNet.Filtering.OnlineFilter bandPass = MathNet.Filtering.OnlineFilter.CreateBandpass(MathNet.Filtering.ImpulseResponse.Finite, 44100, 390, 410);
    bandPass.ProcessSamples(postProcessedData);

    //LINQPad extensions
    preProcessedData.Dump();
    postProcessedData.Dump();
}

然而,这似乎根本没有过滤样本,如此处所示(相同):

Unfiltered  Filtered
1.139189962 1.139189962
2.274680952 2.274680952
3.402786006 3.402786006
4.519842146 4.519842146
5.622222267 5.622222267
6.706346918 6.706346918
7.768695925 7.768695925
8.80581982  8.80581982
9.81435104  9.81435104
10.79101486 10.79101486
11.73264004 11.73264004
12.6361691  12.6361691
13.49866827 13.49866827
14.31733699 14.31733699
15.08951702 15.08951702
15.81270108 15.81270108
16.48454099 16.48454099
17.10285526 17.10285526

我做错了什么?图书馆可用的文件似乎还不完整,所以我从那里学到的东西不多。

1 个答案:

答案 0 :(得分:2)

ProcessSamples方法似乎不会修改输入数组,而是返回一个新的已过滤数组。你需要:

postProcessedData = bandPass.ProcessSamples(preProcessedData);

(此处为documentation。)

顺便提一句,这段代码来自您的代码:

postProcessedData = preProcessedData;

可能并没有做你正在思考的事情。它没有复制数据;它只是将postProcessedData指向preProcessedData指向的同一个数组。因此,如果ProcessSamples 修改输入数组,则处理后preProcessedDatapostProcessedData将相等。