【发布时间】:2011-04-19 11:45:29
【问题描述】:
我正在尝试实现离散傅立叶变换,但它不起作用。我可能在某个地方写了一个错误,但我还没有找到它。
基于以下公式:
此函数执行第一个循环,循环 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。
var argument = sign*2.0*Math.PI*k/data.Length; 是算法的参数。这部分:
然后是最后一部分
transformed += data[i]*Complex.FromPolarCoordinates(1, argument*i);
我想我是仔细复制了算法,所以我看不出我在哪里犯了错误......
其他信息
正如 Adam Gritt 在他的回答中所表明的,AForge.net 对该算法进行了很好的实现。我大概可以通过复制他们的代码在 30 秒内解决这个问题。但是,我仍然不知道我在实施中做错了什么。
我真的很好奇我的缺陷在哪里,以及我解释错了什么。
【问题讨论】:
-
无论如何,你已经很好地提出了这个问题。 +1。
-
哈哈谢谢。实际上,我希望通过提出这样的问题,我自己会发现错误。但是太糟糕了xD
-
呃...不要拖钓(太多):但实现是在 C# 中?我很好奇任何基准测试结果...
-
哦呵呵 xD 这不是为了快速的结果。如果我想要,我会使用一个好的其他库。我只是想学习和理解这一点。我也会做一个 FFT,然后尝试优化它。但首先我想知道为什么这不起作用:p
-
换句话说,它非常慢
标签: c# c#-4.0 fft complex-numbers