c - FFTW 实到实变换跨步阵列

标签 c arrays matrix fftw

我有一个按行优先顺序存储的矩阵。我正在尝试使用 FFTW 计算子矩阵的 DCT,但我胡说八道。在接下来的段落中,我将描述问题和我的解决方案,我希望您能帮助理解为什么它不起作用。

给定一些 il,我想计算一个子矩阵的 DCT,该子矩阵由所有 k 行组成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 基 vector 之一:

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

最佳答案

关于c - FFTW 实到实变换跨步阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719794/

相关文章:

php - 第 15 行的 fatal error : Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes) in/home/content/08/10674308/html/Arraytest. php

python - 字典与 NumPy 数组性能 Python

c - 如何为我的 C 项目创建 makefile?

c - 在 C 函数指针中传递更多参数

c - C中扫描字符的问题

javascript - 循环遍历数组匹配变量并分配执行条件

c++ - 寻找用于信号处理的良好 C/C++ 小波库

python - 如何使对象在按键时在对象数组中移动?

多维动态数组中的 C++ 对象构造

r - 通过切片行名将 2 列数据帧转换为矩阵 - R