Exemple #1
0
        public static double[] GetDataWindow(DataWindowType type, int size)
        {
            double[] Table = new double[size];
            Table = new double[size];

            double h = 2 * Math.PI / (size - 1);

            switch (type)
            {
            case DataWindowType.Box:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 1;
                }
                break;

            case DataWindowType.Hanning:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 0.50 - 0.50 * Math.Cos(h * i);
                }
                break;

            case DataWindowType.Hamming:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 0.54 - 0.46 * Math.Cos(h * i);
                }
                break;

            case DataWindowType.Blackman:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 0.42 - 0.50 * Math.Cos(h * i) + 0.08 * Math.Cos(2 * h * i);
                }
                break;

            case DataWindowType.Parzen:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 1.0 - Math.Abs((i * 2 - (size - 1)) / (double)(size + 1));
                }
                break;

            case DataWindowType.Welch:
                for (int i = size; --i >= 0;)
                {
                    Table[i] = 1.0 - Mt.Sq((i * 2 - (size - 1)) / (double)(size + 1));
                }
                break;
            }
            //double c = Math.Sqrt(n / Table.Sum(x => Sq(x)));
            //for (int i = n; --i >= 0; ) Table[i] *= c;
            return(Table);
        }
Exemple #2
0
 // Power Spectral Densityを求めたい。nの増加に伴いそれぞれの周波数カラムの幅(Δf)は狭くなるため、結果のData値は増加する
 // ΣResult   != 単位時間辺りのpower
 // ∫Result df = 単位時間辺りのpower
 // y=a*sin(x) の結果は、a*a*n/2 振幅はa/2でパワーはa*a/4、one-sidedなので2倍してa*a/2、nは上記
 // これは (1/n)*Σ(y*y) の結果と一致する
 // y=a の結果は a*a*n
 public static double[] PowerSpectrumFFT(double[] data, double amplitude)
 {
     Complex[] Freq = RealFastFourierTransform(data, Math.Sqrt(2 * amplitude / data.Length));
     double[]  Powr = new double[Freq.Length];
     for (int i = Powr.Length; --i >= 0;)
     {
         Powr[i] = Mt.Sq(Freq[i].Real) + Mt.Sq(Freq[i].Imaginary);
     }
     Powr[0] /= 2;
     Powr[Powr.Length - 1] /= 2;
     return(Powr);
 }
Exemple #3
0
        public static Complex[] PowerPhaseSpectrumFFT(double[] data, double amplitude)
        {
            Complex[] Freq = RealFastFourierTransform(data, Math.Sqrt(2 * amplitude / data.Length));
            Complex[] Powr = new Complex[Freq.Length];
            for (int i = Powr.Length; --i >= 0;)
            {
                Powr[i] = new Complex(Mt.Sq(Freq[i].Real) + Mt.Sq(Freq[i].Imaginary), Freq[i].Phase);
            }
            var a = Powr[0]; Powr[0] = new Complex(a.Real / 2, a.Imaginary);
            var b = Powr[Powr.Length - 1]; Powr[Powr.Length - 1] = new Complex(b.Real / 2, b.Imaginary);

            return(Powr);
        }