2016-05-02 16 views
6

Gaussian'ın Fourier dönüşümü bir gauss'tur, ama bir nedenden dolayı GSL'den (GNU bilimsel kütüphanesi) hızlı Fourier dönüşüm kütüphanesi bunu vermez. Ben (girişim) Fourier dönüşümü ve ondan hemen sonra iki ilgili araziyi oluşturmak için kullandığım kodu ekledim. Neye bulaştığımı belirlememe yardımcı olabilir misiniz?GSL Hızlı Fourier Dönüşümü - Anlamsız Çıkış

#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


DÜZENLEME: çözüldü! @ roadrunner66 yanıtında belirtildiği gibi

orijinal Gauss genişliği Fourier uzayında saçma bir şekilde dar Gauss giden çok geniş. Dahası, benim grafiğim daha ilginç görünüyordu, çünkü @ nm'nin (şimdi kaldırılmış) yorumunda önerildiği gibi, Fourier dönüşümü DFT'yi k = 0,1, ..., N/2, şeklinde indekslenen k değerleri ile döndürür. N/2, ...- 2, -1.

enter image description here

cevap

4

Bana iyi görünüyor. Çıkış vektörünü N/2 ile kaydırın ve gerçek parça yerine çıkışın mutlak değerini çizin.

Ayrıca, Gaussian girişinizin oldukça geniş olduğunu ve bunun spektrumunu çok dar hale getirdiğini unutmayın. Karşılaştırma için bu durumda analitik çözümü kontrol edin.

+1

Bu yapıldı. Orijinal gaussianın genişliği, dönüştürülmüş gaussian fraksiyonel genişliğini 2 yapmıştır. Orijinal gaussian'ın genişliğini 0.01'e değiştiren bir arsa dahil ettim. Düzenle'ye bakın. –

İlgili konular