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

您为循环的每次迭代重用相同的行数组。

因此,在两个循环结束时,您的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;
}

此外,我相信您的声明realVals1imagVals1是a)效率低下和b)错误的方式。我怀疑你想要:

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

无论如何你都要替换元素,所以填充一堆空行没有意义......

于 2013-03-20T20:44:59.350 回答
2

您每次通过内部循环重用相同的数组 realRow 和 imagRow 。由于 Java 使用引用,因此当您分配 realVals1[y]=realRow 时,您分配了一个引用。由于您始终使用相同的数组,因此您将所有行分配给相同的数组引用。这不是你想要的。您需要在外部 for 循环的顶部将 realRow 和 imagRow 重新创建为新的 double[]。

于 2013-03-20T20:45:48.777 回答