next up previous contents
Next: 解析プログラム Up: 設定ファイル Previous: grobal.h

funcdef.h

{

/* フォワードプロパゲーション   関数:foward_propagation() */
void    forward_propagation(){

  int           i,j;
  double        sum;
  
  for( j = 0 ; j < Midunit ; j++ ){
    sum = 0;
    for( i = 0 ; i < Inunit ; i++ ){
      sum += wim[j][i] * inout[i][t];
    }
    midout[j] = fsig( sum + sikiiim[j] );
  }

  for( j = 0 ; j < Outunit ; j++ ){
    sum = 0;
     for( i = 0 ; i < Midunit ; i++ ){
      sum += wmo[j][i] * midout[i];
    }
    outout[j] = fsig( sum + sikiimo[j] );
  }

}

/* 出力の整理をする */
void  output_correct(){

  int  i;

  outout[0] = lenseik( outout[0] ); /* 音の長さを量子化 */
  outout[1] = pitseik( outout[1] ); /* 音の高さを量子化 */

  for( i = 0 ; i < Lunit ; i = i + 2 ){  /* 補助入力層の量子化 */
    outout[Tunit + i] = lenseik( outout[Tunit + i] );
    outout[Tunit + i + 1] = pitseik( outout[Tunit + i + 1] );
  }
  if( Quant != 0 ){  /* 内部記憶層の量子化 */
    for( i = TL ; i < Inunit ; i++ ){
      outout[i] = quantum( outout[i] );
    }
  }

}

/* 次の時間の入力にする */
void  feedback(){

  int  i;
  int  g;

  g = t + 1;
  if( g >= tsmax ) g = 0;

  for( i = 0 ; i < TLC ; i++ ){ /* 入力層へのフィードバック */
    inout[i][g] = outout[i];
  }
  for( i = TLC ; i < TLCN ; i++ ){
    inout[i][g] = outout[i];
  }
  if( Flag_Elman != 0 ){ /* 文脈層のフィードバック */
    for( i = 0 ; i < Midunit ; i++ ){
      inout[TLCN + i][g] = midout[i];
    }
  }
  if( Flag_NNaibu != 0 ){ /* 内部記憶層の内部記憶層のフィードバック */
    for( i = TLCN ; i < Inunit ; i++ ){
      inout[i][g] = inout[i - Nunit][t];
    }
  }

}


/* 量子化を行う */
double quantum( double in ){

  int       i;
  double    q;
  double    hanbetu[Kaisou];
  double    out;

  /* 量子化レベルの作成 */
  for( i = 0 , q = - ( Zoubun / 2 ) ; i < Kaisou ; i++ , q = q + Zoubun ){
    hanbetu[i] = q;
  }
  hanbetu[Kaisou] = 100.0; /* 最大値を決めておく */

  for( i = 0 ; i < Kaisou ; i++ ){ /* 量子化する */
    if( in < hanbetu[i + 1] && in >= hanbetu[i] ){
      out = hanbetu[i] + ( Zoubun / 2 );
    }
  }

  return( out );
}

/* 音の長さの変換式 */
double fl( double x ){
  return( -log( x ) / ( M_LN2 * 5 ) + 1 );
}

/* 音の長さを量子化する関数 */
double  lenseik( double len ){

  if( len <= ( fl(12) - fl(16) ) / 2 + fl(16) ){
    return( fl(16) );
  }else if( len <= ( fl(8) - fl(12) ) / 2 + fl(12) ){
    return( fl(12) );
  }else if( len <= ( fl(6) - fl(8) ) / 2 + fl(8) ){
    return( fl(8) );
  }else  if( len <= ( fl(4) - fl(6) ) / 2 + fl(6) ){
    return( fl(6) );
  }else  if( len <= ( fl(3) - fl(4) ) / 2 + fl(4) ){
    return( fl(4) );
  }else if( len <= ( fl(2) - fl(3) ) / 2 + fl(3) ){
    return( fl(3) );
  }else if( len <= ( fl(1.5) - fl(2) ) / 2 + fl(2) ){
    return( fl(2) );
  }else if( len <= ( 1 - fl(1.5) ) / 2 + fl(1.5) ){
    return( fl(1.5) );
  }else if( len <= 1 ){
    return( 1 );
  }

}

/* 音の高さを量子化する関数 */
double pitseik( double pit ){

  int   p;
  pit *= 40.0;
  p = rd( pit );
  return( ( double ) p / 40 );
}

/* 音の高さの変換式 */
int     rd( double a ){

  char  buf[10],*s;
  int   b;

  sprintf( buf,"%lf",a );

  s = strchr( buf,'.' );
  if( s == NULL ){
    return( ( int ) a );
  }
  s++;
  
  if( *s - '0' < 4 ){
    b = a;
  }else{
    b = a + 1;
  }
  return( b );
}

/* 教師信号をセットする関数 */
void set_teach( char *filename ){

  FILE *fp;
  int i;
  double  teachsignal[Smax];

  if(( fp = fopen( filename , "r" )) == NULL ){
    fprintf( stderr , "Can't Open %s \n" , filename );
    exit(1);
  }

  i = 0; /* ファイルから読み込む */
  while( fscanf( fp ,"%lf %lf" , &teachsignal[i] , &teachsignal[i + 1] ) == 2 ){
    i += 2;
  }

  tsmax = i / 2;
  printf( "tsmax = %d\n" , tsmax );

#ifdef STUDY
  
  for( t = 0 ; t < tsmax ; t++ ){ /* 教師信号をセット */
    for( i = 0 ; i < Tunit ; i++ ){
      inkeep[i][t] = teachsignal[t * Tunit + i];
    }
  }

#endif

  fclose( fp );

}

/* 出力ファイルを宣言する関数 */
void  set_file(){

#ifdef STUDY

  /* 誤差をファイルに書き込む */
  /* 時間による内部記憶部分を記録する */
  sprintf( finaibu , "kekka19/naibu_ver%d.dat",Filenumber );
  fpnaibu = fopen( finaibu ,"w" );
  if( fpnaibu == NULL ){
    fprintf( stderr , "File(naibu) not open!\n" );
    exit(1);
  }

  /* 内部記憶部分をt - t+1 特性で記録する */
  sprintf( finaibu2 , "kekka19/timenaibu_ver%d.dat",Filenumber );
  fpnaibu2 = fopen( finaibu2 ,"w" );
  if( fpnaibu2 == NULL ){
    fprintf( stderr , "File(timenaibu) not open!\n" );
    exit(1);
  }

  /* 想起過程の内部記憶部分を記録する */
  sprintf( firecall , "kekka19/recallnaibu_ver%d.dat",Filenumber );
  fprecall = fopen( firecall ,"w" );
  if( fprecall == NULL ){
    fprintf( stderr , "File(recall) not open!\n" );
    exit(1);
  }

  /* 1周期の内部記憶部分を記録する */
  sprintf( finaibu4 , "kekka19/ciclenaibu_ver%d.dat",Filenumber );
  fpnaibu4 = fopen( finaibu4 ,"w" );
  if( fpnaibu4 == NULL ){
    fprintf( stderr , "File(ciclenaibu) not open!\n" );
    exit(1);
  }

  /* 内部記憶部分の判定結果を記録する */
  sprintf( finaibucheck , "kekka19/serchnaibu_ver%d.dat",Filenumber );
  fpnaibucheck = fopen( finaibucheck ,"w" );
  if( fpnaibucheck == NULL ){
    fprintf( stderr , "File(serchnaibu) not open!\n" );
    exit(1);
  }

  /* 教師信号との誤差を記録する */
  sprintf( fiplot , "kekka19/plot_ver%d.dat",Filenumber );
  fpplot = fopen( fiplot ,"w" );
  if( fpplot == NULL ){
    fprintf( stderr , "File(plot) not open!\n" );
    exit(1);
  }

  /* 誤差伝搬の比率を測定 */
  sprintf( fisumplot,"kekka19/sumplotfile%d.dat",Filenumber );
  fpsumplot = fopen( fisumplot ,"w" );
  if( fpsumplot == NULL ){
    fprintf( stderr, "File not open!\n" );
    exit(1);
  }

  /* 誤差伝搬の比率を測定 */
  sprintf( fidimplot,"kekka19/dimplotfile%d.dat",Filenumber );
  fpdimplot = fopen( fidimplot ,"w" );
  if( fpdimplot == NULL ){
    fprintf( stderr, "File not open!\n" );
    exit(1);
  }

#endif

#ifdef RECALL

  /* 出力曲を保存する */
  sprintf( fisong , "kekka19/song/song_ver%d.dat" ,Filenumber );
  fpsong = fopen( fisong ,"w" );
  if( fpsong == NULL ){
    fprintf( stderr, "File(song) not open!\n" );
    exit(1);
  }

  /* 内部記憶部分を保存する */
  sprintf( finaibu , "kekka19/song/recallnaibu_ver%d.dat" ,Filenumber );
  fpnaibu = fopen( finaibu ,"w" );
  if( fpnaibu == NULL ){
    fprintf( stderr, "File not open!\n" );
    exit(1);
  }

  /* 結合荷重-結合荷重特性を測定する */
  if( Flag_weightplot != 0 ){

    /* 結合荷重を保存する */
    sprintf( fiweight_tm , "kekka19/song/tm_weight_ver%d.dat" ,Filenumber );
    fpweight_tm = fopen( fiweight_tm ,"w" );
    if( fpweight_tm == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight_nm , "kekka19/song/nm_weight_ver%d.dat" ,Filenumber );
    fpweight_nm = fopen( fiweight_nm ,"w" );
    if( fpweight_nm == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight_mt , "kekka19/song/mt_weight_ver%d.dat" ,Filenumber );
    fpweight_mt = fopen( fiweight_mt ,"w" );
    if( fpweight_mt == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight_mn , "kekka19/song/mn_weight_ver%d.dat" ,Filenumber );
    fpweight_mn = fopen( fiweight_mn ,"w" );
    if( fpweight_mn == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }

  }

  /* 出力値 - 結合荷重特性を測定する */
  if( Flag_weightplot02 != 0 ){

    /* 結合荷重を保存する */
    sprintf( fiweight02_tm , "kekka19/song/out_weight_tm_ver%d.dat" ,Filenumber );
    fpweight02_tm = fopen( fiweight02_tm ,"w" );
    if( fpweight02_tm == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight02_nm , "kekka19/song/out_weight_nm_ver%d.dat" ,Filenumber );
    fpweight02_nm = fopen( fiweight02_nm ,"w" );
    if( fpweight02_nm == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight02_mt , "kekka19/song/out_weight_mt_ver%d.dat" ,Filenumber );
    fpweight02_mt = fopen( fiweight02_mt ,"w" );
    if( fpweight02_mt == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }
    sprintf( fiweight02_mn , "kekka19/song/out_weight_mn_ver%d.dat" ,Filenumber );
    fpweight02_mn = fopen( fiweight02_mn ,"w" );
    if( fpweight02_mn == NULL ){
      fprintf( stderr, "File not open!\n" );
      exit(1);
    }

  }
#endif
}



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