我有一个由结构double input[N][M]
表示的实矩阵,我想在N方向上为每列j = 0..M采用1D FT。我对此的尝试如下:
#include <fftw3.h>
#include <math.h>
#define M_PI 3.14159265358979323846264338327
int main(void)
{
int N = 16; int M = 2;
double input[N][M]; // input data
double *in = (double *) input;
fftw_complex output[N][M]; // output data
fftw_complex *out = (fftw_complex *) output;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
double x = (double) i / (double) N;
input[i][j] = sin(2*(j+1) * M_PI * x);
fprintf (stderr, "input[%d][%d] = %.9f, ", i, j, input[i][j]);
}
fprintf (stderr, "\n");
}
fprintf (stderr, "\n");
// setup plans
int rank = 1; int howmany = M;
int istride = M; int ostride = M; int idist = 1; int odist = 1;
fftw_plan fp = fftw_plan_many_dft_r2c(rank, &N, howmany,
in, NULL, istride, idist,
out, NULL, ostride, odist,
FFTW_MEASURE);
// take the forward transform
fftw_execute(fp); fprintf (stderr, "FFT complete\n");
for (int j = 0; j < M; ++j)
for (int i = 0; i < N/2; ++i)
fprintf (stderr, "OUT[%3d] = (%.4f + %.4fi)\n",
i, output[i][j][0], output[i][j][1]);
fprintf (stderr, "\n");
fftw_destroy_plan(fp);
return 0;
}
我正在使用gcc fft.c -std=c99 -g -lfftw3 -lm
进行编译。但是代码似乎不起作用:FT输出全为零(参见here)
该功能的文档是here。
编辑:更新,因此它似乎只适用于FFTW_ESTIMATE,而不适用于任何other flags。知道为什么会这样吗?
答案 0 :(得分:1)
重要提示:规划人员在规划期间会覆盖输入数组 除非保存计划(见智慧)可用于该问题,所以你 应在创建计划后初始化输入数据。唯一的 对此的例外是FFTW_ESTIMATE和FFTW_WISDOM_ONLY标志, 如下所述。
所以它正在设置计划并覆盖输入:简单的解决方案是在数据阵列初始化之前移动计划创建。
工作示例代码(FT转发,然后返回)here。
答案 1 :(得分:0)
罪魁祸首可能是这个宣言:
double *in = (double *) in;
这将in
声明为指向double
(或双精度数组)的指针。然后你指出它自己,但它并没有指出任何特殊的开始。这意味着当指针被解除引用时,它与取消引用未初始化的指针相同,这是未定义的行为,并且很可能导致崩溃。
你可能意味着要指向input
?