高斯的傅立叶变换是高斯变换,但是由于某种原因,来自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();
}

c&#43;&#43; - GSL快速傅立叶变换-无意义输出-LMLPHP

c&#43;&#43; - GSL快速傅立叶变换-无意义输出-LMLPHP

编辑:解决!

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

c&#43;&#43; - GSL快速傅立叶变换-无意义输出-LMLPHP

最佳答案

对我来说看起来不错。将输出 vector 移位N/2,并绘制输出的绝对值,而不是实数部分。

还要注意,您输入的高斯非常宽,这使它的频谱非常狭窄。检查该情况的分析解决方案以进行比较。

关于c++ - GSL快速傅立叶变换-无意义输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36975076/

10-16 08:15