Проблема с подпрограммой FFTW2 в C

В настоящее время я работаю с библиотекой FFTW2 (самое быстрое преобразование Фурье на Западе), и после написания успешной процедуры на Фортране я перехожу к 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 над ними стоит карат. Я использую в основном тот же шаблон, который работал, когда я писал это на Фортране, и я, похоже, следую учебному пособию, здесь на самом деле только это задание, которое я испортил синтаксис. Для записи, я использую компилятор nvcc, если это имеет значение (ранее я пробовал gcc). Если кто-то здесь уже использовал все FFTW2 в C, не могли бы вы помочь исправить мою ошибку? Спасибо!

2 ответа

Решение

Это может быть из-за того, что ваш массив "in" является массивом fftw_complex, поэтому вместо использования в [0]->re = 0 вы должны использовать его как в [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);

Поскольку ffwt_complex является двойным [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;
  }
Другие вопросы по тегам