Exemplo n.º 1
0
 public static double[] GetWindowValues(FFTSizeConstants windowSize, FFTWindowConstants windowType)
 {
     double[] values = new double[(int)windowSize];
     for (int i = 0; i < (int)windowSize; i++)
     {
         values[i] = ApplyWindow(i, windowSize, windowType);
     }
     return(values);
 }
Exemplo n.º 2
0
        public static double GetWindowSum(FFTSizeConstants windowSize, FFTWindowConstants windowType)
        {
            double sum = 0;

            for (int i = 0; i < (int)windowSize; i++)
            {
                sum += ApplyWindow(i, windowSize, windowType);
            }
            return(sum);
        }
Exemplo n.º 3
0
        public static double ApplyWindow(int i, FFTSizeConstants windowSize, FFTWindowConstants windowType)
        {
            int w = (int)windowSize - 1;

            switch (windowType)
            {
            case FFTWindowConstants.None:
                return(1.0);

            case FFTWindowConstants.Triangle:
                return(1.0 - Math.Abs(1.0 - ((2 * i) / w)));

            case FFTWindowConstants.Hanning:
                return(0.5 * (1.0 - Math.Cos(PI2 * i / w)));

            case FFTWindowConstants.Hamming:
                return(0.54 - 0.46 * Math.Cos(PI2 * i / w));

            case FFTWindowConstants.Welch:
                return(1.0 - (i - 0.5 * (w - 1)) / (0.5 * Math.Pow((w + 1), 2)));

            case FFTWindowConstants.Gaussian:
                //return Math.E ^ (-6.25 * PI * i ^ 2 / w ^ 2)
                return(Math.Pow(Math.E, (-6.25 * Math.PI * i * i / (w * w))));

            case FFTWindowConstants.Blackman:
                return(0.42 - 0.5 * Math.Cos(PI2 * i / w) + 0.08 * Math.Cos(2 * PI2 * i / w));

            case FFTWindowConstants.Parzen:
                return(1.0 - Math.Abs((i - 0.5 * w) / (0.5 * (w + 1))));

            case FFTWindowConstants.Bartlett:
                return(1.0 - Math.Abs(i) / w);

            case FFTWindowConstants.Connes:
                //return (1.0 - i ^ 2 / w ^ 2) ^ 2
                return(Math.Pow((1.0 - i * i / (w * w)), 2));

            case FFTWindowConstants.KaiserBessel:
                if (i >= 0 && i <= w / 2)
                {
                    return(Bessel((w / 2) * (Math.Pow(Math.Sqrt(1 - 2 * i / w), 2))) / Bessel(w / 2));
                }
                else
                {
                    return(0.0);
                }

            case FFTWindowConstants.BlackmanHarris:
                return(0.35875 - 0.48829 * Math.Cos(PI2 * i / w) + 0.14128 * Math.Cos(2 * PI2 * i / w) - 0.01168 * Math.Cos(3 * Math.PI * i / w));

            case FFTWindowConstants.Nuttall:
                return(0.355768 - 0.487396 * Math.Cos(PI2 * i) / w + 0.144232 * Math.Cos(2 * PI2 * i) / w - 0.012604 * Math.Cos(3 * PI2 * i) / w);

            case FFTWindowConstants.BlackmanNuttall:
                return(0.3635819 - 0.4891775 * Math.Cos(PI2 * i) / w + 0.1365995 * Math.Cos(2 * PI2 * i) / w - 0.0106411 * Math.Cos(3 * PI2 * i) / w);

            case FFTWindowConstants.FlatTop:
                return(1.0 - 1.93 * Math.Cos(PI2 * i) / w + 1.29 * Math.Cos(2 * PI2 * i) / w - 0.388 * Math.Cos(3 * PI2 * i) / w + 0.032 * Math.Cos(4 * PI2 * i) / w);
            }

            return(0.0);
        }