2

私はJavaでCSEクラスの割り当てを行っており、FFTと直接DFT(行列計算を使用)を実装しています。FFTは正常に機能しますが、直接DFTが機能しません。私のフーリエ行列は正しい値で出てこないので、それがユーザーエラーであるかどうか、または問題が代わりに使用しているComplexクラス(org.apache.commons.math.complex)にあるかどうかを知りたいです。そのような主流のクラスでは、それは単なるユーザーエラーだと思います。誰かがそれを指摘できれば、それは素晴らしいことです。

私のフーリエ行列の計算は次のように機能します。

Complex[][] fmatrix = new Complex[cvector.length][cvector.length]; // Initialize Matrix
    for(int k = 0; k < n; k++) { 
        double val = -2.0 * k * Math.PI / n; // Calculate exponential value
        Complex w = new Complex(0.0,val); // Store that in a Complex value and set imaginary piece to the exponential value
        for (int l = 0; l < n; l++) {
            Complex powerof = new Complex((double) (k*l),0.0); // Calculate the power to take it to
            fmatrix[k][l] = w.exp().pow(powerof); // Take the exponent, then raise it to powerof
        }
    }

デバッグの目的でいくつかの項目を変数に引き出していますが、コードはすべて私の理解から機能するはずです。

ただし、上記のコードは、長さ4のベクトルの場合、次の行列を生成します。

      Mine                    Desired
[ 1,  1,  1, 1          [  1,  1,  1,  1
  1, -j, -1, j             1, -j, -1,  j
  1,  1,  1, 1     =/=     1, -1,  1, -1
  1, -j, -1, j ]           1,  j, -1, -j ]

どんな助けでも大歓迎です。

4

1 に答える 1

6

私はちょうどあなたのコードをちらっと見て、FFTとDFT(DFTにとっては非常に長い時間)を行ってからしばらく経っているので、最初に数学を見ることにしました:私はこの行について疑問に思っています:

double val = -2.0 * k * Math.PI / n; // Calculate exponential value

私が見る方程式は-2PIi / nであり、複雑なクラスでiが必要だとは思わないので、なぜkがそこにあるのかわかりません。それがあなたの問題ではないかと思います。私が持っていた質問です。他に何か見つけたらまた投稿します。

于 2011-03-04T17:47:39.553 に答える