私は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を削除しました。
警告/エラーが表示されますか?この行はコンパイルすべきではありません: 'double * ptr = in [i];' – Mysticial
-Wallフラグがセットされていなくても(これは気が狂っています)。私はコンパイルされない理由を見ていますが、その場合はダブルポインタにキャストして解決します。とにかく、それは問題を引き起こしていることではないと思います。 – gleerman
あなたはfftw_malloc(sizeof(fftw_complex)* size)の出力をキャストしませんでした。 – L7ColWinters