2017-05-05 26 views
2

MathNetからFFTをテストするときに問題があります。 ガウス変数の特性関数にFFTを適用すると、ガウス密度関数が見つかるはずです。C#MathNet FFTの定義

私がVectorFFTをプロットすると、Figureは密度関数のように見えますが、0では値1がなく、値は1.4689690914109です。

スケーリングに問題があります。 Fourier.InverseですべてのタイプのFourierOptionsを試してみましたが、PI、2PI、sqrt(2PI)のすべてのタイプの除算/乗算がありましたが、密度関数の中心に値1はありません。

また、フーリエ変換とその逆関数の様々な定義が存在するので、私はMathNetによって実装されているのか疑問に思っていました。

アイデア?

public void DensityGaussian() 
    { 
     double eta = 0.1; //step in discrete integral 
     int pow2 = 256;  // N^2 
     double mu = 0;  // centred gaussian 
     double sigma = 1; // with unitary variance 

     //FFT 
     double lambda = 2 * System.Math.PI/(pow2 * eta); 
     double b = 0.5 * pow2 * lambda; 

     Complex[] VectorToFFT = new Complex[pow2]; 
     for (int j = 0; j < pow2; j++) 
     { 
      double z = eta * j; 

      if (z == 0) { z = 0.00000000000001; } 

      VectorToFFT[j] = System.Numerics.Complex.Exp(new Complex(0, b * z)); 
      VectorToFFT[j] *= (System.Numerics.Complex.Exp(new Complex(
           -sigma*sigma*z*z, mu * z))); //char function of gaussian 
     } 

     Fourier.Inverse(VectorToFFT, FourierOptions.NoScaling); 

     //scaling 
     for (int i = 0; i < pow2; i++) 
     { 
      VectorToFFT[i] /= (2 * System.Math.PI); //test 
     } 


     Console.WriteLine("Is density?"); 
     Assert.IsTrue(1 == 1); 
    } 
+0

FFTは、離散フーリエ変換を実装しています。 DFTは(連続的な)フーリエ変換と同じではありません。 –

答えて

0

Math.NETニューメリックスはFourierOptionsフラグ列挙して制御可能な、すべての一般的なDFTの定義をサポートしています。それらは基本的に指数とスケーリングで変化します。

FourierOptions docsは、基本的に、オプションが有効な定義をどのように影響するかについていくつかのヒントを与える:

  • InverseExponent:(デフォルトは正の符号を使用しています)指数でマイナス記号を使用します。負の符号を持つ顕著な実装は数値的なレシピです。
  • AsymmetricScaling/NoScaling:デフォルトの対称スケーリングの代わりにsqrt(1/N)は、逆変換でスケールが1/N(Matlabのような)またはスケーリングが全くない(数字のレシピのように)のみです。明らかに、スケーリングせずにifft(fft(x)) != x

答えがCalculating a density from the characteristic function using fft in Rの場合は、具体的な使用例に役立つかもしれません。