我试图在点列表上使用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;
}
知道怎么解决吗?谢谢:)
答案 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;
}