/// <summary>
        /// 计算出信号的AC成分以及DC成分(单位:RMS)
        /// </summary>
        /// <param name="signalData">信号来源</param>
        /// <param name="acTerm">AC成分</param>
        /// <param name="dcTerm">DC成分</param>
        public static void EstimateACDC(double[] signalData, out double acTerm, out double dcTerm)
        {
            double[] inputData      = new double[signalData.Length];
            double[] acData         = new double[signalData.Length];
            double[] hann_weighting = Window.Hann(signalData.Length);
            double   coeff_cg       = 0.5; // cg=0.5, compensation for Hanning windowing
            double   coeff_enbw     = 1.5; // enbw=1.5, compensation for Hanning windowing

            //DC term extraction
            //Hanning windowing the signal
            ArrayCalculation.Multiply(hann_weighting, signalData, ref inputData);
            //Get the mean value and compensated by the cg coeff
            dcTerm = Statistics.Mean(inputData) / coeff_cg;

            //AC term extraction
            Buffer.BlockCopy(signalData, 0, inputData, 0, signalData.Length * sizeof(double));
            //Substract from the dc term
            ArrayCalculation.SubtractOffset(ref inputData, dcTerm);
            //Hanning windowing the signal
            ArrayCalculation.Multiply(hann_weighting, inputData, ref acData);
            //Get the variance data, compensated by coeff , and sqrt to derive ac term
            acTerm = Math.Sqrt(Statistics.Variance(acData) / (coeff_cg * coeff_cg * coeff_enbw));
        }
 public virtual void Multiply(short[] src1, short[] src2, ref short[] dest)
 {
     ArrayCalculation.Multiply(src1, src2, ref dest);
 }
 public virtual void Multiply(float[] src1, float[] src2, ref float[] dest)
 {
     ArrayCalculation.Multiply(src1, src2, ref dest);
 }
 public virtual void Multiply(double[] src1, double[] src2, ref double[] dest)
 {
     ArrayCalculation.Multiply(src1, src2, ref dest);
 }