/// <summary>
        /// 三次样条曲线插值(使用数据点数量)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="dataCout">光谱数据点数</param>
        /// <returns>返回处理后的数据,第一行是X轴,其余行为Y轴;</returns>
        public static List <double[]> SplineCubicInterpolation(IList <double[]> specDatas, double firstX, double lastX, int dataCout)
        {
            double[] alldatas = null;
            if (specDatas == null || dataCout < 1 || (alldatas = CommonMethod.CombineSpectrumDatas(specDatas)) == null)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            return(SplineCubicInterpolation(alldatas, specDatas.Count, specDatas[0].Length, firstX, lastX, dataCout));
        }
Exemple #2
0
        /// <summary>
        /// 通过欧式距离,使用KS算法选择有效光谱
        /// </summary>
        /// <param name="spectrumYDatas">主机光谱,一行一条Y轴数据</param>
        /// <param name="selectNumber">需要选择多少条光谱</param>
        /// <returns>选中光谱的序号(int),大小=selectNumber</returns>
        public static int[] KSEuclideanSelectSample(IList <double[]> spectrumYDatas, int selectNumber)
        {
            if (spectrumYDatas == null || selectNumber < 1 || spectrumYDatas.Count < selectNumber || spectrumYDatas[0].Length < 1)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] allmaster = CommonMethod.CombineSpectrumDatas(spectrumYDatas);
            if (allmaster == null)
            {
                ErrorString = CommonMethod.ErrorString;
                return(null);
            }

            return(KSEuclideanSelectSample(allmaster, spectrumYDatas.Count, spectrumYDatas[0].Length, selectNumber));
        }
Exemple #3
0
        /// <summary>
        /// 从主机光谱中选择用于仪器校准的光谱
        /// </summary>
        /// <param name="masterData">主机光谱,一行一条光谱,第一行是X轴数据,后面是Y轴数据</param>
        /// <param name="selectNumber">需要选择多少条光谱</param>
        /// <returns>选中光谱的序号(int),大小=selectNumber</returns>
        public static int[] SelectStandardSpectrum(IList <double[]> masterData, int selectNumber)
        {
            if (masterData == null || selectNumber < 1 || masterData.Count < selectNumber || masterData[0].Length < 1)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] allmaster = CommonMethod.CombineSpectrumDatas(masterData);
            if (allmaster == null)
            {
                ErrorString = CommonMethod.ErrorString;
                return(null);
            }

            return(SelectStandardSpectrum(allmaster, masterData.Count, masterData[0].Length, selectNumber));
        }
        /// <summary>
        /// 三次样条曲线插值(使用X轴步长)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="stepX">波数间隔</param>
        /// <returns>返回处理后的数据,第一行是X轴,其余行为Y轴;</returns>
        public static List <double[]> SplineCubicInterpolation(IList <double[]> specDatas, double firstX, double lastX, double stepX)
        {
            if (specDatas == null || (firstX < lastX && stepX < 0) || (firstX > lastX && stepX > 0) || stepX == 0 || specDatas.Count < 2)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] alldatas = CommonMethod.CombineSpectrumDatas(specDatas);
            if (alldatas == null)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            return(SplineCubicInterpolation(alldatas, specDatas.Count, specDatas[0].Length, firstX, lastX, stepX));
        }
Exemple #5
0
        /// <summary>
        /// 根据主机光谱创建辅机的校准系数(数据不包含X轴)
        /// </summary>
        /// <param name="algorithmType">校准算法</param>
        /// <param name="masterData">主机数据(一条光谱一行Y轴数据)</param>
        /// <param name="slaveData">辅机数据(一条光谱一行Y轴数据)</param>
        /// <param name="windowSize">校准窗口大小</param>
        /// <param name="tolerance">校准偏差(PLS)</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="withXDatas">True=masterData和slaveData第一行包含X轴数据</param>
        /// <returns>校准系数</returns>
        public static byte[] GetCoefficient(enumAlgorithmType algorithmType, IList <double[]> masterData, IList <double[]> slaveData,
                                            int windowSize, double tolerance, double firstX, double lastX, bool withXDatas = false)
        {
            if (masterData == null || slaveData == null || masterData.Count < 2 || masterData.Count != slaveData.Count ||
                masterData[0].Length != slaveData[0].Length || windowSize < 1 || masterData[0].Length < windowSize + 1)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] allmaster = CommonMethod.CombineSpectrumDatas(masterData);
            double[] allslave  = CommonMethod.CombineSpectrumDatas(slaveData);
            if (allmaster == null || allslave == null)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            return(GetCoefficient(algorithmType, allmaster, allslave, masterData.Count, masterData[0].Length, windowSize, tolerance, firstX, lastX, withXDatas));
        }
Exemple #6
0
        /// <summary>
        /// 使用光谱校正系数,校正光谱(不包含X轴数据)
        /// </summary>
        /// <param name="coefData">光谱校正系数(BYTE)</param>
        /// <param name="slaveData">光谱数据</param>
        /// <returns>校正后的光谱Y轴数据</returns>
        public static List <double[]> ApplyCoefficient(byte[] coefData, IList <double[]> slaveData)
        {
            if (coefData == null || slaveData == null || slaveData.Count == 0)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }
            if (!IsValidCoef(coefData, slaveData[0].Length))
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] allslave = CommonMethod.CombineSpectrumDatas(slaveData);
            if (allslave == null)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] retdata = ApplyCoefficient(coefData, allslave, slaveData.Count, slaveData[0].Length, false);
            if (retdata == null || retdata.Length != allslave.Length)
            {
                return(null);
            }

            //拷贝每条光谱
            //每条光谱的大小为slaveData[0].Length,总共slaveData.Count条
            List <double[]> retSpecs = new List <double[]>();

            for (int i = 0; i < slaveData.Count; i++)
            {
                double[] curdata = new double[slaveData[0].Length];
                Array.Copy(retdata, i * curdata.Length, curdata, 0, curdata.Length);
                retSpecs.Add(curdata);
            }

            return(retSpecs);
        }
        /// <summary>
        /// 光谱基线校正
        /// </summary>
        /// <param name="xyDataList">第一项是X,后面是Y</param>
        /// <param name="method">基线校正方法.</param>
        /// <returns></returns>
        public static List <double[]> BaselineCorrect(List <double[]> xyDataList, BaseLineMethod method)
        {
            if (xyDataList.Count < 2)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            var xyDatas = CommonMethod.CombineSpectrumDatas(xyDataList);

            if (xyDatas == null)
            {
                ErrorString = CommonMethod.ErrorString;
                return(null);
            }

            if (BaselineCorrect(xyDatas, xyDataList.Count, xyDataList[0].Length, method) == false)
            {
                return(null);
            }

            return(CommonMethod.SplitSpectrumDatas(xyDatas, xyDataList.Count));
        }