在3D矩阵上使用kiss_fftnd时错误的结果?

时间:2016-04-18 13:52:01

标签: c++ matlab matrix fft kissfft

我试图在某些3D矩阵上使用Kiss FFT,但我的结果与使用Matlab时得到的结果不一致。我想知道是否有人可以帮我确定我是否错误地使用了这个库。

如果在Matlab中对以下2x3x2矩阵进行fftn

    A2 =

   ans(:,:,1) =

   1   2   3
   4   5   6

   ans(:,:,2) =

   7    8    9
   10   11   12

我得到了这个结果

ans(:,:,1) =

   78.00000 +  0.0i   -6.0 +  3.46410i   -6.0 -  3.46410i
  -18.0 +  0.0i    0.0 +  0.0i    0.0 +  0.0i

ans(:,:,2) =

  -36    0    0
    0    0    0

使用kiss_fftnd执行FFT时,我得到此结果(手动格式化结果时)。请注意第二行第二列的差异。

78 + 0i  -6 + 0i        -12 + 6.9282i
0 + 0i   -12 -6.9282i   0 + 0i

-36    0    0
0      0    0 

我在C ++中表示矩阵时使用行主要排序,因此输入数组如下

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0]

这是我用Kiss FFT执行FFT的代码:

int ni = 2;
int nj = 3;
int nk = 2;

std::vector<double> values = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 };
int *dims = new int[3];
dims[0] = ni;
dims[1] = nj;
dims[2] = nk;

int total = ni * nj * nk;

kiss_fftnd_cfg cfg = kiss_fftnd_alloc(dims, 3, false, NULL, NULL);
kiss_fft_cpx *in = new kiss_fft_cpx[total];
kiss_fft_cpx *out = new kiss_fft_cpx[total];

for (int i = 0; i < total; ++i) {
    in[i].r = values[i];
    in[i].i = 0.0;
}

kiss_fftnd(cfg, in, out);

我得到的输出如下(添加了i来标记复杂部分):

[78 + 0i,  -6 + 0i,  -12 + 6.9282i, 0 + 0i, -12 + -6.9282i, 0 + 0i, -36 + 0i, 0 + 0i, 0 + 0i, 0 + 0i, 0 + 0i, 0 + 0i]

使用图书馆时我做错了什么?我认为Kiss FFT使用行主要排序(我已尝试使用列主要排序,但与Matlab相比,我仍然得到错误的结果。)

0 个答案:

没有答案