0

Eclipse (Kepler) と MinGW (gcc 4.7.2) を使用して、Windows 8 システムの C プログラムで FFTW .dll (v 3.3.3) を使用しようとしています。私の構成に関係していると思われる問題が 2 つあります。

  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
...

もう 1 つの症状: デバッグ モードでは、出力ループを一定回数反復するまでステップ スルーしているため、出力が表示されません。次に、出力のブロックを取得し、Eclipse のステッピング関数がグレー表示されます。

4

1 に答える 1

0

977 は素数であるため、FFTW で必要とされる小さな素数の累乗に因数分解しません。そのfftw_plan_dft_1dため、失敗して NULL が返され、その後 p == NULL を指定して FFTW を呼び出すと、もちろんクラッシュします。N > 976 の適切な値 (たとえば N = 1024) を試してみると、コードは問題ないように見えるので (エラー チェックが完全に欠如していることを除けば)、期待どおりに動作するはずです。

于 2013-07-13T10:20:57.063 に答える