// Normalize Array 0 - 1
        public double[] Normalize(double[] buffer, int size)
        {
            int    i;
            MMPair minmax = GetMinMax(buffer, size);

            double[] output = new double[size];

            for (i = 0; i < size; i++)
            {
                output[i] = (buffer[i] - minmax.min) / (minmax.max - minmax.min);
            }

            return(output);
        }
        private double[] HSMakeBins(double[] buffer, int size)
        {
            int bins = (int)Math.Ceiling(Math.Pow(size, 1.0 / 3.0) * 2); // Rice's rule

            MMPair minmax = GetMinMax(buffer, size);

            double width = (minmax.max - minmax.min) / bins;

            double[] intervals = new double[bins * 2];
            intervals[0] = minmax.min;
            intervals[1] = minmax.min + width;

            for (int i = 2; i < intervals.Length - 1; i += 2)
            {
                intervals[i]     = intervals[i - 1];
                intervals[i + 1] = intervals[i] + width;
            }

            intervals[0] = Math.Floor(minmax.min);
            intervals[intervals.Length - 1] = Math.Ceiling(minmax.max);

            return(intervals);
        }