方格网上观测数据的窗口滑动平均处理C语言.docx
- 文档编号:12132686
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:13
- 大小:104.09KB
方格网上观测数据的窗口滑动平均处理C语言.docx
《方格网上观测数据的窗口滑动平均处理C语言.docx》由会员分享,可在线阅读,更多相关《方格网上观测数据的窗口滑动平均处理C语言.docx(13页珍藏版)》请在冰豆网上搜索。
方格网上观测数据的窗口滑动平均处理C语言
方格网上观测数据的窗口滑动平均处理
一.题目要求
已知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点圆滑两种方式,处理的结果要存放在文件中,如果窗口的部分观察数据超过了观察区域,则只取落在区域内的观察点进行计算。
三.总体设计
#include
#include
voiddata(double**a,intx,intm,intn)
{
doublesum=0;
inti,j,y,z,n9=0,n25=0;
for(i=0;i { for(j=0;j { switch(x) { case1: 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]; n9++; } } break; case2: for(y=i-2;y<=i+2;y++) { if(y<0||y>=m) continue; for(z=j-2;z<=j+2;z++) { if(z<0||z>=n) continue; sum+=a[y][z]; n25++; } } break; } if(x==1) a[i][j]=sum/n9; elsea[i][j]=sum/n25; sum=0; } } } intmain() { introw,col,x,i,j; FILE*in,*out; double**p; printf("\n\n\n\n\n\n\n\n"); printf("*********************方格网上观测数据的窗口滑动平均处理******************\n"); printf("**\n"); printf("*请选择使用圆滑方式*\n"); printf("**\n"); printf("*1.9点圆滑方式.*\n"); printf("*2.25点圆滑方式.*\n"); printf("**\n"); printf("*************************************************************************\n"); printf("请选择使用方式1或2: \n"); scanf("%d",&x); printf("请输入行列数(行列数必须相同): \n"); scanf("%d%d",&row,&col); in=fopen("D: \\data.TXT","r"); out=fopen("D: \\newdata.TXT","w"); p=(double**)malloc(sizeof(double)*row); for(i=0;i p[i]=(double*)malloc(sizeof(p)*col); for(i=0;i for(j=0;j fscanf(in,"%lf",&p[i][j]); if((in=fopen("data.TXT","r"))==NULL) {printf("cannotopenfile"); return0; } data(p,x,row,col); for(i=0;i for(j=0;j fprintf(out,"%lf",p[i][j]); for(i=0;i free(p[i]); free(p); fclose(in); fclose(out); } 四.详细设计 1.主函数 程序: intmain() { introw,col,x,i,j; FILE*in,*out/*定义二个文件型指针in和out*/; double**p/*定义双浮点型的指向指针p的指针*/; printf("\n\n\n\n\n\n\n\n"); printf("*********************方格网上观测数据的窗口滑动平均处理******************\n"); printf("**\n"); printf("*请选择使用圆滑方式*\n"); printf("**\n"); printf("*1.9点圆滑方式.*\n"); printf("*2.25点圆滑方式.*\n"); printf("**\n"); printf("*************************************************************************\n"); printf("请选择使用方式1或2: \n"); scanf("%d",&x); printf("请输入行列数(行列数必须相同): \n"); scanf("%d%d",&row,&col); in=fopen("D: \\data.TXT","r"); out=fopen("D: \\newdata.TXT","w"); p=(double**)malloc(sizeof(double)*row); for(i=0;i p[i]=(double*)malloc(sizeof(p)*col); for(i=0;i for(j=0;j fscanf(in,"%lf",&p[i][j]); if((in=fopen("data.TXT","r"))==NULL) {printf("cannotopenfile"); return0; } data(p,x,row,col); for(i=0;i for(j=0;j fprintf(out,"%lf",p[i][j]); for(i=0;i free(p[i]); free(p); fclose(in); fclose(out); } 2.主菜单函数 主页面用如下函数进行处理: printf("\n\n\n\n\n\n\n\n"); printf("*********************方格网上观测数据的窗口滑动平均处理******************\n"); printf("**\n"); printf("*请选择使用圆滑方式*\n"); printf("**\n"); printf("*1.9点圆滑方式.*\n"); printf("*2.25点圆滑方式.*\n"); printf("**\n"); printf("*************************************************************************\n"); printf("请选择使用方式1或2: []\b\b"); start: scanf("%d",&c); 3.其中用到了data(p,x,row,col)子函数,它是处理数据的核心函数, 函数内容如下: #include #include voiddata(double**a,intx,intm,intn)/*自定义函数: 窗口滑动平均*/ { doublesum=0/*sum计数器*/; inti,j,y,z,n9=0,n25=0; for(i=0;i { for(j=0;j { switch(x)/*选择窗口滑动平均的方式*/ { case1: 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累计窗口里所有数据的和*/; n9++/*记住相加数据个数,为后面提供方便*/; } } break; case2/*算法同上*/: for(y=i-2;y<=i+2;y++) { if(y<0||y>=m) continue; for(z=j-2;z<=j+2;z++) { if(z<0||z>=n) continue; sum+=a[y][z]; n25++; } } break; } if(x==1) a[i][j]=sum/n9; elsea[i][j]=sum/n25/*求取窗口内所有观测点的平均值即为窗口中心点的新值并保存至数组a[i][j]中*/; sum=0; } } } n9,n25是两个记录相加次数的变量,最后用于求平均值,continue和break是控制求平均的数据在方格网上。 由于要求事先将数据以文件的形式存放,故我先建了一个data.TXT的文件,数值如下: 由于题意叙述不是很清楚,故不知道是如何平移,思索一番后我决定让系统自动将所有的数据都处理到,故用了两个for循,将数据全部处理了一遍! for(i=0;i { for(j=0;j {…… …… } 另外,超出观测数据的部分用if来控制,使得程序不至于出错,具体程序如下: if(y<0||y>=M) continue;……………… 4.程序末尾对文件的运用 in=fopen("D: \\data.TXT","r")/*以只读的方式打开文本文档*/; out=fopen("D: \\newdata.TXT","w")/*以只写的方式打开文本文档*/; p=(double**)malloc(sizeof(double)*row); for(i=0;i p[i]=(double*)malloc(sizeof(p)*col)/*申请内存*/; for(i=0;i for(j=0;j fscanf(in,"%lf",&p[i][j])/*从指针in所指的文件中提取数据*/; if((in=fopen("data.TXT","r"))==NULL)/*以输出打开方式,在此前的记录被覆盖*/ {printf("cannotopenfile"); return0; } data(p,x,row,col)/*调用自定义窗口滑动平均处理函数*/; for(i=0;i for(j=0;j fprintf(out,"%lf",p[i][j])/*将经过窗口滑动平均处理后的数组数据输出到指针out所指向的文件*/; for(i=0;i free(p[i]); free(p)/*释放空间*/; fclose(in); fclose(out)/*关闭文件*/; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方格 网上 观测 数据 窗口 滑动 平均 处理 语言