System.ArgumentException:给定的数组太小

时间:2017-05-23 16:41:52

标签: c# fft mathnet

我试图在点列表上使用FFT滤波器(每个点都有x和y坐标)我应该得到list<Complex>

在测试下面的代码时(在包含12个点的列表中)我收到此错误

System.ArgumentException : The given array is too small. It must be at least 14 long. at MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(Double[] data, Int32 n, FourierOptions options)

我实际上正在使用Math.net MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, buffer.Length, FourierOptions.Matlab);

这是我班上的代码

        // inputs is a List of Point(List<Point> inputs)
        var buffer=inputs.Select(p => (p.Y)).ToArray();
        try
        {
            MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, buffer.Length, FourierOptions.Matlab);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

知道怎么解决吗?谢谢:)

2 个答案:

答案 0 :(得分:2)

根据精细的手册,缓冲区需要比你拥有的数据长2个项目。

https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/Fourier.htm#ForwardReal

  

void ForwardReal(Double [] data,int n,FourierOptions options)

     

...数据阵列需要为N + 2(如果N为偶数)或N + 1(如果N为奇数)长,以支持这样的打包频谱。

答案 1 :(得分:1)

当我读到code时  在github上,这些想法现在更清晰了。 所以这是我的代码的整改,

        var inputsCount = inputs.Count;
        var buffer =new double[inputsCount % 2 == 0 ? inputsCount + 2 : inputsCount + 1];
        int j = 0;

        foreach (var point in inputs)
        {
            buffer[j] = point.Y;
            j++;
        }

        try
        {
            MathNet.Numerics.IntegralTransforms.Fourier.ForwardReal(buffer, inputsCount, FourierOptions.Matlab);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }