我正在尝试在一些 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 相比我仍然得到错误的结果。)