r2c 3d fftw变换的输出不是n / 2 + 1

时间:2017-04-04 14:56:42

标签: c++ fftw

我有一个包含球体的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 ++的新手,这是我写的第一个脚本!)

0 个答案:

没有答案