Hi,
Just for testing purpose, I want to calculate the FFT for a 4x4x2 (3D)
matrix. The matrix looks like this:
in(:,:,1) =
0 4 8 12
1 5 9 13
2 6 10 14
3 7 11 15
in(:,:,2) =
16 20 24 28
17 21 25 29
18 22 26 30
19 23 27 31
Matlab Result:
out(:,:,1) =
1.0e+02 *
4.9600 -0.6400 + 0.6400i -0.6400 -0.6400 -
0.6400i
-0.1600 + 0.1600i 0 0 0
-0.1600 0 0 0
-0.1600 - 0.1600i 0 0 0
out(:,:,2) =
-256 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
FFTW Result: (x,y) means x+j*y
FFT
k=0
(496.00, 0.00) (-64.00, 0.00) (-8.00, 8.00) (0.00, 0.00)
(-128.00, 0.00) (0.00, 0.00) (-8.00, -8.00) (0.00, 0.00)
(-128.00, 128.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
(0.00, 0.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
k=1
(-32.00, 0.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
(0.00, 0.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
(-128.00, -128.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
(0.00, 0.00) (0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
They are aparently very different. The wierd thing is when I run
inverse transform, both Matlab and FFTW returns the original result.
Can anyone tell me which result is correct and why the other is wrong?
Following is my source code.
Matlab Source:
in = zeros(4,4,2); in(:) = 0:31
out = fftn(in)
C Source: (require FFTW)
int test3d_r2c() {
fftw_complex *in, *out;
int szx, szy, szz;
fftw_plan p,p2;
int i, j, k;
szx = 4; szy = 4; szz = 2;
in = fftw_malloc(sizeof(fftw_complex) * szx * szy * szz );
out = fftw_malloc(sizeof(fftw_complex) * szx * szy * szz );
p = fftw_plan_dft_3d( szx, szy, szz,in, out, FFTW_FORWARD,
FFTW_ESTIMATE );
p2 = fftw_plan_dft_3d( szx, szy, szz,out, in, FFTW_BACKWARD ,
FFTW_ESTIMATE );
for( k = 0; k < szz; k++ ) {
for( j = 0; j < szy; j++ ) {
for( i = 0; i < szx; i++ ) {
in[ k*szx*szy + i + j*szx ][0] = k*szx*szy + i*szy +
j;
in[ k*szx*szy + i + j*szx ][1] = 0;
}
}
}
fftw_execute(p);
printf("Original\n");
for( k = 0; k < szz; k++ ) {
printf("k=%d\n",k);
for( j = 0; j < szy; j++ ) {
for( i = 0; i < szx; i++ ) {
printf("(%.2f, %.2f)\t",
in[k*szx*szy + i + j * szx][0],
in[k*szx*szy + i + j * szx][1]);
}
printf("\n");
}
}
printf("\nFFT\n");
for( k = 0; k < szz; k++ ) {
printf("k=%d\n",k);
for( j = 0; j < szy; j++ ) {
for( i = 0; i < szx; i++ ) {
printf("(%.2f, %.2f)\t", (double)out[k*szx*szy + i + j
* szx][0], (double)out[k*szx*szy + i + j * szx][1]);
}
printf("\n");
}
}
fftw_execute(p2);
printf("\nInverse\n");
for( k = 0; k < szz; k++ ) {
printf("k=%d\n",k);
for( j = 0; j < szy; j++ ) {
for( i = 0; i < szx; i++ ) {
printf("(%.2f, %.2f)\t",
in[k*szx*szy + i + j * szx][0]/szx/szy/szz,
in[k*szx*szy + i + j * szx][1]/szx/szy/szz);
}
printf("\n");
}
}
fftw_destroy_plan(p);
fftw_destroy_plan(p2);
fftw_free(in); fftw_free(out);
return 0;
}