JTransforms怪异的realInverse和realFoward

时间:2013-12-14 19:45:35

标签: java android

我遇到了一个奇怪的问题。希望你能帮助我! 我试图在android上使用JTransforms(一个java FFT库)来处理图像。首先,我做FFT(realFoward,我没有使用realFowardFull以节省内存)到图像R_pad,然后我使用IFFT(realInverse)来恢复R_pad。

double[][] R_pad = ImagePad(R, picw, pich, kernelxsize, kernelysize);
int R_pad_size1 = R_pad.length;
int R_pad_size2 = R_pad[0].length;  
Log.d("R_pad", "R_pad origin:"+ R_pad[20][13]);
Log.d("R_pad", "R_pad origin:"+ R_pad[40][82]);
// do fft to R_pad
DoubleFFT_2D fft_pad = new DoubleFFT_2D(R_pad_size1,R_pad_size2);       
fft_pad.realForward(R_pad);
// do ifft
fft_pad.realInverse(R_pad, true);
Log.d("R_pad", "R_pad after1:" + R_pad[20][13]);
Log.d("R_pad", "R_pad after1:" + R_pad[40][82]);

根据理论,R_pad应该仍然与原始R_pad相同。但是,我对一些元素进行了采样,发现它们完全不同(不接近)。

所以我写了一个小矩阵来判断这是否是这个库的问题。

double[][] test = new double[][] {{121.0,151.0,132.0,190.0,90.0,71.0,0,0},{201.0,184.0,35.0,92.0,67.0,33.0,0,0},{93.0,104.0,27.0,35.0,88.0,204.0,0,0},{98.0,60.0,94.0,99.0,192.0,45.0,0,0}};
DoubleFFT_2D fft_test = new DoubleFFT_2D(4,8);
for(int j = 0; j <4; j++){
   for (int i = 0; i < 8; i++){ 
      Log.d("test fft", "test fft:"+test[j][i]);
   }
}
fft_test.realForward(test);
fft_test.realInverse(test,true);

for(int j = 0; j <4; j++){
   for (int i = 0; i < 8; i++){
      Log.d("test fft", "test fft:"+test[j][i]);
   }
}

这次结果是对的!我对第一个程序的错误感到困惑。我确信R_pad的宽度和高度分别是2048和1024,两者的幂都是2(realForward和realInverse都需要)。有人能帮帮我吗?非常感谢!

这是JTransforms的网站! https://sites.google.com/site/piotrwendykier/software/jtransforms

1 个答案:

答案 0 :(得分:0)

从jTransforms文档中,在2d双数组的realForward和realInverse方法的描述中:

“此方法仅在两个尺寸的大小均为2的幂数时才有效”

这就是为什么你的第二个例子工作正常,因为4和8都是2的幂。

所以我相信你应该将每个维度的长度数据填充为2的幂,或者使用complexForward和complexInverse。