方格网上观测数据的窗口滑动平均处理.docx

上传人:b****1 文档编号:10155986 上传时间:2023-05-24 格式:DOCX 页数:15 大小:92.56KB
下载 相关 举报
方格网上观测数据的窗口滑动平均处理.docx_第1页
第1页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第2页
第2页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第3页
第3页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第4页
第4页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第5页
第5页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第6页
第6页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第7页
第7页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第8页
第8页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第9页
第9页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第10页
第10页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第11页
第11页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第12页
第12页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第13页
第13页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第14页
第14页 / 共15页
方格网上观测数据的窗口滑动平均处理.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

方格网上观测数据的窗口滑动平均处理.docx

《方格网上观测数据的窗口滑动平均处理.docx》由会员分享,可在线阅读,更多相关《方格网上观测数据的窗口滑动平均处理.docx(15页珍藏版)》请在冰点文库上搜索。

方格网上观测数据的窗口滑动平均处理.docx

方格网上观测数据的窗口滑动平均处理

 

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=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;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=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)学习心得及总结:

上机实习过程中经过老师指导,将主函数中数据的输入改为文件输入和输出,更加符合题意,适用范围更广。

编程要多学习,在遇到困难时回归课本找到解决的办法,多实践就能取得好的成绩。

在此次实习设计中,我又对我的编程知识进一步熟练与提高,这也是我最大的收获吧,我将在以后的学习中继续努力,为我之中的目标而奋斗!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2