{
/* フォワードプロパゲーション 関数: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 }