C# 在FORGE中调用快速傅里叶变换时数据长度不正确

C# 在FORGE中调用快速傅里叶变换时数据长度不正确,c#,fft,aforge,C#,Fft,Aforge,我正在研究C#中的FFT(快速傅立叶变换)函数。 我发现了一个RGE库,但在使用它时,我不断收到错误消息: 数据长度不正确 我输入的数据是一个双倍列表,大小可能会有所不同,这取决于我发送的信号 怎么办 到目前为止,我的函数就是这样的 private void FastFoulierMethod(ISignal signal, List<IMarker> markers) { AForge.Math.Complex[] complex = new AForge.Math.Com

我正在研究C#中的FFT(快速傅立叶变换)函数。 我发现了一个RGE库,但在使用它时,我不断收到错误消息:

数据长度不正确

我输入的数据是一个双倍列表,大小可能会有所不同,这取决于我发送的信号

怎么办

到目前为止,我的函数就是这样的

private void FastFoulierMethod(ISignal signal, List<IMarker> markers)
{
    AForge.Math.Complex[] complex = new AForge.Math.Complex[samples.Count];
    for (int i = 0; i < samples.Count-1; i++)
    {
         complex[i] = new AForge.Math.Complex(samples[i].GetTimeInSec(),0);
    }
    AForge.Math.Complex[] complex2 = complex;
    FourierTransform.DFT(complex, FourierTransform.Direction.Backward);
    FourierTransform.FFT(complex2, FourierTransform.Direction.Backward);
}
private void-fastfouriermethod(ISignal信号、列表标记)
{
AForge.Math.Complex[]Complex=新的AForge.Math.Complex[samples.Count];
对于(int i=0;i
如果查看,您将找到从FFT方法调用的
重新排序数据方法(在文件底部)。在这种方法中,有一种会引起错误的检查:

private static void ReorderData( Complex[] data )
{
    int len = data.Length;
    // check data length
    if ( ( len < minLength ) || ( len > maxLength ) || ( !Tools.IsPowerOf2( len ) ) )
        throw new ArgumentException( "Incorrect data length." );

    //rest of code...
 }
私有静态void-ReorderData(复杂[]数据)
{
int len=数据长度;
//检查数据长度
如果((lenmaxLength)| |(!Tools.ispowerrof2(len)))
抛出新ArgumentException(“数据长度不正确”);
//代码的其余部分。。。
}
因此,您的问题的答案是-您的数组长度必须是2的幂,并且必须介于2和16384之间,如下所示:

该方法只接受2n大小的数据数组,其中n可能在[1,14]范围内变化

因此,您需要确保输入大小正确填充到2的幂的长度,并且在指定的范围内:

double logLength    = Math.Ceiling(Math.Log((double)sample.Count, 2.0));
int    paddedLength = (int) Math.Pow(2.0, Math.Min(Math.Max(1.0, logLength), 14.0));
AForge.Math.Complex[] complex = new AForge.Math.Complex[paddedLength];

// copy all input samples
int i = 0;
for (; i < sample.Count; i++)
{
    complex[i] = new AForge.Math.Complex(samples[i].GetTimeInSec(),0);
}
// pad with zeros
for (; i < paddedLength; i++)
{
    complex[i] = new AForge.Math.Complex(0,0);
}
double logLength=Math.天花(Math.Log((double)sample.Count,2.0));
int paddedLength=(int)Math.Pow(2.0,Math.Min(Math.Max(1.0,logLength),14.0));
AForge.Math.Complex[]Complex=新的AForge.Math.Complex[paddedLength];
//复制所有输入样本
int i=0;
对于(;i
样本数组从何而来?欢迎使用。第一。第二,你哪里出错了?第三,您可能缺少
i
的最后一个数组项<代码>样本数组在项目的早期创建,在特定时间跨度之间读取csv文件。数组中的最后一项始终是我们不使用的零值。谢谢您的回答,我们已经考虑过了。问题是我们放入的数组并不总是相同的长度。另外,我们不能仅仅从数组中丢弃项来获得2的幂,所以我应该如何解决这个问题。可能您需要制作一个更大的数组,大小为2^n,填充数据,数组的其余部分填充不改变逻辑的数据(0、1或其他),通过使用您的代码,复杂的填充会非常奇怪。请看下面的屏幕截图:。这样我得到了一个非常奇怪的fft图形:。我做错了什么?我将数据副本留在
complex[i]
中,因为您已经设置了它们(我已经演示了如何填充您想要进行FFT的任何数据)。我无法判断数据的实部是否实际上与您的数据(我没有),但虚部似乎约为0(根据复制的实例)。“FFT图形”似乎显示了输入数据的图形(即预FFT),轴是实/虚分量,而不是更常见的幅值与频率。