/// <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)); }
/// <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); }
/// <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); }
//相对强度自检 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); } }