Exemple #1
0
        /// <summary>
        /// 计算光谱文件的信噪比SNR
        /// </summary>
        /// <param name="filename">光谱文件</param>
        /// <param name="intStart">信号区间起始波数</param>
        /// <param name="intEnd">信号区间结束波数</param>
        /// <param name="noiseStart">噪声区间起始波数</param>
        /// <param name="noiseEnd">噪声区间结束波数</param>
        /// <returns>信噪比SNR值, 如果返回0,表示出错了</returns>
        private float calulateSNR(string filename, float intStart, float intEnd, float noiseStart, float noiseEnd, out float noiseInteValue, out float singalInteValue)
        {
            noiseInteValue = singalInteValue = 0;
            SpecFileFormat spcdata = new SpecFileFormat();

            if (spcdata.ReadFile(filename) == false)
            {
                ErrorString = spcdata.ErrorString;
                return(0);
            }

            singalInteValue = (float)SpectrumAlgorithm.Integrate(spcdata.XDatas, spcdata.YDatas, intStart, intEnd);
            if (singalInteValue == 0)
            {
                ErrorString = "光谱积分计算错误";
                return(0);
            }

            noiseInteValue = (float)SpectrumAlgorithm.CalculateRMS(spcdata.XDatas, spcdata.YDatas, noiseStart, noiseEnd);
            if (noiseInteValue == 0)
            {
                ErrorString = "光谱RMS计算错误";
                return(0);
            }

            return((float)(singalInteValue / noiseInteValue));
        }
Exemple #2
0
        /// <summary>
        /// 加载并解析协议定义文件[TODO]
        /// </summary>
        /// <param name="specUrl">协议定义文件地址</param>
        /// <returns></returns>
        public static SpecFile ParseContractFile(string specUrl, SpecFileFormat format)
        {
            if (format != SpecFileFormat.Ini)
            {
                throw new NotSupportedException();
            }

            List <EnumContract> defList    = new List <EnumContract>();
            List <DataContract> impList    = new List <DataContract>();
            SpecFile            fileDefine = new SpecFile();

            using (IniFile ini = new IniFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, specUrl)))
            {
                fileDefine.FileUrl  = ini.Path;
                fileDefine.FileName = Path.GetFileName(ini.Path);

                string[] allSecNames = ini.GetSectionNames();

                Dictionary <string, string> secDict = new Dictionary <string, string>();
                foreach (string secName in allSecNames)
                {
                    #region 对定义区间解析
                    if (secName.Equals("define", StringComparison.InvariantCultureIgnoreCase))
                    {
                        secDict = ini.GetSectionValues(secName);
                        string itemComment = string.Empty;
                        #region 读取枚举定义(define)
                        foreach (var k in secDict.Keys)
                        {
                            itemComment = ini.GetComment(secName, k);
                            defList.Add(EnumContract.Parse(k, itemComment, secDict[k]));
                        }
                        #endregion
                    }
                    else if (secName.Equals("RequestContract", StringComparison.InvariantCultureIgnoreCase))
                    {
                        fileDefine.RequestContract = ReadAsContract(fileDefine, secName, ini.GetSectionValues(secName), (s, k) => ini.GetComment(s, k), ImportSpecFile);
                    }
                    else if (secName.Equals("ResponseContract", StringComparison.InvariantCultureIgnoreCase))
                    {
                        fileDefine.ResponseContract = ReadAsContract(fileDefine, secName, ini.GetSectionValues(secName), (s, k) => ini.GetComment(s, k), ImportSpecFile);
                    }
                    else
                    {
                        #region 读取规范导入(import)
                        impList.Add(ReadAsContract(fileDefine, secName, ini.GetSectionValues(secName), (s, k) => ini.GetComment(s, k), ImportSpecFile));
                        #endregion
                    }
                    #endregion
                }
            }

            fileDefine.MerginDefineWith(defList);
            fileDefine.MerginImportWith(impList);
            return(fileDefine);
        }
Exemple #3
0
        /// <summary>
        /// 计算Accuracy_PeakPoints指定位置的当前光谱的峰位
        /// </summary>
        /// <param name="filename">光谱文件名</param>
        /// <returns>峰位值</returns>
        private float[] Accuracy_Calculate(string filename)
        {
            //读取SPC光谱数据
            SpecFileFormat spcData = new SpecFileFormat();

            if (spcData.ReadFile(filename) == false)
            {
                ErrorString = spcData.ErrorString;
                return(null);
            }

            float[] peakPicked = new float[SettingData.settingData.accuracy_test.peakPoint.Count];
            double  newyvalue  = 0;

            for (int i = 0; i < peakPicked.Length; i++)
            {
                //获取指定点的峰位
                peakPicked[i] = (float)SpectrumAlgorithm.PickPeak(spcData.XDatas, spcData.YDatas, SettingData.settingData.accuracy_test.peakPoint[i], 1, out newyvalue);
            }

            return(peakPicked);
        }
