2013-11-27 52 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