GSL 快速傅立叶变换 - 无意义的输出
GSL Fast-Fourier Transform - Nonsense Output
高斯的傅立叶变换是高斯,但出于某种原因,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 的回答所述,原始高斯的宽度非常宽,导致傅立叶中的高斯窄得离谱 space。此外,我的情节看起来很时髦,因为正如@n.m(现已删除)评论中所建议的那样,傅里叶变换 returns DFT 投影到索引为 k=0,1 的 k 值上。 ..,N/2,-N/2,...-2,-1.
我觉得不错。将输出向量移动 N/2 并绘制输出的绝对值,而不是实部。
另请注意,您的输入高斯分布相当宽,这使得它的频谱非常窄。检查该案例的解析解以进行比较。
高斯的傅立叶变换是高斯,但出于某种原因,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 的回答所述,原始高斯的宽度非常宽,导致傅立叶中的高斯窄得离谱 space。此外,我的情节看起来很时髦,因为正如@n.m(现已删除)评论中所建议的那样,傅里叶变换 returns DFT 投影到索引为 k=0,1 的 k 值上。 ..,N/2,-N/2,...-2,-1.
我觉得不错。将输出向量移动 N/2 并绘制输出的绝对值,而不是实部。
另请注意,您的输入高斯分布相当宽,这使得它的频谱非常窄。检查该案例的解析解以进行比较。