0

我正在尝试编写一个简单的 FFTW 例程(第 2 版),我想我已经把骨头搞定了,但是当我调用 fftwnd_one 函数时,我遇到了持久的段错误(我正在做一个维变换,但我使用 n 维代码是为了模块化)。但是,我认为我的问题出在计划创建中;谁能提供一些关于这段代码有什么问题的见解?如果是这样,我将不胜感激 - 谢谢!

作为参考,我在这里使用的函数是 sin(x)。我意识到并非所有的数学运算都已实现,我只是想让 FFTW2 库首先工作,然后我才能使数据变得有用。

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

int main(){
  int i;
  fftw_complex in[8];
  fftwnd_plan p;
  const int *n;
  int temp = (int)pow(2, 2)*pow(3,2)*pow(5,1)*pow(7,1)*pow(11,1)*pow(13,0);
  n = &temp;

  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]);
  }
  return 0;
}
4

2 回答 2

1

前两个参数fftwnd_create_plan看起来完全错误。您似乎只想为大小为 8 的 1D FFT 创建计划(这引发了一个问题,即如果您只需要 1D FFT,为什么要使用 fftwnd_create_plan ?)。调用应该是这样的:

const int n = 8;
p = fftwnd_create_plan(1,   // rank = 1, i.e. 1D
                       &n,  // size of first (and only) dimension = n = 8
                       FFTW_FORWARD,
                       FFTW_ESIMATE | FFTW_IN_PLACE);
于 2011-05-17T06:41:20.810 回答
0

当它只指向一个整数时,您似乎将 n 视为一个数组。例如,不应该这样:

printf("%d\n", n[i]);

是:

printf("%d\n", in[i]);
于 2011-05-17T06:06:48.890 回答