我正在使用我在网上找到的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循环后,我再次打印它们,什么都没得到!可能是什么问题呢?感谢您的帮助!
答案 0 :(得分:3)
你正在为循环的每次迭代重复使用相同的行数组。
因此,在两个循环结束时,您的realVals1
和imagVals1
将分别对同一个数组进行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;
}
此外,我相信您对realVals1
和imagVals1
的声明效率低,而b)方向错误。我怀疑你想要:
double[][] realVals1 = new double[h][];
double[][] imagVals1 = new double[h][];
无论如何你都要替换元素,所以填充一堆空行没有意义......
答案 1 :(得分:2)
您每次通过内循环重复使用相同的数组realRow和imagRow。由于Java使用引用,因此在分配realVals1 [y] = realRow时,可以分配引用。由于始终使用相同的数组,因此将所有行分配给相同的数组引用。这不是你想要的。你需要在外部for循环的顶部重新创建realRow和imagRow到一个新的double []。