我正在使用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);
}
答案 0 :(得分:1)
该方法仅接受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之间。