/*---------------------------*/ /* プログラム:gccFIGFSR.c */ /*---------------------------*/ #include #include #include #define Nmax 16385 #define MM 30 /*gnuplot用構造体宣言*/ /*scom,sxjiku,syjiku :タイトル(凡例),x軸ラベル,y軸ラベル*/ /*slogx,xmin,xmax,dx,sxfmt :x軸種,x軸最小値,x軸最大値,x軸増分,x軸書式*/ /*slogy,ymin,ymax,dy,syfmt :y軸種,y軸最小値,y軸最大値,y軸増分,y軸書式*/ struct GPdata{ char scom[100];char sxjiku[100];char syjiku[100]; char slogx[3];double xmin;double xmax;double dx;char sxfmt[20]; char slogy[3];double ymin;double ymax;double dy;char syfmt[20]; }; /*関数プロトタイプ*/ void main_part(char fnameR[50]); void GPLOT(char fnameR[50],char fnameW[50],struct GPdata gp, char tit[100],char leg1[20],char leg2[20],double band, int nfp,double pfq[(int)((Nmax-1)/2)],double pfs[(int)((Nmax-1)/2)]); void PEAKF(char fnameR[50],double *band,int *nfp, double wx[(int)((Nmax-1)/2)],double wy[(int)((Nmax-1)/2)]); void SORT(int nd, double xd[(int)((Nmax-1)/2)], double yd[(int)((Nmax-1)/2)]); /*---------------------------------------------------------------------------*/ int main(int argc,char *argv[]) { char fname[50]=""; /*入力ファイル名*/ strcpy(fname,argv[1]); main_part(fname); printf("リターンキーを押してください"); getchar(); return 0; } /*---------------------------------------------------------------------------*/ void main_part(char fname[50]) { char dat[256]="",sv[100]=""; int i,iii,nfile,nfp; double band,pfq[(int)((Nmax-1)/2)],pfs[(int)((Nmax-1)/2)]; char fnin[MM][50] ={"","","","","","","","","","", "","","","","","","","","","", "","","","","","","","","",""}; char fnout[MM][50] ={"","","","","","","","","","", "","","","","","","","","","", "","","","","","","","","",""}; struct GPdata gp={ "","","", "",0.0,0.0,0.0,"", "",0.0,0.0,0.0,"" }; char title[MM][100] ={"","","","","","","","","","", "","","","","","","","","","", "","","","","","","","","",""}; char legend1[MM][20] ={"","","","","","","","","","", "","","","","","","","","","", "","","","","","","","","",""}; char legend2[MM][20] ={"","","","","","","","","","", "","","","","","","","","","", "","","","","","","","","",""}; char tit[100]="",leg1[20]="",leg2[20]=""; char fnameR[50]=""; char fnameW[50]=""; FILE *fin; /*データ入力*/ fin=fopen(fname,"r"); fgets(dat,sizeof dat,fin); fgets(dat,sizeof dat,fin); strcpy(sv,strtok(dat,",")); strncat(gp.sxjiku,sv,strlen(sv)); strcpy(sv,strtok(NULL,",")); strncat(gp.syjiku,sv,strlen(sv)-1); fgets(dat,sizeof dat,fin); strcpy(gp.slogx,strtok(dat,",")); gp.xmin=atof(strtok(NULL,",")); gp.xmax=atof(strtok(NULL,",")); if(strncmp(gp.slogx,"N",1)==0){ gp.dx=atof(strtok(NULL,",")); strcpy(sv,strtok(NULL,",")); strncat(gp.sxfmt,sv,strlen(sv)-1); } fgets(dat,sizeof dat,fin); strcpy(gp.slogy,strtok(dat,",")); gp.ymin=atof(strtok(NULL,",")); gp.ymax=atof(strtok(NULL,",")); if(strncmp(gp.slogy,"N",1)==0){ gp.dy=atof(strtok(NULL,",")); strcpy(sv,strtok(NULL,",")); strncat(gp.syfmt,sv,strlen(sv)-1); } fgets(dat,sizeof dat,fin); nfile=atoi(strtok(dat,","))-1; /*ファイル名読み込み*/ for(iii=0;iii<=nfile;iii++){ fgets(dat,sizeof dat,fin); strcpy(title[iii],strtok(dat,",")); strcpy(legend1[iii],strtok(NULL,",")); strcpy(legend2[iii],strtok(NULL,",")); strcpy(fnin[iii],strtok(NULL,",")); strcpy(sv,strtok(NULL,",")); strncat(fnout[iii],sv,strlen(sv)-1); } fclose(fin); /*プロット*/ for(iii=0;iii<=nfile;iii++){ strcpy(tit,title[iii]); strcpy(leg1,legend1[iii]); strcpy(leg2,legend2[iii]); strcpy(fnameR,fnin[iii]); strcpy(fnameW,fnout[iii]); /*周期ピーク検索*/ PEAKF(fnameR,&band,&nfp,pfq,pfs); /*gnuplot*/ GPLOT(fnameR,fnameW,gp,tit,leg1,leg2,band,nfp,pfq,pfs); } } /*---------------------------------------------------------------------------*/ void GPLOT(char fnameR[50],char fnameW[50],struct GPdata gp, char tit[100],char leg1[20],char leg2[20],double band, int nfp,double pfq[(int)((Nmax-1)/2)],double pfs[(int)((Nmax-1)/2)]) { FILE *fp; int i,j; /****************************/ /*gnuplot制御用ファイル作成*/ /****************************/ fp=fopen("gpl_temp.txt","w"); /*出力ファイル定義*/ fprintf(fp,"set terminal png\n"); fprintf(fp,"set output \"%s\"\n",fnameW); /*データ区切り文字を変更する*/ fprintf(fp,"set datafile separator \",\"\n"); /*グラフタイトル定義*/ fprintf(fp,"set title \"%s\"\n",tit); /*軸ラベル定義*/ fprintf(fp,"set xlabel \"%s\"\n",gp.sxjiku); fprintf(fp,"set ylabel \"%s\"\n",gp.syjiku); fprintf(fp,"set y2label \"%s\"\n","Spectrum ratio"); /*x軸定義*/ if(strncmp(gp.slogx,"L",1)==0)fprintf(fp,"set logscale x\n"); if(strncmp(gp.slogx,"N",1)==0){ fprintf(fp,"set xtics %f\n",gp.dx); fprintf(fp,"set format x %s\n",gp.sxfmt); } /*y軸定義*/ if(strncmp(gp.slogy,"L",1)==0)fprintf(fp,"set logscale y\n"); if(strncmp(gp.slogy,"L",1)==0)fprintf(fp,"set logscale y2\n"); if(strncmp(gp.slogy,"N",1)==0){ fprintf(fp,"set ytics %f\n",gp.dy); fprintf(fp,"set format y %s\n",gp.syfmt); } /*軸範囲定義*/ fprintf(fp,"set xrange [%f:%f]\n",gp.xmin,gp.xmax); fprintf(fp,"set yrange [%f:%f]\n",gp.ymin,gp.ymax); fprintf(fp,"set y2range [%f:%f]\n",gp.ymin,gp.ymax); fprintf(fp,"set y2tics %f\n"); /*ラベル定義*/ fprintf(fp,"set label \"%s\" at graph 0.0,graph 1.025 left\n",fnameR); fprintf(fp,"set label \"Band=%gHz\" at graph 1.0,graph 1.025 right\n",band); /*ピーク振動数ラベル定義*/ j=0; for(i=0;i<=nfp;i++){ if(gp.xminfsr[i+1])){ /*極大値となる番号の検索*/ j=j+1;kfp[j]=i; } } *nfp=j; /*SP比の大きい順の並び替え*/ for(i=0;i<=*nfp;i++){ wx[i]=frq[kfp[i]]; wy[i]=fsr[kfp[i]]; } SORT(*nfp, wx, wy); } /*---------------------------------------------------------------------------*/ void SORT(int nd, double xd[(int)((Nmax-1)/2)], double yd[(int)((Nmax-1)/2)]) { int i,j; double work; /*ydの大きい順でのソート*/ for(i=0;i<=nd-1;i++){ for(j=i+1;j<=nd;j++){ if(yd[i]