next up previous contents
Next: 結合荷重の状態を二次元画像で出力するプログラム times_weight.c Up: 解析プログラム Previous: 解析プログラム

相関値を求めるプログラム naibusoukan.c

{

/* 内部記憶部分の相関をとる */
#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 );
}



Toshinori DEGUCHI
2003年 4月11日 金曜日 11時42分54秒 JST