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

6

高斯函数的傅里叶变换也是一个高斯函数,但是 GNU 科学库(GSL)中的快速傅里叶变换库却没有给出这个结果。下面是我用来生成(尝试的)傅里叶变换的代码以及两个相关的图表。 能帮我找出我错在哪里吗?

#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();
}

在此输入图片描述

在此输入图片描述


编辑:问题已解决!

正如@roadrunner66的回答所述,原始高斯函数的宽度非常宽,导致傅里叶空间中出现了一个非常狭窄的高斯函数。此外,正如@n.m(现已删除)的评论所建议的那样,傅里叶变换返回的离散傅里叶变换具有沿着k值进行索引的投影,其中k=0,1,...,N/2,-N/2,...-2,-1。

在此输入图片描述

1个回答

5

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

此外,请注意您的输入高斯分布相当宽,这使其频谱非常窄。检查该情况下的解析解以进行比较。


1
这就是它。原始高斯函数的宽度为2,使得变换后的高斯函数宽度成为分数。我已经包含了一个绘图,将原始高斯函数的宽度改为0.01。请参见编辑。 - Arturo don Juan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接