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



我想知道是否可以存储来自 FFTW 的一维 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 调用转置结果矩阵。

您可以使用 FFTW 的高级复杂 DFT。由于参数howmany,所有dft都可以一次执行,如果参数ostrideodist设置正确,则输出被转置。

以下代码演示了它的工作原理。它由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;
}

我想我的回答来得太晚了,没有用...

最新更新