FFTW Segfault (вероятно, простой ответ)

Я пытаюсь написать простую процедуру 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;
}

person Patrick    schedule 17.05.2011    source источник


Ответы (2)


Первые два параметра 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);
person Paul R    schedule 17.05.2011
comment
Фантастика, спасибо! Причина, по которой я использую fftwnd_create_plan, заключается в том, что это своего рода тестовый пример, чтобы познакомиться с программным обеспечением. После того, как я заставлю его работать для этого простого примера, я собираюсь заняться гораздо большим проектом с библиотекой, и поэтому я хотел использовать n-мерные функции, чтобы я был с ними знаком. Теперь у меня есть точное представление о том, каким должен быть каждый параметр, поэтому, надеюсь, я должен быть готов к работе. Спасибо за помощь! - person Patrick; 17.05.2011

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

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

be:

printf("%d\n", in[i]);
person Community    schedule 17.05.2011
comment
Ах, это правда, спасибо, но я не думаю, что проблема была в этом. Я вставил кучу операторов printf и определил, что segfault возникает при вызове функции fftwnd_one. Я просмотрел документацию и думаю, что наиболее вероятным сценарием является ошибка при создании плана, но я не уверен. - person Patrick; 17.05.2011