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