我正在尝试实现离散傅立叶变换,但它不起作用。我可能在某个地方写了一个错误,但我还没有找到它。
基于以下公式:
此函数执行第一个循环,循环 X0 - Xn-1...
public Complex[] Transform(Complex[] data, bool reverse)
{
var transformed = new Complex[data.Length];
for(var i = 0; i < data.Length; i++)
{
//I create a method to calculate a single value
transformed[i] = TransformSingle(i, data, reverse);
}
return transformed;
}
而实际计算,这可能就是bug所在。
private Complex TransformSingle(int k, Complex[] data, bool reverse)
{
var sign = reverse ? 1.0: -1.0;
var transformed = Complex.Zero;
var argument = sign*2.0*Math.PI*k/data.Length;
for(var i = 0; i < data.Length; i++)
{
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
}
return transformed;
}
接下来解释其余代码:
var sign = reverse ? 1.0: -1.0;
反转的 DFT 不会-1
在参数中包含,而常规 DFT 确实-1
在参数中包含 a。
var argument = sign*2.0*Math.PI*k/data.Length;
是算法的参数。这部分:
然后是最后一部分
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
我想我仔细复制了算法,所以我看不出我在哪里犯了错误......
附加信息
正如 Adam Gritt 在他的回答中所表明的那样,AForge.net 对该算法有一个很好的实现。我大概可以通过复制他们的代码在 30 秒内解决这个问题。但是,我仍然不知道我在实施中做错了什么。
我真的很好奇我的缺陷在哪里,以及我的解释是错误的。