2017-05-05 506 views
2

從MathNet測試FFT時我遇到一些問題: 這個想法是,如果我將FFT應用於高斯變量的特徵函數,我應該找到高斯密度函數。C#MathNet FFT定義

當我繪製VectorFFT時,該圖似乎是一個密度函數,但是它的值爲零,它沒有值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 Numerics的支持所有常見的DFT定義,控制與FourierOptions標誌枚舉。它們在指數和比例上基本不同。

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的答案可以幫助具體的用例。