2012-03-02 10 views
1

私はFFTWをCで動作させようとしています。別のプロジェクト(JNIにあったプロジェクト)で動作していましたが、結果的に悲しいことに、 。FFTWの結果がゼロになる

double* generateSignal() { 
    int fs=44100; 
    double fsd = 44100.0; // fs in double format 
    double f1=1000.0; 
    int i; 
    double PI = 3.141592653589793238462643; 

    double t[fs]; 
    double value = 0.0; 
    for (i = 0; i < fs; i++) { 
     t[i] = value; 
     value += 1.0/fsd; 
    } 

    double* signal = (double*) malloc(sizeof(double) * fs); 
    for (i = 0; i < fs; i++) { 
     signal[i] = sqrt(2) * sin(2 * PI * f1 * t[i]); 
    } 

    return signal; 
}  

これは動作しますが、私は完全を期すためにそれを掲示しています:

まず私はこのように、正弦波信号を生成します。

次に、私は(FFTW documentationに基づく)は、以下の方法で行うれ、FFTWを使用して信号を変換したい:

void processSignal(double* signal) { 
    int size = 44100; 
    int i; 

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

    for (i = 0; i < size; i++) { 
     double* ptr = in[i]; 
     *ptr = signal[i];  // set first double, real part 
     *(ptr + 1) = 0.0;  // set second double, imaginary part 
    } 

    fftw_plan p = fftw_plan_dft_1d(size, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftw_execute(p); 

    for (i = 0; i < size; i++) { 
     double* ptr = out[i]; 
     signal[i] = *ptr;  // get real part 
    } 

    fftw_destroy_plan(p); 
    fftw_free(in); 
    fftw_free(out); 
} 

FFTWのドキュメントからこの点に注意してください。今typedef double fftw_complex[2];

これは、signalアレイのすべての値が-0.000000であることをもたらす。私は本当にこのコードの問題を見ることができないので、私が間違っていることを指摘できますか?

ありがとうございました。

PS:明確にするために、コードからprint-statementsを削除しました。

+0

警告/エラーが表示されますか?この行はコンパイルすべきではありません: 'double * ptr = in [i];' – Mysticial

+0

-Wallフラグがセットされていなくても(これは気が狂っています)。私はコンパイルされない理由を見ていますが、その場合はダブルポインタにキャストして解決します。とにかく、それは問題を引き起こしていることではないと思います。 – gleerman

+0

あなたはfftw_malloc(sizeof(fftw_complex)* size)の出力をキャストしませんでした。 – L7ColWinters

答えて

0

まあ、これは愚かです。

値は-2.0E-9のような大きさです。結果は四捨五入され、-0.00000が出力されます。

フレッドに大変感謝しています。彼の質問は "あなたの期待される結果は何ですか?"私が以前に言及したJNIプロジェクトの成果をよく見て、私の間違いを認識させました。

他の回答もありがとう!

0

私は、前回の反復の虚数部分を現在の部分の実数部分で上書きしている可能性があると思います。

for (i = 0; i < size; i++) { 
     double* ptr = in[i]; // <-- here's a problem 
     *ptr = signal[i];  // set first double, real part 
     *(ptr + 1) = 0.0;  // set second double, imaginary part 
    } 

i最初の繰り返しになる入力複素数の実部に、ptrポイントの各反復に一つずつインクリメント[0]とptr + 1れる複素数の虚数部分を指している[0]、第2の反復では、ptrは複素数[0]の虚数部を指しており、ptr + 1は複素数[1]の実数部を指しています。この問題を解決する

いくつかの提案は次のようになります。

for (i = 0, j = 0; i < size; i++, j+= 2) { 
    double* ptr = in[j]; // j increments by 2 making ptr alays point to real part 
    *ptr = signal[i];  // set first double, real part 
    *(ptr + 1) = 0.0;  // set second double, imaginary part 
} 

または

double* ptr = in[0] 
for (i = 0; i < size; i++) { 
     *ptr++ = signal[i]; // set first double, real part 
     *ptr++ = 0.0;  // set second double, imaginary part 
    } 
関連する問題