我有一个包含球体的3d数组,其中球形边界内的数据点为1,在球形边界外,数据点为0.我想取这个数组的fftw,然后将其推回。我应该最终回到球体。
这是我的代码:
int num = 100;
int cube = pow(num, 3);
int i, j, k;
fftw_complex *out;
double *in, *fin;
/* Allocate memory*/
out = (fftw_complex *) fftw_malloc(num * num* (num/2 +1) sizeof(fftw_complex));
in = (double *) fftw_malloc(cube * sizeof(double));
fin = (double *) fftw_malloc(cube * sizeof(double));
/* Initialize fft & ifft plans */
fftw_plan plan;
fftw_plan inv_plan1 ;
plan = fftw_plan_dft_r2c_3d(num,num,num, in, out,FFTW_MEASURE);
inv_plan1 = fftw_plan_dft_c2r_3d(num, num, (num/2 +1), out, fin, FFTW_MEASURE);
int q = 0;
for (i = 0; i < num; i++)
{
for (j = 0; j < num; j++)
{
for (k = 0; k < num; k++)
{
in[q] = vals[i][j][k];
q++;
}
}
}
fftw_execute(plan);
fftw_execute(inv_plan1);
for (k = 0; k < cube; k++)
{
fin[k] =fin[k]/(cube);
}
当我执行此操作然后在结果数据集中绘制切片时,我得到一个包含许多条纹的图像(看起来不像一个球体)。但是,如果我将out的数量从num * num *(num / 2 +1)更改为num * num * num,并将inv_plan1的尺寸从num,num,(num / 2 +1)更改为num,num,num然后我回到了球体。我感到很困惑,因为如果输入的尺寸是n0 x n1 x n2,那么读取rft变换的fftw3文档时,复数输出应该是n0 x n1 x(n2 / 2 + 1)。为什么这不是球体的情况?
(我也是c ++的新手,这是我写的第一个脚本!)