【问题标题】:Problem with FFTW2 routine in CC中FFTW2例程的问题
【发布时间】:2025-12-20 15:10:10
【问题描述】:

我目前正在使用 FFTW2(西方最快的傅立叶变换)库,在用 Fortran 编写了一个成功的例程后,我正在转向 C。但是,当我在分配数据时遇到了一些问题尝试输入要转换的数据(即 sin(x) 的值)。目前,我的代码是:

#include <stdio.h>
#include <fftw.h>
#include <math.h>
#include <complex.h>

void compute_fft(){
  int i;
  const int n[8];
  fftw_complex in[8];
  fftwnd_plan p;

  in[0]->re = 0;
  in[1]->re = (sqrt(2)/2);
  in[2]->re = 1;
  in[3]->re = (sqrt(2)/2);
  in[4]->re = 0;
  in[5]->re = -(sqrt(2)/2);
  in[6]->re = -1;
  in[7]->re = -(sqrt(2)/2);

  for(i = 0; i < 8; i++){
    (in[i])->im = 0;
  }

  p = fftwnd_create_plan(8, n, FFTW_FORWARD, FFTW_ESIMATE | FFTW_IN_PLACE);
  fftwnd_one(p, &in[0], NULL);
  fftwnd_destroy_plan(p);

  printf("Sin\n");
  for(i = 0; i < 8; i++){
    printf("%d\n", n[i]);
  }
}

我一直在使用这个http://fftw.org/fftw2_doc/ 链接来进行文档/教程,目前我的错误是“a->a 的类型参数无效(具有 afftw_complexa)”,并且“a”字符位于-> 和 fftw_complex 上面有克拉。我使用的模式与我在 Fortran 中编写时所用的模式基本相同,而且我似乎正在遵循教程,实际上只是这里的这个作业让我弄乱了语法。作为记录,我使用的编译器是 nvcc,如果它有所作为(我之前尝试过 gcc)。如果这里的任何人以前都使用过 C 语言中的 FFTW2,你能帮我纠正我的错误吗?谢谢!

【问题讨论】:

标签: c fftw


【解决方案1】:

这可能是因为你的数组“in”是一个 fftw_complex 数组,所以不要使用 in[0]->re = 0,你应该像 in[0].re = 0 一样使用它。除非 fftw_complex 再次出现类型定义到某个数组。

fftw_complex in[8];
in[0].re = 0;
in[1].re = (sqrt(2)/2);
in[2].re = 1;
in[3].re = (sqrt(2)/2);
in[4].re = 0;
in[5].re = -(sqrt(2)/2);
in[6].re = -1;
in[7].re = -(sqrt(2)/2);

【讨论】:

  • 哇...我不敢相信它这么简单。谢谢!
  • main 是否需要一些参数?或者这可能与您传递给编译器/链接器的参数有关。
【解决方案2】:

由于 ffwt_complex 是一个 double[2],它是真实数据的第一个维度 ([0]) 和虚构数据的第二个维度 ([1]),因此安全的解决方案是:

  in[0][0] = 0;
  in[1][0] = (sqrt(2)/2);
  in[2][0] = 1;
  in[3][0] = (sqrt(2)/2);
  in[4][0] = 0;
  in[5][0] = -(sqrt(2)/2);
  in[6][0] = -1;
  in[7][0] = -(sqrt(2)/2);

 for(i = 0; i < 8; i++){
   in[i][1] = 0;
  }

【讨论】: