2013-07-13 1 views
0

Я пытаюсь использовать FFTW .dll (v 3.3.3) в C-программе в системе Windows 8 с использованием Eclipse (Kepler) и MinGW (gcc 4.7.2). Есть два вопроса, которые я подозреваю, будут делать с моей конфигурации:Ограничение размера массива для fftw с использованием Eclipse и mingw?

  1. с размером массива менее 977, запускается программа и выдает ожидаемый результат; если N> = 977, программа выйдет из строя без вывода.
  2. Хотя работа с N < 977 дает ожидаемый результат, отладка дает значения, которые совершенно разные.

Может ли кто-нибудь указать мне правильное направление?

Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <complexUtil.h> 
#include <fftw3.h> 

#define N 976 

main() 
{ 
    fftw_complex *in, *out; 
    fftw_plan p; 

    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); 
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); 

    FILE* infile; 
    float value; 
    int i = 0; 

    // Populate input array from file 
    infile = fopen("testData.txt", "r"); 
    for (i=0; i<N; i++) { 
     fscanf(infile, "%f", &value); 
     (*(in + i)) = value + 0.0i; 
    } 
    fclose(infile); 

    // Perform fft 
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftw_execute(p); 
    fftw_destroy_plan(p); 
    fftw_free(in); fftw_free(out); 

    // Debug output 
    printf("in\t\tout\n"); 
    for (i=0; i<N; i++) { 
     printf("%f\t%f\n", 
        creal((fftw_complex)* (in + i)), 
        creal((fftw_complex)* (out + i))); 
    } 
    return(0); 
} 

Компилятор называет:

gcc "-IC:\\Users\\Brian\\workspace\\psd\\src" "-IC:\\Users\\Brian\\workspace\\psd\\lib" "-includeC:\\Users\\Brian\\workspace\\psd\\src\\complexUtil.h" "-includeC:\\Users\\Brian\\workspace\\psd\\src\\fftw3.h" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\psd.o" "..\\src\\psd.c" 
gcc "-LC:\\Users\\Brian\\workspace\\psd\\lib" -Wl,--stack,2048 -o psd.exe "src\\psd.o" -lfftw3-3 

Нормальный выход:

in   out 
0.188000 348.455000 
0.000000 29.738027 
0.021000 -88.468551 
0.021000 16.764387 
0.021000 -48.056287 
... 

отладочный вывод:

in   out 
-2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 -2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
-2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 -2656984258037080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
... 

Еще один симптом: в режиме отладки выходной сигнал не отображается, поскольку я перешагиваю до определенного количества итераций через выходной цикл. Затем я получаю блок вывода, а функции шага в Eclipse выделены серым цветом.

+1

*** 'int' ***' main() '... –

+0

@ Комментарий H2CO3 не имеет ничего общего с проблемой. – JackCColeman

ответ

0

977 является простым и, следовательно, он не разлагается на степени малых простых чисел, как того требует FFTW. Таким образом, fftw_plan_dft_1d не сработает и вернет NULL, и любые последующие вызовы FFTW с p == NULL, конечно же, потерпят крах. Если вы попробуете разумное значение для N> 976, например. N = 1024, то это должно работать как ожидалось, так как ваш код выглядит нормально (кроме полного отсутствия проверки ошибок).

+0

Спасибо, Пол. Я уже пробовал 1024 с тем же результатом. Я достиг 977, работая вниз, чтобы найти значение, в котором проблема началась. Re error check - совершенно правильно MBR $ –

+0

Возможно, это не актуально, но если вам действительно не нужна двойная точность, подумайте об использовании библиотек и заголовков одной точности (fftw3f) - это будет быстрее, и это уменьшит вдвое ваши потребности в памяти. –

+0

На самом деле это была более ранняя проблема, с которой я работал, используя библиотеку с двойной точностью. С fftw3f-3 я получил это: gcc "-LC: \\ Пользователи \\ Брайан \\ рабочая область \\ psd \\ lib" -Wl, - stack, 2048 -o psd.exe "src \\ psd.o" -lfftw3f-3 src \ psd.o: В функции 'main ': C: \ Users \ Brian \ workspace \ psd \ Debug /../ src/psd.c: 23: неопределенная ссылка на' _imp__fftw_malloc' C : \ Users \ Brian \ workspace \ psd \ Debug /../ src/psd.c: 24: неопределенная ссылка на '_imp__fftw_malloc ' –

Смежные вопросы