簡體   English   中英

C#MathNet FFT定義

[英]C# MathNet FFT Definition

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

當我繪制VectorFFT時,該圖看起來確實是一個密度函數,但在零值處它沒有值1,在值1.4689690914109中。

縮放必須存在一些問題。 我在Fourier中嘗試了所有類型的FourierOptions.Inverse和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);
    }

Math.NET Numerics支持所有常見的DFT定義,可通過FourierOptions標志枚舉來控制。 它們實質上在指數和縮放比例上有所不同。

FourierOptions文檔本質上給出了有關選項如何影響有效定義的提示:

  • InverseExponent:在指數中使用負號(默認情況下使用正號)。 帶有負號的突出實現是數字配方。
  • AsymmetricScaling / NoScaling:代替默認的對稱縮放sqrt(1/N) ,僅以逆變換1/N縮放(如Matlab),或者根本不進行縮放(如數值配方)。 顯然,無需縮放ifft(fft(x)) != x

也許在R中使用fft從特征函數計算密度中的答案可以對特定用例有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM