2016-05-03 33 views
0

私がやりたいことのすべては、フーリエ変換(当然のテストとして)ガウスの変換を評価ですが、私は下のグラフに見られるように、二重の値関数のように見えるものを取得しています。ガウスのテールを詳しく見ると、FFTの戻り値は実際には正と負の間で振動し、DFTが「二重値」に見えることがわかります。 なぜこれが起こっていますか?これを修正する方法はありますか(複雑なモジュラスをプロットするだけではありません)?GSL高速フーリエ変換 - 二値ガウス?

#include <gsl/gsl_fft_complex.h> 
#include <gsl/gsl_errno.h> 
#include <fstream> 
#include <iostream> 
#include <iomanip> 

#define REAL(z,i) ((z)[2*(i)]) //complex arrays stored as [Re(z0),Im(z0),Re(z1),Im(z1),...] 
#define IMAG(z,i) ((z)[2*(i)+1]) 
#define MODU(z,i) ((z)[2*(i)])*((z)[2*(i)])+((z)[2*(i)+1])*((z)[2*(i)+1]) 
#define PI 3.14159265359 

using namespace std; 

int main(){ 

    int n = pow(2,9); 
    double data[2*n]; 
    double N = (double) n; 

    ofstream file_out("out.txt"); 

    double xmin=-10.; 
    double xmax=10.; 
    double dx=(xmax-xmin)/N; 
    double x=xmin; 

    for (int i=0; i<n; ++i){ 
     REAL(data,i)=exp(-100.*x*x); 
     IMAG(data,i)=0.; 
     x+=dx; 
    } 

    gsl_fft_complex_radix2_forward(data, 1, n); 

    for (int i=0; i<n; ++i){ 
     file_out<<(i-n/2)<<" "<<REAL(data,((i+n/2)%n))<<'\n'; 
    } 

    file_out.close(); 
} 

enter image description here

+0

実際に物理的な意味がないときは、実際の部分をプロットし続けます。絶対値をプロットし、あなたは大丈夫です。 – roadrunner66

答えて

1

あなたは、例えば、本物の成分をプロットしています偶数または余弦成分整数周波数Nの余弦波は、Nが奇数から偶数に向かって増加するにつれて、中央で-1であり、中央で1になるように切り替わることに留意されたい。したがって、DFTウィンドウへの入力の途中のノイズは、DFT結果の様々な実数成分をトグルさせる可能性があります(ただし、そのノイズはすべてのDFT基底ベクトルに対して正確に直交しない限り)。

関連する問題