资源描述
程序设计 课程设计(论文)
设计(论文)题目
谱的显示、谱光滑、定性分析程序
学院名称 核技术与自动化工程学院
专业名称 辐射防护与环境工程
学生姓名 蒋卓辰
学生学号 201106080116
任课教师 马永红
设计(论文)成绩
教务处 制
2015年 1 月 10 日
一、实习目的
学习使用各种编程软件,利用计算机工具开展专业信息处理工作。
使用面向对象编程思想实现谱数据处理功能以及谱显示功能。
二、人员组成及分工
本人题目为:谱的显示、谱光滑、定性分析程序
具体要求:
用算术滑动平均法实现谱光滑
一阶导数法寻峰位
根据能量刻度系数计算峰位的能量,检索元素
三、实习计划
1. 首先进行MFC绘图区域的学习和了解,实现基本绘图功能
2. 建立单文档MFC程序,设计一个合理美观的工作区
3. 实现文件打开读取功能,并能打开不同文件
4. 进行谱数据处理的算法编写
5. 编写成谱图形功能并给出处理结论
四、基本原理
1、重心法
选取加权因子和归一化因子,使光滑后的数据成为原来数据的重心。常见的有5点和7点光滑。
5点法:
7点法:
2、简单比较法(极值定峰法、IF函数找峰法)
a、峰的定义:满足,然后在datai-m至datai+m中找最大值道。
b、常用的:5点、7点极大值法。
c、一般,用R=N0/Nb≥Rc确定峰是否有意义。N0为净峰幅度与基底之和,Nb为基底计数,Rc为设定值。
d、k:找峰阈值,根据高斯统计概率分布,一般k取值:1—1.5。
峰的左右边界道i-L和i+R的确定:
3、线性本底法
计算总面积:
计算本底面积:
计算净峰面积:
五、主要工作介绍
1. 建立单文档类MFC可执行程序
2. 建立绘图区函数,初始化绘图设备
3. 添加文件打开虚函数
4. 尝试读取mca文件
六、流程及程序
1、模块介绍
(1)主程序的流程
开始
BGI初始化
调用显示未处理前谱线函数及处理谱函数
N
Y
谱文件是否打开?
等待
Switch(按键):各按键作用函数调用
End
2、程序流程
(1)函数及变量定义
#define MAX_ELEMENT_NUM 20
#define ScreenHeight 480
#define ScreenWidth 640
#define LineHeight 370
#define LineWidth 500
#define LineLeftX ((ScreenWidth-LineWidth)/2)
#define LineRightX (LineLeftX+LineWidth)
#define LineTopY 40
#define LineBottomY (LineTopY+LineHeight)
FILE* dataFile;
int gdriver,gmode;
unsigned long dataTable[1024],maxVal;
int DisPos[500];/*实际显示的数据*/
int OriPos[500];/*未处理前的数据*/
int cursorX;
float zoom;
unsigned int cursorChannel;
unsigned char dispLine;
unsigned char energyMarked,elementLoaded,SpectrumLoaded,peakSeeked,cursorPeakseeked;
int smoothLevel = 1,peakSeekLevel = 9;
float a,b;/*能量刻度方程*/
char element[MAX_ELEMENT_NUM][2];
unsigned char numOfElement,cursorElement;
float elementEnergy[MAX_ELEMENT_NUM];
unsigned int peakBound[MAX_ELEMENT_NUM][2];
unsigned long elementArea[MAX_ELEMENT_NUM],elementNetArea[MAX_ELEMENT_NUM];
unsigned int cursorPeakBoundLeft,cursorPeakBoundRight;
unsigned long cursorPeakArea,cursorPeakNetArea;
(2)程序
#define MAX_ELEMENT_NUM 20
#define ScreenHeight 480
#define ScreenWidth 640
#define LineHeight 370
#define LineWidth 500
#define LineLeftX ((ScreenWidth-LineWidth)/2)
#define LineRightX (LineLeftX+LineWidth)
#define LineTopY 40
#define LineBottomY (LineTopY+LineHeight)
FILE* dataFile;
int gdriver,gmode;
unsigned long dataTable[1024],maxVal;
int DisPos[500];/*实际显示的数据*/
int OriPos[500];/*未处理前的数据*/
int cursorX; float zoom;
unsigned int cursorChannel;
unsigned char dispLine;
unsigned char energyMarked,elementLoaded,
SpectrumLoaded,peakSeeked,cursorPeakseeked;
int smoothLevel = 1,peakSeekLevel = 9;
float a,b;/*能量刻度方程*/ char element[MAX_ELEMENT_NUM][2];
unsigned char numOfElement,cursorElement; float elementEnergy[MAX_ELEMENT_NUM];
unsigned int peakBound[MAX_ELEMENT_NUM][2];
unsigned long elementArea[MAX_ELEMENT_NUM],elementNetArea[MAX_ELEMENT_NUM]; unsigned int cursorPeakBoundLeft,cursorPeakBoundRight;
unsigned long cursorPeakArea,cursorPeakNetArea;
w=input('input the width of the filter window:');
for i=1:w k=i-ceil(w/2);
end array_z = zeros(count+2*floor(w/2),1);
for i=1:count+2*floor(w/2) if(i<=floor(w/2)) array_z(i)=array(-i+ceil(w/2));
elseif(i>count+floor(w/2)) array_z(i)=array(-(i-floor(w/2))+2*count+1);
else array_z(i)=array(i-floor(w/2)); end end a1=zeros(1,count);
for j=1:w SMZ(j)=array_z(i+j-1);
end
a1(i)=SMZ*fwk; end
disp('下面开始输入对称零面积法寻峰');
disp('下面开始输入对称零面积法的各参数');
disp('如果是方波的话有 k=1');
K=input('请输入参数 k=?:\n');
H=input('请输入参数半宽度 H=?(正奇数):\n');
m=((2*K+1)*H-1)/2; w=2*m+1; b=input('请输入参数 b=?:\n');
a=2*K*b; %K=4; %H=2*K+1; %w=3*H;
%b=1; %a=2*K*b; m1=floor(w/2);
temporary=zeros((count+2*m1),1);
for i=1:count+2*m1 if(i<=m1);
temporary(i)=a1(ceil(w/2)-i);
elseif(i>(count+m1)) temporary(i)=a1(-(i-m1)+2*count+1);
else temporary(i)=a1(i-m1); end end A=zeros(count,1);
for i=ceil(w/2):count+m1; for j=-(w-1)/2:(w-1)/2;
if abs(j)<=(H-1)/2; T=a;
else T=-b;
end A(i-m1,1)= A(i-m1,1)+T*temporary(i+j);
end end for i=1:count; %数据转制 SSiFENZI(i,1)=A(i,1);
end B=zeros(count,1);
for i=ceil(w/2):count+m1;
for j=-(w-1)/2:(w-1)/2;
if abs(j)<=(H-1)/2;
T=a^2; else T=b^2;
end B(i-m1,1)=B(i-m1,1)+T*temporary(i+j);
end
end for i=1:count;
SSiFENMU(i,1)=B(i,1);
end for i=1:count;
SS(i,1)=SSiFENZI(i,1)/sqrt(SSiFENMU(i,1));
end p=1; q=1; f=30;
for i=1:count;
if SSiFENZI(i)<0;
fpdatablow(p,1)=i;
fpdatablow(p,2)=SSiFENZI(i);
p=p+1;
elseif SS(i)>f;
fpdataup(q,1)=i;
fpdataup(q,2)=SSiFENZI(i);
q=q+1; end end p=1; for i=2:length(fpdataup(:,1))-1;
if fpdataup(i,2)>fpdataup(i+1,2)&&fpdataup(i,2)>fpdataup(i-1,2);
mpeak(p,1)=fpdataup(i,1); p=p+1; end end for i=1:length(mpeak(:,1));
j=mpeak(i); t=mpeak(i); peak(i)=t+(a1(t+1)-a1(t-1))/(2*a1(t)-a1(t+1)-a1(t-1))/2;
disp('计算峰面积;下面采用总峰面积法');
y1=zeros(1,length(mpeak));
for i=1:length(mpeak)
for j=(zuobianjic(i)+1):(youbianjic(i)-1)
y1(i)=y1(i)+a1(j);
end
s(i)=y1(i)-(youbianjie(i)-1)*(a1(zuobianjie(i)))/2;
end
end
end
disp(‘各个峰面积:’);
sprintf('%d',s)
七、体会
在本次程序设计实习中,我再次学习了MFC编程方法。过程中,我遇到了许多曾经都没有遇到的问题,比如文件的打开和读取,无法绘图等。
在与同学讨论后一步一步解决这些问题的同时,渐渐进一步的熟悉掌握了谱数据处理的方法和编程思想。
对于本专业同学们而言,这次实习是扩展我专业同学技能的大好机会,通过本次程序设计,可以加强对核数据处理方法的理解,并且锻炼了处理的能力。
在编写的过程中要有良好的格式及注释习惯,以免一段时间甚至几分钟后就看不懂自己的思路。
最后,衷心感谢在本次程序设计实习过程中,马永红老师细心的指导,您不厌其烦地解答我的各种疑问,并且帮助我寻找原始数据的数据格式和数据类型。我还要感谢芦瑞琪、袁子程同学对我在思路上的重要启发,谢谢你们给予我的大力支持!
学生学习心得
由于之前对编程并不是很了解,导致本次程序设计遇到了很多问题自己都无法解决,在这个过程中,通过不断地询问老师以及和同学讨论,最后逐渐的解决了一些问题,这对我来说是一个很大的启发,在遇到自己不会的东西的时候,要善于请教老师和同学,以及在网上查资料,这对于以后解决实际问题很有帮助。
学生(签名):蒋卓辰
2015年 1月10 日
诚信承诺
本人郑重声明所呈交的课程报告是本人在指导教师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注的地方外,论文中不包含其他人已经发表或撰写过的研究成果。与我一同工作的同学对本文研究所做的贡献均已在报告中作了明确的说明并表示谢意。
学生(签名):蒋卓辰
任课
教师
评语
成绩评定:
任课教师(签名):
年 月 日
展开阅读全文