FFTW 实数到实数的变换带步长数组

9
我有一个以行为主序存储的矩阵。我正在尝试使用FFTW计算ub矩阵的DCT,但结果是无意义的。在接下来的段落中,我将描述问题和我的解决方案,并希望您能帮助我理解为什么它不起作用。
给定一些i和l,我想计算由所有行k组成的子矩阵的DCT,其中k mod l == i。例如,假设l = 3i = 2。在以下矩阵中,我要转换的子矩阵用红色标记出来(2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2)。 Matrix 源和目标数组具有相同的布局,转换后的矩阵应存储在目标数组的相同位置。
void transform(double* src, double* dest, size_t rows, size_t cols, size_t l, size_t i)
{
    int rank = 2;
    fftw_iodim64 dims[] = {
        { rows / l, l, l },
        { cols, rows, rows } };
    fftw_r2r_kind kind = FFTW_REDFT10;

    fftw_plan plan = fftw_plan_guru64_r2r(rank, dims, 0, NULL, src + l, dest + l, &kind, FFTW_ESTIMATE | FFTW_UNALIGNED | FFTW_PRESERVE_INPUT);
    fftw_execute(plan);
    fftw_destroy_plan(pla);
}

更新

我测试了当i=l=1时的简单情况。即使在这种情况下,我也得到了无意义的结果。我使用了一个3x4矩阵,它恰好是DCT基向量之一:

A(i,j) = cos((i + 0.5)*2*pi/3) * cos((j + 0.5)*3*pi/4)

我期望得到的结果是除一个元素外其他元素都接近于零,但是实际上我得到了下面这个矩阵:

0             -2.22045e-016  1.33227e-015  2.22045e-016
2.22045e-016  -2.77556e-016  9.99201e-016  5.55112e-017
-8.88178e-016 -1.62359       7.83938       1.62359

看起来非常奇怪。

更新2

我还测试了一个简单矩阵,其中(0,0)元素为1,其余为零。 在这种情况下,i=l=1(子矩阵是整个矩阵)。 这是结果:

      2       2       2       0
1.73205 1.73205 1.73205       0
      1       1       1       0

你能用一些明显的输入(简单的1和0的模式)进行测试,并查看输出结果吗?也许在这里发布,这样别人就可以了解出了什么问题? - Jonas Schäfer
我做了其他的事情。我用DCT基向量之一填充了子矩阵。我得到的结果不是除了一个非零元素外全是零。我得到了许多非零元素的结果。 - Alex Shtof
你没有在任何地方指定输入步长为2*行。 - Jens Munk
@JensMunk,"input stride"是什么意思?我在每个维度上都有一个步幅。在第一维中,步幅为行数/ l,在第二维中,步幅为行数。你指的是什么? - Alex Shtof
为什么不可以呢?在这里,我指定了每一行中相邻元素之间的跨度(在这种情况下为3),以及每一列中相邻元素之间的跨度。除了每个维度的大小和跨度外,FFTW还需要哪些信息呢? - Alex Shtof
显示剩余5条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接