離散フーリエ変換を実装しようとしていますが、機能していません。おそらくどこかにバグを書いたと思いますが、まだ見つけていません。
次の式に基づきます。
この関数は最初のループを実行し、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;
}
そして実際の計算では、おそらくこれがバグの場所です。
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秒でこの問題を解決できます。しかし、私は自分の実装で何を間違えたのかまだわかりません。
私は自分の欠陥がどこにあるのか、そして私が間違って解釈したものに本当に興味があります。