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 为了与生态系统兼容。
我在使用 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 为了与生态系统兼容。