2011-05-11 1 views
0

В настоящее время я работаю с библиотекой FFTW2 (Fastest Fourier Transform на Западе), а после написания успешной процедуры в Fortran я перехожу к C. Однако у меня есть некоторые проблема с назначением данных, когда я пытаюсь ввести данные для преобразования (т. е. значения sin (x)). В настоящее время мой код:Проблема с процедурой FFTW2 в C

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

+0

Возможный дубликат [FFTW Segfault (вероятный простой ответ)] (http://stackoverflow.com/questions/6026805/fftw-segfault-likely-simple-answer) –

ответ

0

Возможно, из-за вашего массива «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); 
+0

Вау ... Я не могу поверить, что это было просто. Спасибо! – Patrick

+0

Ожидает ли некоторые параметры? Или это может быть связано с параметрами, которые вы передаете компилятору/компоновщику. – Ankit

0

Поскольку 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; 
    } 
Смежные вопросы