Exemple #4
0
        //相对强度自检
        private bool Intensity_CalThread()
        {
            Border parentBorder = y_cal;

            ErrorString = null;
            try
            {
                SettingFile.Intensity_Test intensityTest = SettingData.settingData.intensity_test;

                Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetTitleTextDelegate(SetTitleText), "正在自检相对强度......");        //设置为正在处理
                Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetStateDelegate(SetState), parentBorder, processStatus.RUN); //设置为正在处理

                //扫描并保存光谱i
                string savefile = null;
                if (!simulator)
                {
                    savefile = System.IO.Path.Combine(fileSavePath, "Intensity" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".spc");
                    CommonMethod.AddToLogFile("Intensity Test Scan, savefile=" + savefile);
                    if ((savefile = RamanInstrument.Measurement(intensityTest.scanPara, savefile, true)) == null)
                    {
                        throw new Exception(RamanInstrument.ErrorString);
                    }
                }
                else
                {
                    savefile = tempIntensityFile;
                }

                intensitySpectrumFile = savefile;

                //读取当前扫描的光谱
                SpecFileFormat fileData = new SpecFileFormat();
                if (!fileData.ReadFile(savefile))
                {
                    throw new Exception("读取文件错误:" + savefile);
                }

                CommonMethod.AddToLogFile("Intensity Test Calculate, savefile=" + savefile);
                //计算各区间的积分, regions + baseRegion
                double[] integValue = new double[intensityTest.regions.Count + 1];

                //创建积分结果表
                intensityDataTable.Columns.Clear();
                intensityDataTable.Rows.Clear();
                intensityDataTable.Columns.Add("积分范围(cm-1)");     //第一行的类型
                //regions的积分
                for (int i = 0; i < intensityTest.regions.Count; i++)
                {
                    intensityDataTable.Columns.Add(intensityTest.regions[i].firstX.ToString() + "-" + intensityTest.regions[i].lastX.ToString());    //表标题
                    integValue[i] = Common.SpectrumAlgorithm.Integrate(fileData.XDatas, fileData.YDatas, (float)intensityTest.regions[i].firstX, (float)intensityTest.regions[i].lastX);
                }
                //最后一列是baseRegion的积分
                intensityDataTable.Columns.Add(intensityTest.baseRegion.firstX.ToString() + "-" + intensityTest.baseRegion.lastX.ToString());    //表标题
                integValue[integValue.Length - 1] = Common.SpectrumAlgorithm.Integrate(fileData.XDatas, fileData.YDatas, (float)intensityTest.baseRegion.firstX, (float)intensityTest.baseRegion.lastX);

                //所有RgnThresold区域的阈值
                string[] thresoldArray = new string[intensityTest.regions.Count + 2];   //regions+baseregion+名称
                thresoldArray[0] = "标准范围";
                string[] valueArray = new string[intensityTest.regions.Count + 2];      //regions+baseregion+名称
                valueArray[0] = "测量值";

                //计算regions / baseregion
                intensityResult = true;
                for (int i = 0; i < integValue.Length - 1; i++)
                {
                    float resultvalue = (float)(integValue[i] / integValue[integValue.Length - 1]);
                    if (!intensityTest.thresolds[i].valueOk(resultvalue))
                    {
                        intensityResult = false;
                    }

                    thresoldArray[i + 1] = intensityTest.thresolds[i].minimum.ToString() + "-" + intensityTest.thresolds[i].maximum.ToString(); //记录每个阈值
                    valueArray[i + 1]    = resultvalue.ToString("F2");                                                                          //记录每个相对强度
                }

                //801基准积分区间
                thresoldArray[thresoldArray.Length - 1] = "1";
                valueArray[valueArray.Length - 1]       = "1";

                if (intensityResult == false)
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetStateDelegate(SetState), parentBorder, processStatus.ERROR);    //设置为未处理
                }
                else
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetStateDelegate(SetState), parentBorder, processStatus.OK);    //设置为已处理
                }
                intensityDataTable.Rows.Add(thresoldArray);
                intensityDataTable.Rows.Add(valueArray);

                //将结果数据记录到log文件中
                StreamWriter writer = new StreamWriter(Path.Combine(fileSavePath, "calibration.csv"), true, System.Text.Encoding.GetEncoding(SettingData.GBCode2312));

                //标题
                writer.WriteLine();
                writer.WriteLine("相对强度");
                string writestr = "";

                //写入积分区间(intensityDataTable的标题)
                for (int i = 0; i < intensityDataTable.Columns.Count; i++)
                {
                    writestr += intensityDataTable.Columns[i].ColumnName + ",";
                }
                writer.WriteLine(writestr);

                //写入各区间的积分值
                writestr = "积分值,";
                for (int i = 0; i < integValue.Length; i++)
                {
                    writestr += integValue[i].ToString() + ",";
                }
                writer.WriteLine(writestr);

                //写入各区间的阈值和实际计算值
                for (int j = 0; j < intensityDataTable.Rows.Count; j++)
                {
                    writestr = "";
                    for (int i = 0; i < intensityDataTable.Columns.Count; i++)
                    {
                        writestr += intensityDataTable.Rows[j].ItemArray[i].ToString() + ",";
                    }
                    writer.WriteLine(writestr);
                }
                writer.Close();

                return(true);
            }
            catch (System.Exception ex)
            {
                Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetStateDelegate(SetState), parentBorder, processStatus.ERROR);    //设置为未处理
                ErrorString = ex.Message;
                CommonMethod.AddToLogFile(ex.Message);

                return(false);
            }
        }