2013-11-27 51 views
3

我試圖計算由用C使用FFTW3 ++所述傅立葉變換的高斯函數的。這裏是我的代碼評價傅立葉變換FFTW3高斯的和C++

main(int argc, char** argv) 
{ 
    fftw_plan p; 
    complex<double> *in,*out; 
    long N=8; 

    //allocation of in and the fftw plan called 
    in=(complex<double>*) calloc(N,sizeof(complex<double>)); 
    p=fftw_plan_dft_1d(N,(fftw_complex*)in,(fftw_complex*)in,FFTW_BACKWARD,FFTW_ESTIMATE); 

    //initialize the array in with the values of a Gaussian function 
    gaussianf(in,N); 
    //Fourier transform in 
    fftw_execute(p); 
    //write the result into a file 
    writeft(in,N); 
    fftw_destroy_plan(p); 
} 

因爲陣列已與高斯的值進行初始化的主體部分,我希望的是,輸出也是高斯,但實際上只信封具有高斯形狀。正如我在下面的數據中所顯示的那樣,有可能看到一些負值出現了。

#input values 
#x  real part  imag part 

-10  3.72008e-44  0 
-7.5 3.72336e-25  0 
-5  1.38879e-11  0 
-2.5 0.00193045  0 
0  1  0 
2.5  0.00193045  0 
5  1.38879e-11  0 
7.5  3.72336e-25  0 

#output 
#x  real part  imag part 
-10  1.00386 0 
-7.5 -1.00273  0 
-5  1  0 
-2.5 -0.99727  0 
0  0.996139  0 
2.5  -0.99727  0 
5  1  0 
7.5  -1.00273  0 

有人能告訴我我做錯了什麼嗎?我將衷心感謝您的幫助。非常感謝。

+0

您剛纔開箱即用的命令所描繪?我使用相同的庫,但在轉換真實和偶數數據時,我得到非零虛部。 – Vesnog

回答

1

你沒有做錯什麼C編程或FFTW調用的意義:這些都是正確的價值觀。高斯曲線的FFT的實部在零附近振盪。如果您繪製了絕對值的值,那麼看起來可能更像您期望的。

+0

非常感謝您的回答。也許我誤解了某些東西,但如果通過常規積分計算FT,則可以獲得另一個沒有負值的高斯。爲什麼不同? – Juan

+1

積分總是正面的,如果你用'COS(N * THETA)'和'THETA = 0'中間乘以(即在您高斯的峯值)。但這不是DFT所假設的:它在信號開始時假定「theta = 0」。所以,現在,根據'n',餘弦波與高斯峯之間將存在不同的相位關係。 – jez

+0

謝謝,這很有道理,現在很清楚。現在的問題是如何使用FFTW在數值上計算「真實」FT。 – Juan