方格网上观测数据的窗口滑动平均处理.docx
- 文档编号:10155986
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:15
- 大小:92.56KB
方格网上观测数据的窗口滑动平均处理.docx
《方格网上观测数据的窗口滑动平均处理.docx》由会员分享,可在线阅读,更多相关《方格网上观测数据的窗口滑动平均处理.docx(15页珍藏版)》请在冰点文库上搜索。
方格网上观测数据的窗口滑动平均处理
C语言课程设计报告
方格网上观测数据的窗口滑动平均处理
学院:
工程学院
班级:
054081-25
学号:
20081002841
姓名:
赵明明
指导老师:
王改芳
2010.1.10
C语言程序设计报告
前言/C语言课程设计的目的以及意义
c语言是一种编译型程序设计语言,是需要我们同学动手动脑的一门科学,“无他,但手熟尔”足以说明只要我们勤学苦练,掌握规律,就可以编辑程序得心应手,同样编程学习也是一个“理论→实践→再理论→再实践”的认识过程,编的多也就孰能生巧。
一开始要具有一定的计算机知识,包括编程所需的数学基础知识,具备入门的条件,就可以开始编程实践。
在实践中发现问题时再加强计算机理论知识的学习。
当遇到问题时,要会过头来学习一些计算机理论知识和数学基础理论,很多问题会迎刃而解。
因此我们要在学习编程的过程中不断深入学习数据结构、算法、编译原理、操作系统原理、软件工程等知识,不断实践,努力提高,只要勤学苦练掌握规律,就能找到许多窍门,编起来得心应手。
(一)课程设计报告
(1)程序设计题目:
第24题
方格网上观测数据的窗口滑动平均处理
【要求】
已知m行n列方格网上的观测数据,为了压制其中的高频干扰信号,使个观测点之间的数据平滑过渡,要求编写程序对该方格网上的数据进行窗口滑动平均处理。
所谓窗口滑动平均,就是用9点或25点的窗口在观测区域上移动,每次移动时窗口中心所对应的观测点重新取值为:
窗口内所有观察点数据的平均值。
对于9点圆滑有:
ai,j=(ai-1,j-1+ai-1,j+ai-1,j+1+ai,j-1+ai,j+ai,j+1+ai+1,j-1+ai+1,j+ai+1,j+1)/9
对于25点圆滑的情况可自己列出。
功能:
1、使用文件输入输出,已知数据要事先存在文件中,处理结果要输出到文件中。
2、观测点的行列和列数任意。
3、使用9点还是25点圆滑可选。
4、对于窗口跨越观测区域内外的边缘点,只取其中落在观测区域内的数据参加平均值计算。
提示 :
m行n列方格网数据事先存放在文件中,在处理过程中,可采用二维数组存储,然后根据9点圆滑或者25点圆滑对观测数据进行滑动窗口平均处理,计算结果写入结果文件。
(2)题目分析:
1234567
1234567
1234567
1234567
这个题的意思就是用一个3x3或5x5的方格网将这9个或25个数算出平均数把这个平均数再赋给中间那个格子,例如:
123
123
123
123
用3x3修均就是
234
X34
234
这九个数先求平均数赋给中间那个2的位置
然后方格移向下一个位置:
x是上一次计算的平均数
根据题目要求,由于方格网数据事先存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要求数据的平均值,应提供移动、求窗口中心、求窗口内平均值等操作;题目要求可选9点25点两种窗口,应提供两种程序并供选择。
(3)整体设计与模块划分
系统功能模块图
(4)详细设计
1.主函数
[程序]
voidmain()/***********************主函数***************************/
{
inti,j,n;/*变量n保存选择菜单数字,i和j控制选择数据范围*/
上图框里的数据信息由于我不会使用ntxt文件输入输出,所以先使用直接输入数据
a[M][N]={{10,20,30,40,50},{11,21,31,41,51},{12,22,32,42,52},{13,23,33,43,53},{14,24,34,44,54},{15,25,35,45,55}};
floatprintf("请输入点数(9or25):
");
scanf("%d",&n);
if(n==9)/*选择功能*/
process_9(a);/*输入模块*/
elseif(n==25)
process_25(a);
for(i=0;i for(j=0;j { printf("%f",a[i][j]); if(j/4==1)printf("\n"); } } 主函数流程图: 2.各功能模块设计 (1)求平均值函数 [说明] 宏定义#defineM6 #defineN5 9点和25点的窗口设计分开 【1】对于9点圆滑 [程序] voidprocess_9(float(*p)[5]) { inti,j,l,m,count=0; floatsum=0; for(l=0;l for(m=0;m { sum=sum+(*(*(p+l)+m));//以中心点坐标为标准,算各个点情况,中心点为5。 5_self count++; if(l-1>=0&&m-1>=0) { if(l-1>=0) { sum=sum+*(*(p+l-1)+m);//点2 sum=sum+*(*(p+l-1)+m-1);//1 count++; } count++; } if(l-1>=0&&m+1 { sum=sum+*(*(p+l-1)+m+1);//3 count++; } if(m-1>=0) { sum=sum+*(*(p+l)+m-1);//4 count++; } if(m+1 { sum=sum+*(*(p+l)+m+1);//6 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m-1);//7 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m);//8 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m+1);//9 count++; } *(*(p+l)+m)=sum/count;/*计算平均数*/ count=0; sum=0; } } 输入模块流程图 【2】对于25点圆滑 [程序] voidprocess_25(float(*p)[5]) { inti,j,l,m,count=0; floatsum=0; for(l=0;l for(m=0;m { sum=sum+(*(*(p+l)+m));/*以中心点坐标为标准,算各个点情况,中心点为13*/ count++; if(l-2>=0&&m-2>=0) { sum+=*(*(p+l-2)+m-2);//1 count++; } if(l-2>=0&&m-1>=0) { sum+=*(*(p+l-2)+m-1);//2 count++; } if(l-2>=0) { sum+=*(*(p+l-1)+m);//3 count++; } if(l-2>=0&&m+1 { sum+=*(*(p+l-2)+m+1);//4 count++; } if(l-2>=0&&m+2 { sum+=*(*(p+l-2)+m+2);//5 count++; } if(l-1>=0&&m-2>=0) { sum+=*(*(p+l-1)+m-2);//6 count++; } if(l-1>=0&&m-1>=0) { if(l-1>=0) { sum=sum+*(*(p+l-1)+m);//8 sum=sum+*(*(p+l-1)+m-1);//7 count++; } count++; } if(l-1>=0&&m+1 { sum=sum+*(*(p+l-1)+m+1);//9 count++; } if(l-1>=0&&m+2 { sum+=*(*(p+l-1)+m+2);//10 count++; } if(m-2>=0) { sum+=*(*(p+l)+m-2);//11 count++; } if(m-1>=0) { sum=sum+*(*(p+l)+m-1);//12 count++; } if(m+1 { sum=sum+*(*(p+l)+m+1);//14 count++; } if(m+2 { sum+=*(*(p+l)+m+2);//15 count++; } if(l+1 { sum+=*(*(p+l+1)+m-2);//16 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m-1);//17 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m);//18 count++; } if(l+1 { sum=sum+*(*(p+l+1)+m+1);//19 count++; } if(l+1 { sum+=*(*(p+l+1)+m+2);//20 count++; } if(l+2 { sum+=*(*(p+l+2)+m-2);//21 count++; } if(l+2 { sum+=*(*(p+l+2)+m-1);//22 count++; } if(l+2 { sum+=*(*(p+l+2)+m);//23 count++; } if(l+2 { sum+=*(*(p+l+2)+m+1);//24 count++; } if(l+2 { sum+=*(*(p+l+2)+m+2);//25 count++; } *(*(p+l)+m)=sum/count; count=0; sum=0; } } (5)运行与测试报告 主菜单函数效果如下图所示: 输入数字9,运行结果如下: 经上机运行测试,我将主函数中文件的输入输出重新编写(由于忽略了功能中的文件输入输出的要求),所以在课后我进行了修改,如下: 文件输入fp=fopen(“f1.txt”,”r”);/*打开存放有数据的n.txt文件*/ if(! fp)exit(0); fscanf(fp,”%d”,&n); 文件输出fp=fopen(“f2.txt”,”w”) 再需建立一个n,txt文件夹,里面装有数据。 我对数据边缘的处理修改: 以9点圆滑为例(部分程序), 补充处理边缘数据和行超出数据 for(y=i-1;y<=i+1;y++) { if(y<0||y>=m)/*行超出观测区域*/ continue; for(z=j-1;z<=j+1;z++) {if(z<0||z>=n)/*列超出观测区域*/ continue; sum+=a[y][z];/*sum累计窗口里所有数据的和*/ }} 列超出数据 经修改,此程序的所有功能现均符合要求。 (6)源程序(见附录源程序) (7)学习心得及总结: 上机实习过程中经过老师指导,将主函数中数据的输入改为文件输入和输出,更加符合题意,适用范围更广。 编程要多学习,在遇到困难时回归课本找到解决的办法,多实践就能取得好的成绩。 在此次实习设计中,我又对我的编程知识进一步熟练与提高,这也是我最大的收获吧,我将在以后的学习中继续努力,为我之中的目标而奋斗!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方格 网上 观测 数据 窗口 滑动 平均 处理