3s地物光谱曲线预处理及波峰与波谷的提取

3s地物光谱曲线预处理及波峰与波谷的提取


2024年4月16日发(作者:尼康d7000新手使用技巧)

#include

int num; //num为数据组数

float TH=0.0002; //波峰波谷的提取阀值

void fread(float *x,float *y,float *z) //读取文件,数据分别存入x,y,z

{

int i,m=0,lev=15; //i,j用于循环,m为文本当前行数,lev为数据起始行数

char k;

fp=fopen("grass_dry+green_","r");

fp1=fopen("原始折射率数据.txt","w+");

FILE *fp,*fp1;

for(i=0;;i++)

{

}

k=fgetc(fp); //每次从文件读取一个字符

if(k==0x0a) //0x0a表示换行

{

m++;

if(m==(lev-1))break; //数据从第15行开始,文件指针移到15行开头

}

for(i=0;;i++)

{

if(feof(fp)) break;

fscanf(fp,"t%ft%ft%f",&x[i],&y[i],&z[i]); //按照格式读取文件,存入指针所指数

printf("%fn",x[i]);

}

}

num=i-1;

for(i=0;i

fprintf(fp1,"%fn",y[i]);

printf("读取完毕,有%d组数据!n",num);

fclose(fp);

fclose(fp1);

void rev5(float *a,float *b,int begin,int over) //尺度为5的均值滤波

{

int i;

if(begin==0)

{

begin=2;

b[0]=a[0];

b[1]=a[1];

}

if(over==(num-1))

{

over=num-3;

b[num-1]=a[num-1];

b[num-2]=a[num-2];

}

for(i=begin;i

{

b[i]=(a[i-2]+a[i-1]+a[i]+a[i+1]+a[i+2])/5;

}

}

void rev3(float *a,float *b,int begin,int over)

{

int i;

if(begin==0)

{

begin=1;

b[0]=a[0];

}

if(over==(num-1))

{

over=num-2;

b[num-1]=a[num-1];

}

for(i=begin;i

{

b[i]=(a[i-1]+a[i]+a[i+1])/3;

//尺度为3的均值滤波

}

}

void rev(float *a,float *b) //针对当前文件的分段滤波,每区段不同尺度,a为输入,b

为输出

{

int i;

float s1[1000],s2[1000],s3[1000],s4[1000],s5[1000],s6[1000],s7[1000],s8[1000]; //将数

据分为八段

rev5(a,s3,208,309); //第三段做两次,尺度为5

for(i=208;i<309;i++)

a[i]=s3[i];

rev5(a,s3,208,307);

rev3(a,s4,310,331); //第四段做一次,尺度为3

rev5(a,s5,332,393); //第五段做一次,尺度为5

rev3(a,s6,394,405); //第六段做一次,尺度为3

rev5(a,s7,406,446); //第七段做一次,尺度为5

rev3(a,s8,447,num-1); //第八段做一次,尺度为3

rev5(a,s1,0,27); //第一段做两次,尺度为5

for(i=0;i<28;i++)

a[i]=s1[i];

rev5(a,s1,0,27);

rev3(a,s2,28,207); //第二段做一次,尺度为3

for(i=0;i<28;i++) b[i]=s1[i]; //结果汇总存入b

for(;i<208;i++) b[i]=s2[i];

for(;i<310;i++) b[i]=s3[i];

}

for(;i<332;i++) b[i]=s4[i];

for(;i<394;i++) b[i]=s5[i];

for(;i<406;i++) b[i]=s6[i];

for(;i<447;i++) b[i]=s7[i];

for(;i

printf("数据处理成功!n");

void main()

{

int i;

FILE *fp1,*fp2;

float r[1000],s[1000],t[1000]; //原始数据:r数组为波长,s数组为折射率,t为误差(忽

略)

float s0[1000]; //滤波结果

float wave[1000][2]; //处理后的综合数据,波长和反射率

fp1=fopen("折射率平滑结果.txt","w+");

fp2=fopen("波峰波谷.TXT","w+");

fread(r,s,t); //读取数据

rev(s,s0); //曲线的光滑

fprintf(fp1,"%stt%sn","波长","折射率");

for(i=0;i

{

wave[i][0]=r[i];

wave[i][1]=s0[i];

fprintf(fp1,"%ft%fn",r[i],s0[i]);

}

/*********************************提取波

***********************************************/

int j=0,k=0;

float px[100][2],py[100][2]; //px为波峰,py为波谷

float p1,p2;

for(i=1;i

{

p1=wave[i][1]-wave[i-1][1];

p2=wave[i][1]-wave[i+1][1];

if(p1>TH && p2>TH) //提取波峰

{

px[j][1]=wave[i][1];

px[j][0]=wave[i][0];

j++;

}

峰波谷

}

}

else if(p1<(-TH) && p2<(-TH)) //提取波谷

{

}

py[k][1]=wave[i][1];

py[k][0]=wave[i][0];

k++;

fprintf(fp2,"%stt%sn","波长","折射率");

printf("%stt%sn","波长","折射率");

printf("波峰:n");

fprintf(fp2,"%sn","波峰:");

for(i=0;i

{

printf("%ft%fn",px[i][0],px[i][1]);

fprintf(fp2,"%ft%fn",px[i][0],px[i][1]);

}

printf("波谷:n");

fprintf(fp2,"%sn","波谷:");

for(i=0;i

{

}

fclose(fp1);

fclose(fp2);

printf("%ft%fn",py[i][0],py[i][1]);

fprintf(fp2,"%ft%fn",py[i][0],py[i][1]);


发布者:admin,转转请注明出处:http://www.yc00.com/num/1713201348a2202900.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信