FFTW Segfault (Вероятно, простой ответ) - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь написать простую подпрограмму FFTW (версия 2), и я думаю, что я чуть не сломал кости, но я сталкиваюсь с постоянным segfault, когда я вызываю функцию 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;
}

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Первые два параметра fftwnd_create_plan выглядят совершенно неверно. Кажется, вы просто хотите создать план для 1D FFT с размером 8 (что поднимает вопрос о том, почему вы используете fftwnd_create_plan, если вам нужен только 1D FFT?). Вызов должен быть примерно таким:

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);
0 голосов
/ 17 мая 2011

Вы, похоже, рассматриваете n как массив, когда он указывает только на одно целое число. Например, не должно ли это:

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

быть:

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