以转置方式存储的FFTW 1D的结果

时间:2014-04-04 15:57:15

标签: c fftw

我想知道是否可以存储来自FFTW的1D FFT调用的转置矩阵。 考虑我的矩阵nrows_1 x w_size。目前它以大小w_size

的大小存储
for (ix = 0 ; ix < nrows_1 ; ix++)
    {
      plan =  fftw_plan_dft_1d(w_size, &source_data[ix*w_size], &transposed_data[ix*w_size],
                   FFTW_FORWARD, FFTW_ESTIMATE);
      fftw_execute(plan);
    }

所以我想使用FFTW调用转置结果矩阵。

1 个答案:

答案 0 :(得分:2)

您可以使用FFTW的Advanced Complex DFT。如果正确设置参数howmanyostride,则可以通过参数odist一次执行所有dft并输出转置。

以下代码演示了它的工作原理。它由gcc main.c -o main -lfftw3 -lm编译:

#include <fftw3.h>
#include <stdio.h>

int main(int argc, char* argv[]){

    int n=9;
    int m=4;

    fftw_complex *datasource=fftw_malloc(sizeof(fftw_complex)*m*n);
    fftw_complex *dataoutput=fftw_malloc(sizeof(fftw_complex)*m*n);

    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            datasource[i*m+j][0]=(i+j)%4+j*j+i*i*i;
            datasource[i*m+j][1]=0;
        }
    }

    printf("input :\n");
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            printf("%g ",datasource[i*m+j][0]);
        }
        printf("\n");
    }



    fftw_plan plan;
    for(i=0;i<n;i++){
        plan =  fftw_plan_dft_1d(m, &datasource[i*m], &dataoutput[i*m],
                FFTW_FORWARD, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);
    }

    printf("expected output, real part, not transposed :\n");
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            printf("%g ",dataoutput[i*m+j][0]);
        }
        printf("\n");
    }

    plan=fftw_plan_many_dft(1, &m, n,
            datasource, NULL, 1, m,
            dataoutput, NULL,n, 1,
            FFTW_FORWARD, FFTW_ESTIMATE);

    fftw_execute(plan);
    fftw_destroy_plan(plan);

    printf("output, real part, already transposed :\n");
    for(j=0;j<m;j++){
        for(i=0;i<n;i++){
            printf("%g ",dataoutput[j*n+i][0]);
        }
        printf("\n");
    }

    fftw_free(datasource);
    fftw_free(dataoutput);

    return 0;
}

我想我的答案为时已晚,无法发挥作用......