我想知道是否可以存储来自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调用转置结果矩阵。
答案 0 :(得分:2)
您可以使用FFTW的Advanced Complex DFT。如果正确设置参数howmany
和ostride
,则可以通过参数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;
}
我想我的答案为时已晚,无法发挥作用......