Newer
Older
RbFreqStand / RbFreqStandMeasure / tools / FreMath.cs
yangqianqian on 13 Apr 2021 5 KB counter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Casic.Birmm.RbFreqStandMeasure.Tools
{
    public static class FreMath
    {
        /// <summary>
        /// 计算频率稳定度
        /// </summary>
        /// <param name="FreDiffList">相对平均频率偏差</param>
        /// <returns>频率稳定度σ</returns>
        public static float Stable(List<String> FreDiffList)
        {
            List<double> datas = toDoubleList(FreDiffList);
            return Stable(datas);
        }

        /// <summary>
        /// 计算日老化率K,相关系数r
        /// </summary>
        /// <param name="myDatas">相对平均频率偏差</param>
        /// <param name="r">相关系数r</param>
        /// <returns>日老化率K</returns>
        public static double DriftRate(List<String> myDatas, out double r)
        {
            List<float> datas = toFloatList(myDatas);
            return DriftRate(datas, out r);
        }

        /// <summary>
        /// 计算日老化率K
        /// </summary>
        /// <param name="myDatas">相对平均频率偏差</param>
        /// <returns>日老化率K</returns>
        public static double DriftRate(List<String> myDatas)
        {
            List<float> datas = toFloatList(myDatas);
            return DriftRate(datas);
        }

        /// <summary>
        /// 计算相关系数r
        /// </summary>
        /// <param name="myDatas">相对平均频率偏差</param>
        /// <returns>相关系数r</returns>
        public static double RelationRate(List<String> myDatas)
        {
            List<float> datas = toFloatList(myDatas);
            return RelationRate(datas);
        }

        private static double AvgT(List<float> myDatas)  //计算T平均
        {
            int N = myDatas.Count();  //参加计算的数据个数
            if (N > 0)
            {
                double sum = 0;
                for (int i = 1; i <= N; i++)
                {
                    sum = sum + i;
                }
                return sum / N;
            }
            else
                return 0;
        }

        private static double AvgY(List<float> myDatas)  //计算Y平均
        {
            double sum = 0;
            int N = myDatas.Count();  //参加计算的数据个数
            if (N > 0)
            {
                for (int i = 0; i <= N - 1; i++)
                {
                    sum = sum + myDatas[i];
                }
                return sum / N;
            }
            else
                return 0;
        }


        public static double DriftRate(List<float> myDatas)  //计算日老化率K
        {
            double b, YT = 0, sumT = 0;

            double avgT = AvgT(myDatas);
            double avgY = AvgY(myDatas);

            int N = myDatas.Count();  //参加计算的数据个数

            for (int i = 1; i <= N; i++)
            {
                YT = YT + (myDatas[i - 1] - avgY) * (i - avgT);
                sumT = sumT + System.Math.Pow((i - avgT), 2);
            }
            b = YT / sumT;
            return 2 * b;
        }

        public static double DriftRate(List<float> myDatas, out double r)  //计算日老化率K,相关系数r
        {
            double b, YT = 0, sumTT = 0, sumYY = 0;

            double avgT = AvgT(myDatas);
            double avgY = AvgY(myDatas);

            int N = myDatas.Count();  //参加计算的数据个数

            for (int i = 1; i <= N; i++)
            {
                YT = YT + (myDatas[i - 1] - avgY) * (i - avgT);
                sumTT = sumTT + System.Math.Pow((i - avgT), 2);
                sumYY = sumYY + System.Math.Pow((myDatas[i - 1] - avgY), 2);
            }
            b = YT / sumTT;
            r = System.Math.Abs(YT / System.Math.Sqrt(sumTT * sumYY));
            return 2 * b;
        }

        public static Double RelationRate(List<float> myDatas)  //计算相关系数r
        {
            double r, YT = 0, sumT = 0, sumY = 0;

            double avgT = AvgT(myDatas);
            double avgY = AvgY(myDatas);

            int N = myDatas.Count();  //参加计算的数据个数

            for (int i = 1; i <= N; i++)
            {
                YT = YT + (myDatas[i - 1] - avgY) * (i - avgT);
                sumT = sumT + System.Math.Pow((i - avgT), 2);
                sumY = sumY + System.Math.Pow((myDatas[i - 1] - avgY), 2);
            }

            r = YT / System.Math.Sqrt(sumT * sumY);
            return r;
        }

        public static float Stable(List<double> FreDiffList)  //计算日稳
        {

            double sum = 0, diffY;
            int N = FreDiffList.Count;   //参加计算的数据个数
            if (N > 1)
            {
                for (int i = 1; i <= N - 1; i++)
                {
                    diffY = FreDiffList[i] - FreDiffList[i - 1];
                    sum = sum + System.Math.Pow(diffY, 2);
                }

                return (float)System.Math.Sqrt(sum / (2 * N - 2));  //共N-1组数据
            }
            else
                return 0;

        }

        public static List<float> toFloatList(List<String> strDatas)
        {
            List<float> fDatas = new List<float>();
            foreach (String strData in strDatas)
            {
                fDatas.Add(float.Parse(strData));
            }

            return fDatas;
        }

        public static List<double> toDoubleList(List<String> strDatas)
        {
            List<double> dDatas = new List<double>();
            foreach (String strData in strDatas)
            {
                dDatas.Add(double.Parse(strData));
            }

            return dDatas;
        }

    }
}