GSL快速傅里叶变换 - 无意义输出

时间:2016-05-02 04:37:47

标签: c++ fft gsl

高斯的傅立叶变换是高斯变换,但由于某种原因,来自GSL(GNU科学库)的快速傅里叶变换库根本不给出这一点。我已经包含了我用于生成(尝试过的)傅里叶变换的代码,以及紧随其后的两个相关图。 可以帮我识别一下我搞砸了什么吗?

#include <gsl/gsl_fft_complex.h>
#include <fstream>

#define REAL(z,i) ((z)[2*(i)]) //complex arrays stored as    
#define IMAG(z,i) ((z)[2*(i)+1])

using namespace std;

int main(){

double N = pow(2,9); //power of 2 for Cooley-Tukey algorithm
int n = (int) N;

double f[2*n];
double dx = 10./N;
double x = -5.;
ofstream fileo("out.txt");

for (int i=0; i<n; ++i){      //initialize gaussian
    REAL(f,i)=exp(-0.5*x*x);  
    IMAG(f,i)=0.;
    x+=dx;
   }

   gsl_fft_complex_radix2_forward(f, 1, n);  //Fourier transform

   for (int i=0; i<n; ++i){
        fileo<<i<<" "<<REAL(f,i)<<'\n';  //plot frequency distribution
   }

   fileo.close();
}

enter image description here

enter image description here

编辑:解决了!

正如@ roadrunner66的回答所述,原始高斯的宽度非常宽,导致傅立叶空间中的高斯粗糙。此外,我的情节看起来很时髦,因为正如@ n​​m(现已删除)注释中所建议的那样,傅立叶变换将DFT与投影返回到k值,索引为k = 0,1,...,N / 2, - N / 2,...- 2,-1

enter image description here

1 个答案:

答案 0 :(得分:4)

对我来说很好看。将输出向量移动N / 2并绘制输出的绝对值,而不是实部。

另请注意,您的输入高斯相当宽,这使得它的频谱非常窄。检查该案例的分析解决方案以进行比较。

相关问题