我想讓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的信號,這是我在下面的方法(基於FFTW documentation)做:
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:爲了清晰起見,從我的代碼中刪除了打印語句。
您是否收到任何警告/錯誤?這行不應該編譯:'double * ptr = in [i];' – Mysticial 2012-03-02 15:47:52
沒有任何,甚至沒有設置-Wall標誌(我意識到,這很奇怪)。我看到你的觀點,爲什麼它不會編譯,但如果是這種情況,我會通過將它轉換爲雙指針來解決它。無論如何,我想這不是導致問題的原因。 – gleerman 2012-03-02 15:54:50
您沒有投射fftw_malloc(sizeof(fftw_complex)* size)的輸出; – L7ColWinters 2012-03-02 15:56:28