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); }
// 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); }
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); }