方格网上观测数据的窗口滑动平均处理.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;ifor(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;lfor(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=0)
{
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;lfor(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=0)
{
sum+=*(*(p+l+1)+m-2);//16
count++;
}
if(l+1=0)
{
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=0)
{
sum+=*(*(p+l+2)+m-2);//21
count++;
}
if(l+2=0)
{
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)学习心得及总结:
上机实习过程中经过老师指导,将主函数中数据的输入改为文件输入和输出,更加符合题意,适用范围更广。
编程要多学习,在遇到困难时回归课本找到解决的办法,多实践就能取得好的成绩。
在此次实习设计中,我又对我的编程知识进一步熟练与提高,这也是我最大的收获吧,我将在以后的学习中继续努力,为我之中的目标而奋斗!