在AForge中调用快速傅立叶变换时数据长度不正确

时间:2014-10-21 11:47:20

标签: c# fft aforge

我正在使用C#中的FFT(快速傅立叶变换)函数。 我找到了AForge库,但在使用时我不断收到错误消息:

  

数据长度不正确。

我输入的数据是双打列表,大小可能会有所不同,具体取决于我发送的信号。

该怎么办?

到目前为止,这是我的功能

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);
}

2 个答案:

答案 0 :(得分:1)

根据AForge documentation

  

该方法仅接受2 n 大小的数据数组,其中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);
}

答案 1 :(得分:0)

如果查看AForge FourierTransform source code,您会发现从{FFT}方法调用的ReorderData方法(位于文件底部)。在这种方法中有检查哪个上升错误:

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...
 }

所以你的问题的答案是 - 你的数组长度必须是2的幂,并且在2到16384之间