2017-05-05 3 views
2

MathNet에서 FFT를 테스트 할 때 몇 가지 문제가 있습니다.가우스 변수의 특성 함수에 FFT를 적용하면 가우스 밀도 함수를 찾아야한다는 아이디어가 있습니다.C# MathNet FFT 정의

그림을 VectorFFT로 표현하면 밀도 함수처럼 보이지만 0에서는 값 1이 없으며 값은 1.4689690914109입니다.

스케일링에 문제가 있어야합니다. Fourier.Inverse에서 모든 유형의 FourierOptions를 시험해 보았고 PI, 2PI, sqrt (2PI)에 대한 모든 유형의 나누기/곱셈을 시도했지만 밀도 함수의 중심에서 값 1을 얻지 못했습니다.

또한 Fourier Transform 및 그 역변환에 대한 다양한 정의가 있으므로 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의 대답은 특정 사용 사례에 도움이 될 수 있습니다.