Math.NET 4.0 的 FFT - Complex32[] 与 Complex[]

FFT with Math.NET 4.0 - Complex32[] vs. Complex[]

我在使用 Math.NET 和 .NET4.0 从我的数据集计算 FFT 时遇到问题。

我使用 .NET 3.5 和 Math.NET 像这样没有任何错误:

    public Ergebnisse_FFT_Abs_PSD_MNF FFT_Abs_PSD_MNF(double[] data) 
    {
       Complex[] samples = new Complex[data.Length];
       double[] FFT_abs_1d = new double[data.Length / 2];

       int zaehler = 0;
       foreach(double val in data)
       {
          samples[zaehler] = new Complex(val, 0);
          Fenster[zaehler] = Math.Exp(-0.5 * Math.Pow(((zaehler - (samples.Length - 1) / 2) / (sigma * (samples.Length - 1) / 2)), 2)); // Gauß
          samples[zaehler] = samples[zaehler].Real * Fenster[zaehler];
          zaehler++;
       }   
       MathNet.Numerics.IntegralTransforms.Fourier.BluesteinForward(samples, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
    }

现在我想使用 .NET 4.0,而 Complex[] 不再为人所知——只有 Complex32。 当我现在将 Complex[] 更改为 Complex32[]:

    public Ergebnisse_FFT_Abs_PSD_MNF FFT_Abs_PSD_MNF(double[] data) 
    {
       Complex32[] samples = new Complex32[data.Length];
       double[] FFT_abs_1d = new double[data.Length / 2];

       int zaehler = 0;
       foreach(double val in data)
       {
          samples[zaehler] = new Complex32((float)val, 0);
          Fenster[zaehler] = Math.Exp(-0.5 * Math.Pow(((zaehler - (samples.Length - 1) / 2) / (sigma * (samples.Length - 1) / 2)), 2)); // Gauß
          samples[zaehler] = samples[zaehler].Real * (float)Fenster[zaehler];
          zaehler++;
       }       

       MathNet.Numerics.IntegralTransforms.Fourier.BluesteinForward(samples, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
    }

出现此错误消息:

Error 7 The best overloaded method match for 'MathNet.Numerics.IntegralTransforms.Fourier.BluesteinForward(System.Numerics.Complex[], MathNet.Numerics.IntegralTransforms.FourierOptions)' has some invalid arguments

有没有人知道如何在 .NET 4.0 下解决这个问题?

Hans Passant 的评论是正确的 - 只需添加对 System.Numerics 的引用即可。从技术上讲,这是在 NuGet 包中声明的,并且应该在重新安装包后自动添加到项目中(更改项目的目标框架时需要这样做)。

.Net 3.5 中没有 System.Numerics,这就是为什么 Math.NET Numerics 在那里带来了自己的实现,但对于 .Net 4.0 和更新版本,它使用 built-in 类型 System.Numerics 为了与生态系统兼容。