




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成都理工大学毕业设计(论文)接入网络的辐射测量数据传输与谱处理作者姓名:舒为 专业班级:201006090104指导老师:周建斌摘要随着计算机通信的发展,我们身边的很多事物开始接入互联网。在这样的背景下,我尝试将辐射测量仪器接入网络。本文设计目的是:将本地计算机控制下的仪器所测量的数据传送给局域网中的其他计算机。本文设计中用到的工具有Visual C+ 6.0、Visual Studio 2012;开发环境为MFC和Win32;使用到的程序设计语言是C/C+;操作系统平台基于64位Windows 7旗舰版;通信协议选择串口协议、TCP/IP协议;传送的谱数据为由高纯锗探测器产生的4096道Ga
2、mma谱;谱数据处理:光滑、寻峰、寻边界、计算峰面积。关键词:C/C+;TCP/IP通信;Gamma谱;数据处理Abstract:With the development of computer communication, things around us began to access the global internet. Under such background, I try to make the instruments of radiation measuring access internet. This article is designed to send data fr
3、om local computer to another computer in Local area network. Tools used in this article include Visual C+ 6.0、Visual Studio 2012; Programming language is C/C+; Platform is based on Windows 7 Ultimate 64bit; Communication Protocol include Serial protocol、TCP/IP; Data to be transmitted is Gamma Spectr
4、al data with 4096 channel; Spectral data processing method include Smoothing、Peak Searching、finding boundary、Calculating peak area.Key Word: C/C+; TCP/IP; Gamma; Data Processing目录摘要1第一章 前言51.1选题依据51.2现状51.3研究内容5第二章 平台介绍与搭建62.1平台搭建62.2特点6第三章 通信协议63.1串口通信63.1.1 特点(参考自51单片机P125)63.1.2 通信方式(参考自51单片机P127
5、)63.1.3 串行通信的错误校验(参考自51单片机P127)73.2TCP/IP通信73.2.1 OSI模型与TCP/IP模型(参考自鸟哥服务器篇P36)73.2.2 TCP/IP数据格式93.2.3 错误检测机制9第四章 谱分析方法104.1最小二乘法谱光滑(参考多道脉冲分析系统原理Word版)104.2求导公式(参考多道脉冲分析系统原理Word版)124.2寻峰与寻边界144.2.1 导数寻峰原理(参考多道脉冲分析系统原理)144.2.2 先寻边界后寻峰(参考DEV一阶导数寻峰程序)144.2.3 先寻峰后寻边界(参考多道脉冲分析系统原理Word)194.3计算面积21第五章 重要功能实
6、现方法(无参考)225.1新建工程225.1.1 VC6.0新建单文档工程225.1.2 VC2012新建单文档工程225.1.3 VC2012新建Win32工程225.1打开文件225.1.1 MFC类库打开文件225.1.2 Windows API打开文本文档245.1.3打开元素信息表265.1.4打开能量刻度文件265.2元素匹配275.7实现窗口滚动275.9双缓冲消除图像闪烁285.3建立坐标轴295.8绘制鼠标点击线305.6填充峰面积305.10通信315.11图像显示31结论33致谢33参考文献34第1章 前言1.1 选题依据今年来,网络技术发展迅猛,得利于网络技术的发展,加
7、速了物联网时代的到来,现在各个商家生产销售的仪器设备,很多都会附带网络功能,将仪器设备接入网络,已成为一种趋势。设备接入网络的优势:1、实时监控。传统仪器在工作时,需要人实时监控;如果在没有人监控的情况下,仪器出现故障,将不能被及时发现。利用实时网络监控,可在第一时间发现仪器出现的故障,以使其得到及时的修复。 2、安全性高。传统仪器在数据采集完毕后,将数据存放在仪器中,这需要仪器有一定大小的存储空间,当存储空间不够时,将不得不删除一部分数据;如果存储器坏掉,大量重要的数据将丢失,造成不可挽回的损失。利用网络,将数据实时备份到服务器中,即使仪器出现故障,数据也不会丢失。3、共享性好。传统仪器采集
8、得到的数据,直接存放在机器中,要想查看数据,必须将数据先提取出来。利用网络传输能力,将采集得到的数据放进服务器,当有人想要查看数据时,直接向服务器发出数据请求,即可查看数据,方便快捷高效。4、更精确。在便携式仪器上,做数据处理,得到的结果不是太准确,这是因为便携式仪器满足了便携性,丢掉了计算速度。如果将数据传输到网络上的计算机中,利用计算机的强大数据处理能力,可以得到一些更好的结果。仪器测量得到的数据,与理想数据在一定范围内存在偏差。为了将得到的数据进行修正,同时,为了将数字量翻译成文字描述,我们有必要对得到的谱数据进行处理。在数据的处理过程中,因为涉及到网络传输,为了获得更好的实时性,所以选
9、取简单的谱数据处理方法。我对计算机语言很感兴趣,在课下做了一些计算机方面的练习;在课程中,涉及到数据处理的部分我都尽力去做,积累一些数据处理的经验,有做这部分工作的能力。在我接触到的核仪器中,都没能实现联网功能。在这样的背景下,有必要做一些尝试。而且我对网络通信非常感兴趣,希望通过此次做毕业论文的契机,好好学习一下网络相关知识与C/S模式原理,满足自己的好奇心。这也是促使我选择此题目的原因。1.3研究内容 本文要完成的工作是将数据从一台机器发送到另一台机器,然后将接收到的谱数据进行数据分析。为了达到这个目的,我选择TCP/IP通信协议作为数据传输约定。在本文中对TCP/IP协议,有一个大概的介
10、绍。在之前学习串口通信中,试验中用到的数据量很少,一次通信只有几个字符。然而在本文中,在我自定义的数据格式中,一个数据单位会有40Kbyte大小。考虑到局域网中,数据传输速度可达到数MByte每秒,理论上,在客服端完全可以实现实时数据显示而不会对通信线路产生负载压力。在程序设计过程中,我采用从底向上的设计办法,即先编写代码实现单一的功能,在所有功能都实现后,将程序的所有功能都集中到一起。对于之前没有接触过通信的我来说,这是比较简单的一种方法。因为在一个工程中只涉及到单一功能,因此在代码调试过程中,可以很方便的查找问题所在,在遇到不能解决的问题时,也能在短时间内解决。在解决问题的过程中,我会在工
11、作日志中建立相应的问题描述以及解决方案,在做程序功能集成时,当某一模块发生问题时,我能很快地通过工作日志找到问题所在,并在短时间内解决。在程序的设计过程中,主要有三大模块TCP/IP模块、串口模块、 数据处理模块。在TCP/IP模块中,我主要做的工作定义了数据块的数据结构,在这个结构中,4096个谱数据,每一个数据占用十个字节的内存,之所以这样做,是因为每一个整数数据转化为字符数据后,字符数据的长度不一,在接收到TCP/IP数据包之后,对数据包的解读比较麻烦。为了让数据打包和解包算法简便,我增加了每一个数据占用的字节数。在本地环回地址和局域网中两台电脑上测试,能数据发送和接收的功能。在串口模块
12、中,只做数据的接收显示。数据处理模块是本文的重点,在做数据处理过程中,除了文中介绍的方法外,在数据光滑、寻峰寻边界过程中,还用到了其他方法,但文中介绍的方法是我做过的方法中效果最好的。程序中的三个模块,我都做了一遍,正文中会一一介绍。在做功能集成时,我发现在多线程程序中,很容易出问题,由于时间不足,这个问题一直没有得到解决。于是在多线程中,我做了一些新的尝试。文中会有介绍。第2章 开发环境介绍2.1 软件选择本文中用到的开发软件有VC6.0企业中文版、VS2012官方英文版。之所以用VC6.0,一是因为在学校里刚开始计算机语言,做程序设计时就是用的这个版本,期间积累的许多工程需要这个版本软件来
13、打开,二是在Win7操作系统下的运行速度很快,很适合学习。但是,当程序代码越写越长,用的变量越来越多,变量名越来越长时,就会发现用VC6.0会产生一些拼写上的错误,即使再小心,也未必能在一次编写完程序时,编译不出错。VS2012是微软推出的新版本开发工具,能很好地支持Win7 64位操作系统,而VC6.0在Win7 64位环境下运行时,打开文件会导致程序崩溃,添加Axtive X控件会提示错误。而VS2012有智能提示功能,在拼写代码时,系统会自动匹配代码,提供给我们选择,这一功能大大提高了代码编写的准确度。其次,VS2012包含了很多的依赖文件,通过这些依赖文件,系统自动匹配我们在程序中使用
14、到的变量,如果没有某一变量的定义,系统将在该变量的下方画上波浪线,标记成错误状态,这一功能大大提高了最终编译程序的正确性。在VC6.0中,我们用的一些C函数,并不是国际标准,在使用过程中,也会出现一些安全性问题(如itoa、sprintf等函数)。VS2012提供更多标准化的C函数,并针对在旧版本开发工具中出现的问题提供解决方案。2.2 安装2.2.1 VC6.0安装VC6.0中文完整版下载地址: 为了在Win7 64位旗舰版操作系统下获得比较好的兼容性,安装过程中请参考如下网站提供的安装方法: VC6.0 MSDN完整版下载地址:/pub/software/
15、program/MSDN_OCT_2001.ISO 2.2.2 VS2012安装VS2012官方英文版下载地址:VS2012 MSDN官方英文版下载地址: 第3章 通信协议3.1串口通信3.1.1 特点(参考自51单片机P125)数据在单条位宽为1的传输线上,一位接一位按顺序传送的方式成为串行通信,在通信中,一个数据包包含一个起始位,随后部分包含自定义位数(一般选择8位)的数据位,紧接着是校验位,可以自定义不同的校验方式,随后是停止位,停止位也可自定义。串口通信的一个数据包的结构如下所示:停止位校验位起始位空闲数据空闲B01234567CS发送接收接收发送发送接收接收发送接收发送3.1.2 通
16、信方式(参考自51单片机P127)单工 半双工 全双工如上图所示,串口有三种通信方式:单工、半双工、全双工。单工:数据传输仅沿一个方向,不能实现反向传输。半双工:数据传输可以沿两个方向,但因为只有一条数据通路,发送和接收只能分时进行。全双工:因为有两条数据通路,可以同时实现数据的发送与接收。3.1.3 串行通信的错误校验(参考自51单片机P127)(1)奇偶校验在发送数据时,数据尾部的一位为校验位(1或0),奇校验时,数据中1的个数与校验位1的个数之和应为奇数;偶校验时,数据位中1的个数与校验位1的个数之和应为偶数。接收字符时,对于1的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错
17、。(2)代码和校验发送方将待发送的数据进行运算(各字节求和或各字节异或),将产生的结果附加到数据块的末尾。接收方接收到数据后,进行相同的运算,如果计算的结果和接收到的校验值不一样,则说明数据传送过程中出现了差错。(3)循环冗余校验通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。3.2TCP/IP通信接收端发送端3.2.1 OSI模型与TCP/IP模型(参考自鸟哥服务器篇P36)Data应用程序应用程序DataH应用层Data-Link LayerApplication LayerHHData表示层Presentation LayerHHHDat
18、a会话层Session LayerHHHHData传输层Transport LayerHHHHHData网络层Network LayerCDataHHHHHH数据链路层比特流(一串0与1)Physical Layer物理层传输介质OSI七层协议中的数据传递方式从上图中可以看到,OSI七层模型,在发送端,下层会对来自上层的数据进行封装,每经历一层,数据包都会添加一个报头(Header),数据到达物理层后,由传输介质(如光纤、网线等)传输到接收端。接收端接收到数据包后,由下往上,对数据包进行拆封,每经历一层,数据包报头都被相应层给去掉,在数据到达应用程序时,只剩下数据部分。OSI七层协议十分严谨,
19、是学习网络的标准模型。但因为过分严谨,使程序撰写十分不易,为了简化程序开发过程,于是便出现了基于OSI七层模型的TCP/IP模型。TCP/IP是OSI七层模型的简化形式。HTTPFTPTCPUDP应用层传输层网络层网络接口层数据链路层物理层网络层传输层应用层表示层会话层UDPICMPARPOSI与TCP/IP协议相关性从上图中可以看到,TCP/IP协议将OSI七层模型简化成了四层,每一层都定义了很多的协议,用来完成不同的工作。TCP/IP模型中的传输层、网络层、网络接口层受操作系统控制,而我要编写的应用程序将主要针对应用层。虽然编写的软件作用于应用程序接口层,但探讨TCP/IP协议下,数据如何
20、进行传输,不同计算机、不同网络如何通信,对我们深刻理解通信协议大有裨益。TCP/IP协议在计算机世界中, 已经成功运行几十年,我们学习它的工作方式,也是对前人工作成果的一种继承。下文中,将对TCP/IP协议做部分介绍。3.2.2 MAC数据帧(参考网络 )在数据链路层,协议数据单元PDU称为帧(frame),也叫MAC,它是网线上传送数据的最小单位。以下为MAC数据帧结构:前导码8 Byte目的地址6 Byte源地址6 Byte长度指示2 ByteLLC数据46-1500 Byte帧校验序列4 Byte前导码:在用协议分析器对网络数据包进行抓取分析时,我们并没有看到前导码,对于前导码的格式如下
21、:10101010101010101010101010101010101010101010101010101010前导码一共7个字节,在前导码之后的一个字节帧起始定界符 (SDF),用于指示一帧的开始,帧起始定界符为10101011。目的地址:为本机网卡卡号,查看本机网卡卡号,可以在命令行界面中输入ipconfig查看。目的地址:为MAC数据帧将要到达的目的地机器网卡卡号。长度指示:长度指示为2字节,用于标识该帧数据所使用的协议类型,如下为已分配的协议类型编号:类型协议0x0800IPV40x86ddIPV60x0806地址解析协议(Address Resolution Protocol, A
22、RP)0x809bAppleTalk0x8137Novell互联网包交换(Internetwork Packet Exchange,IPX)LLC数据:LLC帧是对IP数据帧的封装,帧数据结构部如下:目的地服务访问点(DSAP)1Byte源地址服务访问点(SSAP)1Byte控制字段1ByteIP数据帧3.2.3 TCP/IP数据帧(参考鸟哥服务器篇P68)IP数据帧有两种结构:IPV4和IPV6,目前IPV4使用最为广泛,本文仅介绍IPV4有关内容。在网络中,每一台计算机有一个网卡卡号,代表了计算机的身份。在网络上,计算机要想实现联网,也必须要有一个身份表示,这个身份标识就是IP地址。IP数
23、据帧封装了发送方和接收方的网络地址,在网络上传输的数据包,会在网络介质的帮助下传送到接收方,靠的就是IP地址。当接收方接收到数据帧之后,会一层一层地解析数据帧,最终将数据转交给应用程序。MAC、IP、TCP、实际数据个关系如下:MAC总长度IP总长度TCP总长度MAC帧头IP包头TCP报头实际数据资料3.2.4 可靠数据传输(参考网络)TCP/IP之所以可以实现无差错数据传输,是通过发送确认信息和超时重传两种机制实现。发送端每发送一个数据包,在接收端接收到数据之后,都会产生确认信息返回给发送端。当发送端发送一个数据,在一定时间内没有收到来自接收端的确认信息时,发送端会自动再一次发送数据。在接收
24、端接收到数据之后,会根据接收到的数据的校验位数据,对数据进行校验,如果校验成功就接收,如果校验失败,就丢弃数据包。3.2.5 WireShark协议分析器(参考TCP/IP协议原理与应用P20) 协议分析是进入网络通信系统,捕获在网络中传输的数据流,对数据流转化为可阅读形式的过程。协议分析可用来诊断网络故障、测试网络、研究网络性能。下图为利用WireShark抓取的一个TCP网络数据包:在数据包中,包含了发送端、接收端的网卡地址,源、目的地IP地址,数据包协议类型,数据包大小等信息。通过查看WireShark获取的数据包信息,我们能对数据通信有更直观的认识。第4章 谱分析方法4.1最小二乘法谱
25、光滑(参考多道脉冲分析系统原理Word版)最小二乘法平滑公式:其中,代表光滑后的数据点,2k+1代表了待光滑的数据点个数,根据光滑数据点个数的不同,可以确定的取值和j的取值。例如,本文中,光滑数据,用的是5点光滑, = 35,j=-2,-1,0,1,2,于是得到如下公式:下表中列出了最小二次光滑计算公式的参数信息:579111315172k+1 j-21-8-78-6-7-11-137-6-3604218-5-21998727-4-214441612234-3-3339692114739-212654842416242-1177598925167430126548424162421-33396
26、921147392-2144416122343-219987274-36042185-11-1376-78-67-21835212314291431105323NK如下是程序中数据光滑代码:/Smooth_1for(i = 2;i<4094;i+)temp_smth1i = (-3*datai-2.src+12*datai-1.src+17*datai.src+12*datai+1.src-3*datai+2.src)/35.0;/Smooth_2for(i = 4;i<4092;i+)temp_smth2i = (-3*temp_smth1i-2+12*temp_smth1i-1
27、+17*temp_smth1i+12*temp_smth1i+1-3*temp_smth1i+2)/35.0;/Smooth_3for(i = 6;i<4090;i+)temp_smth3i = (-3*temp_smth2i-2+12*temp_smth2i-1+17*temp_smth2i+12*temp_smth2i+1-3*temp_smth2i+2)/35.0;/Put Smooth Data into datai.smthfor(i = 0;i<4096;i+)datai.smth = temp_smth3i;注意:光滑过程中,我们看到,每光滑一次数据,在数据的首尾各丢
28、失两个数据。三次光滑,总共丢失十二个数据。过程如下表所示:数据编号0.4095光滑一次2.4093光滑两次4.4091光滑三次640894.2求导公式(参考多道脉冲分析系统原理Word版)本文中用到了一阶、二阶最小二乘法导数,求导公式如下:公式中各参数根据选取数据点数的不同,取不同的值,具体对应关系如下表所示:最小二乘移动平滑法计算平滑谱的一阶导数公式579111315172k+1 j748-812922-98-71133-4121-643-6300-660-14150-930-586-294-1578-18334-1002-422-142-532-1796-17842-902-31-67-1
29、93-503-1489-13843-673-2-8-58-126-296-832-7506-358-10000000085812629683275063581-1671935031489138436732-221425321796178429023-8629415781833410024-300660141509305-113341216436-129229877488122521188514824024334152-23256NK最小二乘移动平滑计算平滑谱的二阶导数公式579111315172k+1 j40-89125-7225212-61511191-52862-8-8-457-1-5-2
30、9-15-320-8-6-10-48-20-2-1-3-17-9-13-53-23-1-2-4-20-10-14-56-240-1-3-17-9-13-53-23120-8-6-10-48-20257-1-5-29-1532862-8-841511191522521269125740840NK本文求导,选取数据点数为5,故求导公式如下:一阶导数:二阶导数:如下是程序中,一阶导数的代码:for(i = 8;i<4088;i+)temp_derv1i =(+datai-2.smth-8*datai-1.smth+8*datai+1.smth-datai+2.smth)/12.0; for(i
31、 = 0;i<4096;i+)datai.derv1 = temp_derv1i;如下是程序中,二阶导数的代码:for(i = 8;i<4088;i+)temp_derv2i =(+2*datai-2.smth-datai-1.smth-2*datai.smth-datai+1.smth+2*datai+2.smth)/7.0;4.2寻峰与寻边界4.2.1 导数寻峰原理(参考多道脉冲分析系统原理)如下图,我们可以看到,光滑数据的峰值点和一阶导数由正变负过零点的点一一对应。利用这一性质,从0道址开始左侧,依次检索一阶导数值数据由正变负过零点的点,便可找到光滑数据的所有峰值点。4.2.
32、2 先寻边界后寻峰(参考DEV一阶导数寻峰程序)在上一节中,我阐述了利用一阶导数寻找峰值点的原理。但是,这里存在一个问题,我们知道,测量得到的谱数据,存在波动,按照上述方法,我们会找到很多的假峰,如何剔除假峰,是我要解决的问题。在多道脉冲分析系统原理中,我找到一种方法,在这种方法中: 先利用一阶导数寻找左右边界,再在每一段拥有左右边界的数据范围内,根据一阶导数由正变负过零点的性质,确定峰值点。判断条件如下:确定左边界:确定右边界:在峰区的左、右边界确定之后,需要检验峰区的宽度。利用下述公式:参数说明:1、是道的谱数据。是道平滑谱的一阶导数值。K为常数,是对应于某一置信度时正态分布的横坐标。K值
33、与置信度的关系如下表所示:置信度K0.9993.0900.9952.5760.9902.3260.9751.9600.9501.6450.9001.2820.8000.8420.7500.6750.7000.5250.6000.2540.50002、中mL道一阶导数值的标准偏差。当变换窗口为五点时然而,在写程序的过程中,我发现几个问题:1、 找到的左右边界无对应关系2、寻找到的左边界或者右边界中,常常几个数值连在一起3、存在很多假边界解决办法:1、在找到的左右边界中,首先将连在一起的数值点,选择一个进行保留,注意:对左右边界的处理,建议单独进行。保留原则如下:程序中的代码如下:for(i =
34、6;i<4090;i+)/寻找左边界if(+datai.data_derv > K*sqrt(datai.data_lsf) &&datai.data_lsf >0)if(+datai+1.data_derv > K*sqrt(datai+1.data_lsf) &&datai+1.data_lsf > datai.data_lsf)if( +datai+1.data_derv > datai.data_derv -0.1*sqrt(4*(datai+2.data_lsf +datai-2.data_lsf)+(datai+1
35、.data_lsf + datai-1.data_lsf)datai.data_lf_bdr = i;/去掉连在一起的边界值,按原则保留左边界值for(i = 4089;i>=6;i-)if(datai.data_lf_bdr>0 && datai-1.data_lf_bdr > 0)datai.data_lf_bdr = 0;/寻找右边界for(i = 6;i<4090;i+)if(fabs(datai.data_derv)<= sqrt(datai.data_lsf)+ (0.1*sqrt(4*(datai+2.data_lsf + datai
36、-2.data_lsf)+(datai+1.data_lsf + datai-1.data_lsf) && datai.data_derv < 0)if(datai-1.data_derv <= datai.data_derv + 0.1*sqrt(4*(datai+2.data_lsf + datai-2.data_lsf)+(datai+1.data_lsf+ datai-1.data_lsf)&& datai.data_derv + 0.1*sqrt(4*(datai+2.data_lsf + datai-2.data_lsf)+(datai+
37、1.data_lsf + datai-1.data_lsf) < 0)if(datai.data_derv <= datai+1.data_derv + 0.1*sqrt(4*(datai+2.data_lsf + datai-2.data_lsf)+(datai+1.data_lsf + datai-1.data_lsf)datai.data_rt_bdr = i; for(i = 6;i<4090;i+)/去掉连在一起的边界值,按原则保留右边界值if(datai.data_rt_bdr > 0 && datai+1.data_rt_bdr >
38、0)datai.data_rt_bdr = 0;2、左右边界处理完毕之后。开始将左边界与右边界进行绑定,集体操作如下:a)在存储左边界的数组中,从0道址开始,寻找左边界,然后在存储右边界的数组中,以寻找到的左边界为起点,寻找右边界数组中,边界值不为0的第一个数据。然后在左右边界内,判断是否存在峰值点,如果不存在,则左边界不动,继续在右边界数组中查找。b)左边界和右边界绑定完毕后,将右边界中多余的数据全部置为0。程序代码如下:/将左边界和右边界进行一一对应for(i = 6;i<4090;i+) if(datai.data_lf_bdr > 0) for(j = i;j<409
39、6;j+)if(dataj.data_rt_bdr >0) for(k = i;k<j;k+) if(datak.data_derv < 0 && datak+1.data_derv>0 datai.data_lf_bdr = 0;break;break;/过滤右边界数组中多余的数据for(i = 0;i<4096;i+)if(datai.data_lf_bdr > 0) for(j = i;j<4096;j+)if(dataj.data_rt_bdr > 0) temp_rt_bdrj = dataj.data_rt_bdr;b
40、reak;在上述方法中,可以找到大部分的峰值点。4.2.3 先寻峰后寻边界(参考多道脉冲分析系统原理Word)在上一节中,说到,先寻找边界根据边界寻找峰值点。但是,在观察程序效果的时候,我发现:1、有些很明显的峰,用上述方法并不能找到;2、离得很近的峰,程序找不到峰值点。与一阶导数寻峰相比,二阶导数有更强的分辨能力。于是,我尝试用二阶导数法寻找峰值点。原理图如下:如图所示,通过寻找二阶导数在一个区间内的极小值点,判断该极值的绝对值|是否大于其标准偏差若干倍, 若是,则断定改点是一个峰值点,将改点的道址保存进存储峰值点的数组中,判定依据如下:其中,K为第m点二阶导数值时在第m道左右各取的数据点数
41、,本文规定为2。2K1为变换窗口。为求二阶导数值公式中的权重因子,根据表格给出。TRH1为自定义的寻峰阈值,本文规定TRH1=4。为m点的标准偏差。为了进一步剔除假峰,在找到的峰位mp左右各取一个相邻的二阶导数值进行如下的判定:如果上式满足时,则认为找到了一个有意义的峰。其中 、 是峰位左、右相邻两道的二阶导数值是其相应的标准偏差。TRH2是预先设定的另一个寻峰阈值,本文规定TRH21.7。找到峰值点之后,同样的,我们要像上一节中提到的那样寻找边界,找到边界,还要对存储边界的数组进行相应的处理。但是,我们注意到,找到的峰值点和边界并没有太大的联系。有些存在边界的峰,并不能找到峰值点。在这里,我
42、在第一次找到边界的时候,并没有对存储边界的数组进行处理,而是根据峰值点,从两边分别找存储边界的数组中,第一个数值不为零的点,作为边界值,将峰值点和边界一一对应上了之后,再将存储边界数组中无关的数据全部置为零。在用两种方法得到的谱中,这种先将峰值点和边界进行绑定,再清理边界数组的方法,明显优于先清理数组,再绑定的方法。在实际操作中,我发现,有时候,寻找到的左右边界,并不是完美的在峰值点两侧,可能的情况会有:1、 峰值点附近只能找到左边界或者右边界2、 找到的左边界或者右边界离峰值点很远,发生明显的错误。于是,在应用中,利用二阶导数找到峰位之后,我尝试只寻找左边界,或只寻找右边界,将其绑定到峰值点
43、上。另一个边界,通过已知边界点和峰值点的道址差计算得到。相当于未知边界是已知边界相对峰值点的镜像。由于由高纯锗探测器得到的谱数据,峰的对称性很好,所以,用这样方法处理高纯锗探测器得到的数据,效果很好。4.3计算面积本文中,面积计算采用线性本底法。计算方法如下:在仅包含一个左右边界的数据区间中,将所有光滑数据相加作为总面积A,计算以左右边界点及左右边界点在横轴上的投影点连接形成的梯形的面积作为本底面积B,然后用A-B,得到净峰面积S。示意图如下所示:净面积S本底面积B 计算峰面积的代码如下所示:for(i = 0;i<8192;i+)area_sum = 0;if(0 < datai
44、.l_bdr)for(j = i;j<8192;j+)if(0 < dataj.r_bdr)for(k = i;k <= j;k+)area_sum += datak.smth;area_bg = (datai.smth+dataj.smth)*(j-i+1)/2.0;for(k = i;k <= j;k+)if(datak.pk_ch > 0)datak.area = area_sum - area_bg;break;break;4.4 SNIP去本底第5章 重要功能实现方法(无参考)5.1新建工程5.1.1 VC6.0新建单文档工程打开VC6.0软件界面,在界
45、面左上角,选择文件à新建,文件类型选择工程àMFC AppWizad(exe),选择单文档应用程序,点击完成。5.1.2 VC2012新建单文档工程打开VS2012软件界面,在界面左上角,选择FILEàNewàProject,在弹出的对话框中,选择InstalledàTemplatesàVisual C+àMFCàMFC Application,在弹出的对话框中选择next,选择Application type为Single document,在同一界面右侧的Project style下,选择MFC standar
46、d,点击右下角的Finish按钮,完成工程创建。5.1.3 VC2012新建Win32工程打开VS2012软件界面,在界面左上角,选择FILEàNewàProject,在弹出的对话框中,选择InstalledàTemplatesàVisual C+àWin32,选择Win32 Project,在弹出的窗口下方点击next,在对话框的Additional options下方,选择Empty project。点击对话框下方的Finish按钮,完成工程创建。创建完成的工程,并没有带程序编辑界面,我们要手动添加一个编辑界面。方法如下:在Solution
47、 explorer中,选中Source Files,鼠标点击右键,在弹出的对话框中,选择AddàNew Item,选择Visual C+àC+ File(.cpp)。修改完毕Name和Location之后,点击对话框下方的Add按钮,完成添加cpp文件。5.1打开文件5.1.1 MFC类库打开文件我们要读取的文件,格式主要有两类:一类是二级制文件,一类是文本文件。本文程序中用到的文件类型为txt文档类型。由于很多原始谱数据都是以二进制文件的形式给出,因此,读取二进制文件也显得非常重要。在此,我也会介绍如何读取二进制文件。、打开文本文件首先给出程序代码:int
48、i = 0;long offset = 0;/存放行偏移CString string;/临时对象,用来存放直接从文件中读取的字符串CString filename;/存储文件名的对象CString fileex;/存储文件名后缀的对象CString filepath;/存储文件路径的对象CStdioFile file;/文件对象CFileDialog fdlg(TRUE,/标志位,标志打开文件"spe",/默认文件后缀名"8H4275",/默认文件名OFN_HIDEREADONLY | /屏蔽只读文件OFN_OVERWRITEPROMPT,/重写提醒对话框"(All Type)(*.*)|*.*|",/定义可打开文件类型NULL);/定义打开文件对话框父窗口if(fdlg.DoModal() = IDOK) /判断是否点击”打开”按钮filename = fdlg.GetFileName();/如果点击,获取文件名fileex = fdlg.GetFileExt();/获取文件名后缀filepath = fdlg.GetPathName();/获取文件路径if(filepath = _T("")/如果路径为空,结束函数return ;if(!file.Op
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度解除互联网平台解除担保合同
- 二零二五年度专业厨师团队合作协议
- 二零二五年度鱼塘承包与渔业绿色生态保护协议
- 二零二五年度瓷砖行业市场推广与广告合作购销协议
- 2025年度自动售货机饮品与零食一体化销售合作合同
- 二零二五年度办公家具定制与空间优化服务合同
- 2025年度科技创新园区委托招商代理合同
- 二零二五年度物业服务合同纠纷预防协议书范本
- 辣椒种植基地土壤改良与2025年度种植技术支持合同
- 二零二五年度大数据中心建设连带担保借款合同
- 产科医疗质量持续改进QCC品管圈PDCA案例合集
- 培训机构与家长协议书协议书
- 个人所得税赡养老人约定分摊协议书(范本)正规范本(通用版)
- 重大事故隐患专项排查检查表
- Horiba 流量计中文说明书
- 基于PLC立体仓库毕业设计外文翻译
- 鉴定前设施设备检查记录表样本
- 物业公司审计报告
- (译林版)六年级英语完形填空100篇(含答案和讲解)
- 大数据分析教学大纲教案
- 呼吸康复呼吸肌训练课件
评论
0/150
提交评论