【问题标题】:GSL Fast-Fourier Transform - Nonsense OutputGSL 快速傅里叶变换 - 无意义输出
【发布时间】:2023-03-10 01:55:01
【问题描述】:

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


编辑:已解决!

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

【问题讨论】:

    标签: c++ fft gsl


    【解决方案1】:

    我觉得不错。将输出向量移动 N/2 并绘制输出的绝对值,而不是实部。

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

    【讨论】:

    • 就是这样。原始高斯的宽度为 2,使转换后的高斯的宽度为分数。我已经包含了一个原始高斯宽度更改为 0.01 的图。查看编辑。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 2017-09-14
    • 1970-01-01
    • 2012-12-10
    • 2010-12-13
    • 2013-03-31
    • 2012-05-25
    • 2015-08-19
    相关资源
    最近更新 更多