0

オンラインで見つけた FFT クラスを使用して、画像の FFT を計算しています。FFT を計算するコードは次のとおりです。

この例では、w (幅) と h (高さ) は同じ値です。

FFT2 fft = new FFT2(w);
double[] realRow = new double[w];
double[] imagRow = new double[w];
double[][] realVals1 = new double[w][h];
double[][] imagVals1 = new double[w][h];

for (int y = 0; y < h; y++)
    {   
        for (int x = 0; x < w; x++)
        {
            pixel = bmporiginal.getPixel(x, y);
            R = (int) (Color.red(pixel));
            G = (int) (Color.green(pixel) );
            B = (int) (Color.blue(pixel));

            I = ((R+G+B)/3);
            I *= Math.pow(-1, (x+y) % 2.0 );
            realRow[x] = I;
            imagRow[x] = 0.0;
        }
            fft.fft(realRow, imagRow);
            realVals1[y] = realRow;
            imagVals1[y] = imagRow;
    }

必要な値は、realVals と ImagVals に格納されています。これらの値を for ループ内で出力して、適切な値を取得できます。forループを離れた後、それらを再度印刷しましたが、何も得られません!!! 何が問題なのですか?私はあなたの助けに感謝します!

4

2 に答える 2

3

ループの反復ごとに同じ行配列を再利用しています。

したがって、2つのループの最後で、realVals1imagVals1はそれぞれh同じ配列への参照を持ちます。外側のループの反復ごとに新しい配列を作成する必要があります。

for (int y = 0; y < h; y++)
{   
    double[] realRow = new double[w];
    double[] imagRow = new double[w];

    for (int x = 0; x < w; x++)
    {
        ...
    }
    fft.fft(realRow, imagRow);
    realVals1[y] = realRow;
    imagVals1[y] = imagRow;
}

さらに、私はあなたの宣言がa)非効率的でb)間違った方法であるrealVals1と信じています。imagVals1私はあなたが欲しいと思う:

double[][] realVals1 = new double[h][];
double[][] imagVals1 = new double[h][];

とにかく要素を置き換えるので、空の行をたくさん入力しても意味がありません...

于 2013-03-20T20:44:59.350 に答える
2

内側のループを通過するたびに、同じ配列realRowとimagRowを再利用しています。Javaは参照を処理するため、realVals1 [y] = realRowを割り当てるときに、参照を割り当てます。常に同じ配列を使用するため、すべての行を同じ配列参照に割り当てます。それはあなたが望むものではありません。realRowとimagRowを、外側のforループの上部にある新しいdouble[]に再作成する必要があります。

于 2013-03-20T20:45:48.777 に答える