Определение C# MathNet FFT

У меня есть некоторая проблема при тестировании БПФ из MathNet: идея состоит в том, что если я применяю БПФ к характеристической функции гауссовой переменной, я должен найти гауссову функцию плотности.

Когда я рисую VectorFFT, фигура кажется функцией плотности, но в нуле она не имеет значения 1, она имеет значение 1,4689690914109.

Должны быть проблемы с масштабированием. Я пробовал все типы FourierOptions в Fourier.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);
    }

person plccrl    schedule 05.05.2017    source источник
comment
БПФ реализует дискретное преобразование Фурье. ДПФ — это не то же самое, что (непрерывное) преобразование Фурье.   -  person Paul R    schedule 05.05.2017


Ответы (1)


Math.NET Numerics поддерживает все распространенные определения DFT, управляемые перечислением FourierOptions flags. Они существенно различаются по показателю степени и масштабированию.

документы FourierOptions дают некоторые советы о том, как параметры влияют на эффективное определение, по существу:

  • InverseExponent: используйте отрицательный знак в показателе степени (по умолчанию используется положительный знак). Заметной реализацией с отрицательным знаком являются числовые рецепты.
  • Асимметричное масштабирование/без масштабирования: вместо симметричного масштабирования по умолчанию sqrt(1/N) либо только масштабирование в обратном преобразовании 1/N (например, Matlab), либо вообще без масштабирования (например, числовые рецепты). Очевидно, без масштабирования ifft(fft(x)) != x.

Возможно, ответ в Расчет плотности по характеристике Функция, использующая fft в R, может помочь в конкретном случае использования.

person Christoph Rüegg    schedule 06.05.2017