{
/* 内部記憶部分の相関をとる */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define MAX 1000 #define Teachsearch 0 int tsmax1,tsmax2; double tmp[MAX],length[MAX],height[MAX]; double naibu[MAX]; char fikizyun[MAX]; FILE *fpkizyun,*fpin,*fpout; void sougosoukan(); int main( int argc , char *argv[] ){ int i,j; char infile[MAX]; if( argc != 2 ){ fprintf( stderr,"usage: soukan infile \n" ); exit(1); } strcpy( infile , argv[1] ); /* 判定するファイルを外部から読み込む */ if(( fpin = fopen( infile,"r" )) == NULL ){ fprintf( stderr,"Can't Open infile1 \n" ); exit(1); } /* 基準となるファイルを読み込む */ sprintf( fikizyun,"Vfiles/saitavfile.dat" ); if(( fpkizyun = fopen( fikizyun,"r" )) == NULL ){ fprintf( stderr,"Can't Open Kizyun \n" ); exit(1); } /* 基準ファイルより配列に入れる */ i = 0; while( fscanf( fpkizyun , "%lf %lf %lf",&tmp[i],&length[i],&height[i] ) == 3 ){ i++; } tsmax1 = i; /* 教師信号の1周期数 */ /* 判定ファイルより配列に入れる */ j = 0; while( fscanf( fpin , "%lf %lf",&naibu[j],&tmp[j] ) == 2 ){ j++; } tsmax2 = j; /* 入力データの1周期数 */ sougosoukan(); /* 相関を求める */ fclose( fpkizyun ); /* ファイルをクローズする */ fclose( fpin ); return 0; } void sougosoukan(){ int i,t,l; int leng; double sumlength,sumheight; double sumnaibu; double sumsougo1,sumsougo2; double clength[MAX],cheight[MAX]; double cnaibu[MAX]; double csougo1[MAX],csougo2[MAX]; double minleng , minheigh , minnaibu; double maxleng , maxheigh , maxnaibu; double dataleng[MAX] , dataheigh[MAX] , datanaibu[MAX]; double gosaleng[MAX] , gosaheigh[MAX]; double sumleng , sumheigh; double maxgosal , maxgosah; char outfile[MAX]; /* 出力ファイルを作る */ sprintf( outfile ,"source.dat" ); fpout = fopen( outfile ,"w" ); if( fpout == NULL ){ fprintf( stderr, "File(output) not open!\n" ); exit(1); } /* 2周期分にしておく */ for( t = 0 ; t < tsmax1 ; t++ ){ length[t + tsmax1] = length[t]; } for( t = 0 ; t < tsmax1 ; t++ ){ height[t + tsmax1] = height[t]; } for( t = 0 ; t < tsmax2 ; t++ ){ naibu[t + tsmax2] = naibu[t]; } /* 音の長さについて相関を求める */ for( l = 0 ; l < tsmax1 ; l++ ){ sumlength = 0; for( i = 0 ; i < tsmax1 ; i++ ){ sumlength += length[i] * length[i + l]; } clength[l] = sumlength / tsmax1; } clength[tsmax1] = clength[0]; /* 音の高さについて相関を求める */ for( l = 0 ; l < tsmax1 ; l++ ){ sumheight = 0; for( i = 0 ; i < tsmax1 ; i++ ){ sumheight += height[i] * height[i + l]; } cheight[l] = sumheight / tsmax1; } cheight[tsmax1] = cheight[0]; /* 内部記憶について相関を求める */ for( l = 0 ; l < tsmax2 ; l++ ){ sumnaibu = 0; for( i = 0 ; i < tsmax2 ; i++ ){ sumnaibu += naibu[i] * naibu[i + l]; } cnaibu[l] = sumnaibu / tsmax2; } cnaibu[tsmax2] = cnaibu[0]; /* 最大値,最小値を求める */ minleng = maxleng = clength[0]; minheigh = maxheigh = cheight[0]; minnaibu = maxnaibu = cnaibu[0]; for( i = 1 ; i < tsmax1 ; i++ ){ if( clength[i] > maxleng ) maxleng = clength[i]; if( clength[i] < minleng ) minleng = clength[i]; if( cheight[i] > maxheigh ) maxheigh = cheight[i]; if( cheight[i] < minheigh ) minheigh = cheight[i]; } for( i = 1 ; i < tsmax2 ; i++ ){ if( cnaibu[i] > maxnaibu ) maxnaibu = cnaibu[i]; if( cnaibu[i] < minnaibu ) minnaibu = cnaibu[i]; } /* 値を規格化する */ for( i = 0 ; i <= tsmax1 ; i++ ){ dataleng[i] = ( clength[i] - minleng ) / ( maxleng - minleng ); dataheigh[i] = ( cheight[i] - minheigh ) / ( maxheigh - minheigh ); } for( i = 0 ; i <= tsmax2 ; i++ ){ datanaibu[i] = ( cnaibu[i] - minnaibu ) / ( maxnaibu - minnaibu ); } /* 内部記憶値の相似性を求める */ for( i = 0 ; i <= tsmax1 ; i++ ){ gosaleng[i] = datanaibu[i] * dataleng[i]; gosaheigh[i] = datanaibu[i] * dataheigh[i]; sumleng += gosaleng[i]; sumheigh += gosaheigh[i]; } maxgosal = gosaleng[0]; maxgosah = gosaheigh[0]; for( i = 1 ; i < tsmax1 ; i++ ){ if( gosaleng[i] > maxgosal ) maxgosal = gosaleng[i]; if( gosaheigh[i] > maxgosah ) maxgosah = gosaheigh[i]; } printf( "leng = %f , heig = %f\n" , ( sumleng / tsmax1 ) , ( sumheigh / tsmax1 ) ); /* 周期の最大値を求めておく */ if( tsmax1 < tsmax2 ){ leng = tsmax2; }else{ leng = tsmax1; } /* 音の長さと内部記憶との相互相関を求める */ for( l = 0 ; l < leng ; l++ ){ sumsougo1 = 0; for( i = 0 ; i < leng ; i++ ){ sumsougo1 += length[i] * naibu[i + l]; } csougo1[l] = sumsougo1 / leng; } csougo1[leng] = csougo1[0]; /* 音の高さと内部記憶との相互相関を求める */ for( l = 0 ; l < leng ; l++ ){ sumsougo2 = 0; for( i = 0 ; i < leng ; i++ ){ sumsougo2 += height[i] * naibu[i + l]; } csougo2[l] = sumsougo2 / leng; } csougo2[leng] = csougo2[0]; /* ファイルに出力する */ for( t = 0 ; t < leng + 1 ; t++ ){ fprintf( fpout , "%d" ,t ); /* fprintf( fpout , " %f",dataleng[t] ); fprintf( fpout , " %f",dataheigh[t] );*/ fprintf( fpout , " %f",datanaibu[t] ); if( Teachsearch != 0 ){ fprintf( fpout , " %f",csougo1[t] ); fprintf( fpout , " %f\n",csougo2[t] ); } fprintf( fpout , "\n" ); } fclose( fpout ); }