コード例 #1
0
        /// <summary>
        /// 从主机光谱中选择用于仪器校准的光谱
        /// </summary>
        /// <param name="masterData">主机光谱,一行一条光谱,第一行是X轴数据,后面是Y轴数据</param>
        /// <param name="specRows">光谱数量</param>
        /// <param name="specCols">每条光谱的数据点数</param>
        /// <param name="selectNumber">需要选择多少条光谱</param>
        /// <returns>选中光谱的序号(int),大小=selectNumber</returns>
        public static int[] SelectStandardSpectrum(double[] masterData, int specRows, int specCols, int selectNumber)
        {
            try
            {
                if (masterData == null || selectNumber < 1 || specRows < selectNumber || masterData.Length != specRows * specCols)
                {
                    throw new Exception("Invalid parameters");
                }

                IntPtr retptr = IntPtr.Zero;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = SDSelectStandardSpectrum64(masterData, specRows, specCols, selectNumber);
                }
                else
                {
                    retptr = SDSelectStandardSpectrum32(masterData, specRows, specCols, selectNumber);
                }

                if (retptr == IntPtr.Zero)
                {
                    ErrorString = GetErrorMessage();
                    return(null);
                }

                return(CommonMethod.CopyDataArrayFromIntptrAndFree <int>(ref retptr, selectNumber));
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #2
0
        /// <summary>
        /// 通过欧式距离,使用KS算法选择有效光谱
        /// </summary>
        /// <param name="spectrumYDatas">主机光谱,一行一条Y轴数据</param>
        /// <param name="specRows">光谱数量</param>
        /// <param name="specCols">每条光谱的数据点数</param>
        /// <param name="selectNumber">需要选择多少条光谱</param>
        /// <returns>选中光谱的序号(int),大小=selectNumber</returns>
        public static int[] KSEuclideanSelectSample(double[] spectrumYDatas, int specRows, int specCols, int selectNumber)
        {
            try
            {
                if (spectrumYDatas == null || selectNumber < 1 || specRows < selectNumber || spectrumYDatas.Length != specRows * specCols)
                {
                    throw new Exception("Invalid parameters");
                }

                IntPtr retptr = IntPtr.Zero;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = KSEuclideanSelectSample64(spectrumYDatas, specRows, specCols, selectNumber);
                }
                else
                {
                    retptr = KSEuclideanSelectSample32(spectrumYDatas, specRows, specCols, selectNumber);
                }

                if (retptr == IntPtr.Zero)
                {
                    ErrorString = GetErrorMessage();
                    return(null);
                }

                return(CommonMethod.CopyDataArrayFromIntptrAndFree <int>(ref retptr, selectNumber));
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #3
0
        /// <summary>
        /// AdvancedIdentify定性分析(光谱的数据点数量必须相同, X轴也必须相同)
        /// </summary>
        /// <param name="srcApiDatas">API原始光谱(未做基线或导数处理),一列X轴,一列Y轴</param>
        /// <param name="apiDatas">API原始光谱插值后,一列X轴,一列Y轴</param>
        /// <param name="inferDatas">干扰组分原始光谱插值后,一列X轴,多列Y轴</param>
        /// <param name="inferRows">干扰组分数据行数(包括X轴)</param>
        /// <param name="sampleDatas">待分析物原始光谱插值后,一列X轴,一列Y轴</param>
        /// <param name="coefMethod">相关系数计算方法</param>
        /// <returns></returns>
        public static double Identify(double[] srcApiDatas, double[] apiDatas, double[] inferDatas, int inferRows, double[] sampleDatas, CoefficientMethod coefMethod)
        {
            if (apiDatas == null || apiDatas.Length == 0 || (apiDatas.Length % 2 != 0))
            {
                ErrorString = "Invalid parameters";
                return(0);
            }

            //apiDatas包括一行X和一行Y
            int specCols = apiDatas.Length / 2;

            if (sampleDatas == null || apiDatas.Length != sampleDatas.Length ||
                inferDatas == null || inferRows < 2 || inferDatas.Length != inferRows * specCols)
            {
                ErrorString = "Invalid parameters";
                return(0);
            }

            try
            {
                if (CommonMethod.Is64BitVersion())
                {
                    return(ADIdendify64(srcApiDatas, apiDatas, inferDatas, inferRows, sampleDatas, specCols, (int)coefMethod));
                }
                else
                {
                    return(ADIdendify32(srcApiDatas, apiDatas, inferDatas, inferRows, sampleDatas, specCols, (int)coefMethod));
                }
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(0);
            }
        }
コード例 #4
0
        /// <summary>
        /// 光谱基线校正
        /// </summary>
        /// <param name="spectrumDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="method">基线校正方法</param>
        /// <returns></returns>
        public static bool BaselineCorrect(double[] spectrumDatas, int specRows, int specCols, BaseLineMethod method)
        {
            if (spectrumDatas == null || spectrumDatas.Length != specRows * specCols)
            {
                ErrorString = "Invalid parameters";
                return(false);
            }

            if (method == BaseLineMethod.None)
            {
                return(true);
            }

            try
            {
                if (CommonMethod.Is64BitVersion())
                {
                    return(ADBaselineCorrect64(spectrumDatas, specRows, specCols, (int)method));
                }
                else
                {
                    return(ADBaselineCorrect32(spectrumDatas, specRows, specCols, (int)method));
                }
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #5
0
        /// <summary>
        /// 光谱相似系数
        /// </summary>
        /// <param name="srcYDatas">光谱的Y轴数据</param>
        /// <param name="destYDatas">光谱的Y轴数据</param>
        /// <param name="coefMethod">系数计算方法</param>
        public static double Coefficient(double[] srcYDatas, double[] destYDatas, CoefficientMethod coefMethod)
        {
            if (srcYDatas == null || destYDatas == null || srcYDatas.Length == 0 || destYDatas.Length != srcYDatas.Length)
            {
                ErrorString = "Invalid parameters";
                return(0);
            }

            try
            {
                if (CommonMethod.Is64BitVersion())
                {
                    return(ADCoefficient64(srcYDatas, destYDatas, srcYDatas.Length, (int)coefMethod));
                }
                else
                {
                    return(ADCoefficient32(srcYDatas, destYDatas, srcYDatas.Length, (int)coefMethod));
                }
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(0);
            }
        }
コード例 #6
0
        /// <summary>
        /// Savitzky–Golay平滑和求导数(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="windowSize">平滑点数</param>
        /// <param name="polyDegree">多项式阶数</param>
        /// <param name="derDegree">导数阶数, 0=平滑</param>
        /// <returns>正确或错误</returns>
        public static bool SGSmoothAndDerivative(double[] specDatas, int specRows, int specCols, int windowSize, int polyDegree, int derDegree)
        {
            try
            {
                if (specDatas == null || specDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPSGSmoothAndDerivative64(specDatas, specRows, specCols, windowSize, polyDegree, derDegree);
                }
                else
                {
                    retcode = PPSGSmoothAndDerivative32(specDatas, specRows, specCols, windowSize, polyDegree, derDegree);
                }
                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #7
0
        /// <summary>
        /// 预测时的MSC多元散射校正(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="averageData">建模平均光谱(从PLS Coefficient获取)</param>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <returns>正确或错误</returns>
        public static bool MutiScatterCorrectionOnPredict(double[] averageData, double[] specDatas, int specRows, int specCols)
        {
            try
            {
                if (specDatas == null || averageData == null || specDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPMutiScatterCorrectionOnPredict64(averageData, specDatas, specRows, specCols);
                }
                else
                {
                    retcode = PPMutiScatterCorrectionOnPredict32(averageData, specDatas, specRows, specCols);
                }
                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #8
0
        /// <summary>
        /// SNV标准正态变换(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="spectrumDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <returns>正确或错误</returns>
        public static bool SNVNormalDistribution(double[] spectrumDatas, int specRows, int specCols)
        {
            try
            {
                if (spectrumDatas == null || spectrumDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPSNVNormalDistribution64(spectrumDatas, specRows, specCols);
                }
                else
                {
                    retcode = PPSNVNormalDistribution32(spectrumDatas, specRows, specCols);
                }

                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #9
0
 /// <summary>
 /// 获取C++ DLL返回的错误信息
 /// </summary>
 private static string GetErrorMessage()
 {
     if (CommonMethod.Is64BitVersion())
     {
         return(GetErrorMessage64());
     }
     else
     {
         return(GetErrorMessage32());
     }
 }
コード例 #10
0
        /// <summary>
        /// 获取DLL错误消息
        /// </summary>
        /// <returns></returns>
        public static string GetDLLErrorMessage()
        {
            IntPtr retptr = IntPtr.Zero;

            if (CommonMethod.Is64BitVersion())
            {
                retptr = GetErrorMessage64();
            }
            else
            {
                retptr = GetErrorMessage32();
            }

            return(CommonMethod.CopyStringFromIntptrAndFree(ref retptr, Encoding.ASCII));
        }
コード例 #11
0
        /// <summary>
        /// 三次样条曲线插值(使用X轴步长)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="stepX">波数间隔</param>
        /// <returns>返回处理后的数据, 第一行是X轴,其余行为Y轴</returns>
        public static List <double[]> SplineCubicInterpolation(double[] specDatas, int specRows, int specCols, double firstX, double lastX, double stepX)
        {
            try
            {
                if (specDatas == null || specRows < 2 || specCols < 2 || stepX == 0 ||
                    (firstX < lastX && stepX < 0) || (firstX > lastX && stepX > 0))
                {
                    throw new Exception("Invalid parameters");
                }

                IntPtr retptr      = IntPtr.Zero;
                int    outColsSize = 0;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = PPSplineCubicInterpolation64(specDatas, specRows, specCols, firstX, lastX, stepX, ref outColsSize);
                }
                else
                {
                    retptr = PPSplineCubicInterpolation32(specDatas, specRows, specCols, firstX, lastX, stepX, ref outColsSize);
                }

                if (retptr == IntPtr.Zero)
                {
                    throw new Exception(CommonMethod.GetDLLErrorMessage());
                }

                List <double[]> retdatas = new List <double[]>();

                //逐行拷贝返回数据,第一行是X轴,其余行为Y轴
                for (int i = 0; i < specRows; i++)
                {
                    double[] rowdata = new double[outColsSize];
                    Marshal.Copy(IntPtr.Add(retptr, i * outColsSize * sizeof(double)), rowdata, 0, outColsSize);
                    retdatas.Add(rowdata);
                }
                Marshal.FreeCoTaskMem(retptr);

                return(retdatas);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #12
0
 /// <summary>
 /// 是否有STANDARDIZING算法授权
 /// </summary>
 public static bool HasAuthority()
 {
     try
     {
         if (CommonMethod.Is64BitVersion())
         {
             return(SDHasAuthority64());
         }
         else
         {
             return(SDHasAuthority32());
         }
     }
     catch (Exception ex)
     {
         ErrorString = ex.Message;
         return(false);
     }
 }
コード例 #13
0
        /// <summary>
        /// 三次样条曲线插值(使用数据点数量,直接返回数组)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="dataCount">数据点数量</param>
        /// <param name="returnArray">直接返回数组</param>
        /// <returns>返回处理后的数据, 第一行是X轴,其余行为Y轴</returns>
        public static double[] SplineCubicInterpolation(double[] specDatas, int specRows, int specCols, double firstX, double lastX, int dataCount, bool returnArray)
        {
            try
            {
                if (specDatas == null || specRows < 2 || specCols < 2 || dataCount < 1)
                {
                    throw new Exception("Invalid parameters");
                }

                //如果数据格式相同,不需要处理
                if (CommonMethod.IsSameXDatas(specDatas[0], specDatas[specCols - 1], firstX, lastX, dataCount) && dataCount == specCols)
                {
                    return(specDatas);
                }

                IntPtr retptr = IntPtr.Zero;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = PPInterpolationUseDataCount64(specDatas, specRows, specCols, firstX, lastX, dataCount);
                }
                else
                {
                    retptr = PPInterpolationUseDataCount32(specDatas, specRows, specCols, firstX, lastX, dataCount);
                }

                if (retptr == IntPtr.Zero)
                {
                    throw new Exception(CommonMethod.GetDLLErrorMessage());
                }

                double[] retdatas = new double[dataCount * specRows];
                Marshal.Copy(retptr, retdatas, 0, retdatas.Length);

                Marshal.FreeCoTaskMem(retptr);

                return(retdatas);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #14
0
        /// <summary>
        /// 使用光谱校正系数,校正光谱
        /// </summary>
        /// <param name="coefData">光谱校正系数(BYTE)</param>
        /// <param name="slaveData">光谱数据</param>
        /// <param name="specRows">光谱的数量</param>
        /// <param name="specCols">每条光谱数据数量</param>
        /// <param name="withXDatas">是否包含X轴数据</param>
        /// <returns>校正后的光谱,与slaveData大小相同</returns>
        public static double[] ApplyCoefficient(byte[] coefData, double[] slaveData, int specRows, int specCols, bool withXDatas)
        {
            try
            {
                if (coefData == null || slaveData == null || specRows < 1)
                {
                    throw new Exception("Invalid parameters");
                }
                if (!IsValidCoef(coefData, specCols))
                {
                    throw new Exception("Invalid parameters");
                }

                IntPtr retptr = IntPtr.Zero;

                if (CommonMethod.Is64BitVersion())
                {
                    retptr = SDApplyCoefficient64(coefData, slaveData, specRows, specCols, withXDatas);
                }
                else
                {
                    retptr = SDApplyCoefficient32(coefData, slaveData, specRows, specCols, withXDatas);
                }

                if (retptr == IntPtr.Zero)
                {
                    ErrorString = GetErrorMessage();
                    return(null);
                }

                return(CommonMethod.CopyDataArrayFromIntptrAndFree <double>(ref retptr, specCols * specRows));
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #15
0
        /// <summary>
        /// 根据主机光谱创建辅机的校准系数
        /// </summary>
        /// <param name="algorithmType">校准算法</param>
        /// <param name="masterData">主机数据(一条光谱一行Y轴数据)</param>
        /// <param name="slaveData">辅机数据(一条光谱一行Y轴数据)</param>
        /// <param name="specRows">光谱的行数</param>
        /// <param name="specCols">每条光谱的数据点数量</param>
        /// <param name="windowSize">校准窗口大小(PDS), RANK(SST)</param>
        /// <param name="tolerance">校准偏差(PLS)</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="withXDatas">是否包含X轴数据</param>
        /// <returns>校准系数</returns>
        public static byte[] GetCoefficient(enumAlgorithmType algorithmType, double[] masterData, double[] slaveData, int specRows, int specCols,
                                            int windowSize, double tolerance, double firstX, double lastX, bool withXDatas)
        {
            if (masterData == null || slaveData == null || specRows < 2 || specCols < windowSize + 1 || windowSize < 1 ||
                masterData.Length != specRows * specCols || masterData.Length != slaveData.Length)
            {
                ErrorString = "Invalid Parameters";
                return(null);
            }

            try
            {
                IntPtr retptr   = IntPtr.Zero;
                int    datasize = 0;
                switch (algorithmType)
                {
                case enumAlgorithmType.PDS:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = PDSCoefficient64(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = PDSCoefficient32(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                case enumAlgorithmType.PLS:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = PLSCoefficient64(masterData, slaveData, specRows, specCols, windowSize, tolerance, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = PLSCoefficient32(masterData, slaveData, specRows, specCols, windowSize, tolerance, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                case enumAlgorithmType.SST:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = SSTCoefficient64(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = SSTCoefficient32(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                default:
                    break;
                }

                if (retptr == IntPtr.Zero)
                {
                    ErrorString = GetErrorMessage();
                    return(null);
                }

                return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize));
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }