⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ts_state_1.cc

📁 这是处理语音信号的程序
💻 CC
字号:
// file: ts_state_1.cc//// system include files//#include <string.h>// isip include files//#include "tie_state.h"#include "tie_state_constants.h"// method: pool_states_cc//// arguments://   FILE* fpm               : (input)  file pointer to model file//   State** states          : (input)  old states//   char_1** mono           : (input)  monophone list//   int_4 num_mono          : (input)  number of monophones//   int_4 num_cd_models     : (output) number of cd_models//   Cd_models** cd_models   : (output) pointers to all Cd_models//   Decision_tree** trees   : (output) pointers to decision trees//   int_4 num_trees         : (output) number of decision_trees//   State** new_states      : (output) new states //   int_4* trans_map        : (input)  map between central phone index and//                                      transition matrix index//   int_4 num_special_st    : (output) sum of states in special models//   int_4 num_special_model : (input)  number of special models//   char_1** special_models : (input) phones name in special models//   int_4 ph_size           : (input) default phone size //   logical_1 mode          : (input) training or testing mode//   int_4 state_num         : (input) number of states in common monophone//// return: a logical_1 showing status//// this method pools states to different decision tree root nodes// according to the model and the states` position in the model//logical_1 pool_states_cc(FILE* fpm_a,  State** states_a, char_1** mono_a,			 int_4 num_mono_a, int_4& num_cd_models_a,			 Cd_model**& cd_models_a, Decision_tree**& trees_a,			 int_4& num_trees_a, State**& new_states_a, 			 int_4* trans_map_a, int_4& num_special_st_a,			 int_4 num_special_model_a, char_1** special_models_a,			 int_4 ph_size_a, logical_1 mode_a,			 int_4 state_num_a) {    // variables to read data  //  char_1* tmp = new char_1[ISIP_MAX_STRING_LENGTH];  char_1* name = new char_1[ISIP_MAX_STRING_LENGTH];  char_1* temp_str = (char_1*)NULL;    int_4 model_index;  int_4 num_states;  int_4 state_ind = (int_4)0;  // tag testing if it's special model  //  logical_1 tag_special_model = ISIP_FALSE;   int_4 trans_index;    int_4 i;  int_4 j;  int_4 k;  char_1* lph ;  char_1* cph ;  char_1* rph ;  int_4 n_lph = 0;  int_4 n_cph = 0;  int_4 n_rph = 0;    // other local variables  //  int_4** special_models_state_index = new int_4*[TS_MAX_NUM_SPEMODEL];  int_4** special_models_cd_st_index = new int_4*[TS_MAX_NUM_SPEMODEL];  for (int_4 i = 0; i < TS_MAX_NUM_SPEMODEL; i++) {    special_models_state_index[i] = new int_4[TS_NUM_STATE_SIZE];    special_models_cd_st_index[i] = new int_4[TS_NUM_STATE_SIZE];  }  int_4 num_special_models_seen = (int_4)0;  int_4* special_model_index = new int_4[20];    // number of root nodes  //  num_trees_a = get_num_trees_cc(num_mono_a, num_special_model_a, state_num_a);    // read data from file  //  while (fscanf(fpm_a, "%s", tmp) != EOF) {    // ignore comment lines    //    if (tmp[0] == (char_1)'#') {            // do nothing      //      fscanf(fpm_a, "%[^\n]", tmp);      fscanf(fpm_a, "%[\n]", tmp);    }        // read the model data    //    else if (strcmp((char*)tmp, (char*)TS_STR_NUM_MODELS) == 0) {            // read the number of models and allocate memory for number of states      //      fscanf(fpm_a, "%s%ld", tmp, &num_cd_models_a);          if (mode_a == TS_TRAIN_MODE) {	// allocate memory for Cd_models	//	cd_models_a = new Cd_model*[num_cd_models_a];	for (j = 0; j < num_cd_models_a; j++) {	  cd_models_a[j] = new Cd_model();	}		//  define variables for building decision trees	//	Dt_node** roots;	Link_node* leaf_node = (Link_node*)NULL;	Link_list* leaf_list = (Link_list*)NULL;	int_4 tree_index ;	// varialbes for root nodes	//  	int_4* root_num_states = new int_4[num_trees_a];	int_4** root_state_index = new int_4*[num_trees_a];		// allocate memory for the trees	//	trees_a = new Decision_tree*[num_trees_a];		for (i=0;i<num_trees_a;i++) {  	  trees_a[i] = new Decision_tree();	}	// allocate memory for root nodes	//	roots = new Dt_node*[num_trees_a];		for (i = 0; i < num_trees_a; i++) {	  roots[i] = new Dt_node();	  root_num_states[i] = (int_4)0; 	  root_state_index[i]= new int_4[TS_MAX_NUM_STATES];	}	// variable for phones in Cd_models	//	char_1** phn = new char_1*[ph_size_a];		for (i = 0; i < num_cd_models_a; i++) {	  	  // read the model index, phone name, number of states	  //	  fscanf(fpm_a, "%s%ld", tmp, &model_index);     // index line 	  fscanf(fpm_a, "%s%s", tmp, name);              // phone name	  fscanf(fpm_a, "%s%ld", tmp, &num_states);      //num_states	  fscanf(fpm_a, "%s%ld", tmp, &trans_index);     // the transition line	  	  cd_models_a[i] ->set_num_states_cc(num_states-2);	    	  // check if the left context exist	  //	  temp_str = (char_1*)strstr((char*)name, "-");	    	  // if not	  //	  if (temp_str == (char_1*)NULL) {	    lph = (char_1*)NULL;	    	    // check if right context exist	    //	    temp_str = (char_1*)strstr((char*)name, "+");	    if (temp_str == (char_1*)NULL) {	      cph = name ;	      rph = (char_1*)NULL;	    }	    else {	      cph = (char_1*)strtok((char*)name, "+");	      rph = (char_1*)strtok((char*)NULL, " ");	    } 	  }	  	  // if left context exist	  //	  else {	    	    // check if right context exist	    //	    temp_str = (char_1*)strstr((char*)name, "+");	    lph = (char_1*)strtok((char*)name, "-");	    	    if (temp_str == (char_1*)NULL) {	      cph = (char_1*)strtok((char*)NULL, " ");	      rph = (char_1*)NULL;	    }	    else {	      cph = (char_1*)strtok((char*)NULL, "+");	      rph = (char_1*)strtok((char*)NULL, " ");	    } 	  }	  	  // get the left context index	  //	  if (lph != (char_1*)NULL) {	    for (j=0; j<num_mono_a; j++) {	      if (strcmp((char*)lph, (char*)mono_a[j])==0) {		n_lph = j;		break;	      }	    }	  }	  else {	    n_lph = TS_EMPTY_PHN;	  }	  	  // get the central phone index	  //	  if (cph != (char_1*)NULL) {	    	    for (j = 0; j < num_mono_a; j++) {  	      if (strcmp((char*)cph, (char*)mono_a[j])==0) {		n_cph = j;		break;	      }	    }	  }	  else {	    n_cph = TS_EMPTY_PHN;	  }	  	  // get the right context index	  //	  if (rph!=(char_1*)NULL) {	    	    for (j = 0; j < num_mono_a; j++) {	    	      if (strcmp((char*)rph, (char*)mono_a[j])==0) {		n_rph = j;		break;	      }	    }	  }	  else {	    n_rph = TS_EMPTY_PHN;	  }	  	  // set phones in Cd_models	  //	  phn[0] = lph;	  phn[1] = cph;	  phn[2] = rph;	  cd_models_a[model_index]->set_phones_cc(phn);	    	  	  // check if it is a special model	  //	  for (k = 0; k < num_special_model_a; k++) {	    if (strcmp((char*)cph, (char*)special_models_a[k]) == 0) {	      tag_special_model = ISIP_TRUE;	      break;	    }	  }	  	  if (tag_special_model == ISIP_TRUE) {	    	    tag_special_model = ISIP_FALSE;	    trans_map_a[n_cph] = trans_index;	    	    // build new state object from old states	    //	    fscanf(fpm_a, "%s", tmp);	    for (j = 0; j < num_states; j++) {	      fscanf(fpm_a, "%ld", &state_ind);	      if ((j > 0) && (j < num_states-1)) {		// save the special model index		//		special_models_state_index[num_special_models_seen][j-1]		  = state_ind;		// set state index in Cd_models		//		cd_models_a[model_index]->		  set_state_ind_cc(num_special_st_a,j);		special_models_cd_st_index[num_special_models_seen][j-1] 		  = num_special_st_a;				num_special_st_a ++;				// loop over all the states of all the previous special		// to determine any shared state		//		for (int_4 k = 0; k < num_special_models_seen; k++) {		  for (int_4 l = 0; l < 			 cd_models_a[special_model_index[num_special_models_seen-1]]->get_num_states_cc();		       l++) {		    if (special_models_state_index[k][l] == state_ind) {		      // set state index in cd_models		      //		      cd_models_a[model_index]->			set_state_ind_cc(special_models_cd_st_index[k][l],j);		    }		 		  }		}		  		// copy to new states		//		new_states_a[num_special_st_a-1] = 		  new State(*states_a[state_ind]);	      }	    }	    	    special_model_index[num_special_models_seen] = model_index;	    num_special_models_seen++;	    fscanf(fpm_a, "%[^\n]", tmp);	    fscanf(fpm_a, "%[\n]", tmp);	  }	  	  // if non-special case 	  //	  else {	    fscanf(fpm_a, "%s", tmp);	    for (j = 0; j < num_states; j++) {	      	      // set the state index	      //	      fscanf(fpm_a, "%ld", &state_ind);	    	      if ((j > 0) && (j < num_states - 1)) {		tree_index = map_tr_index_cc(n_cph, num_special_model_a,j);  				// set the central phone and state position		//		trees_a[tree_index]->set_cph_cc(cph);		trees_a[tree_index]->set_state_pos_cc(j);				// number of states are in the current list		//		k = root_num_states[tree_index];  		root_state_index[tree_index][k] = state_ind;		root_num_states[tree_index] ++;				// set state index in Cd_models		//		cd_models_a[model_index]->set_state_ind_cc(state_ind, j);			      }	    }	    	    // fill in values to the trans_map	    //	    trans_map_a[n_cph] = trans_index;  	  } 	  	}  	// set the leaf_list for the trees	//	for (i = 0; i < num_trees_a; i++) {  	  leaf_node = new Link_node((void_p)roots[i]);	  leaf_list = new Link_list();	  leaf_list->insert_cc(leaf_node);	  trees_a[i]->set_leaf_list_cc(leaf_list);	  trees_a[i]->set_num_leaf_cc((int_4)1);	}  		// set the information to the root node and initialize the trees	//	for (i = 0;i < num_trees_a; i++) {  	  roots[i]->set_states_cc(root_num_states[i], root_state_index[i]);	  trees_a[i]->set_root_cc(roots[i]); 	}		// free the memory	//	delete [] root_num_states;		for (i = 0;i < num_trees_a; i++) {	  delete []  root_state_index[i];	}	delete [] root_state_index ;		delete [] phn;	delete [] roots;      }         // if test mode      //      else {		// get number of states for special phones and trans_map only	//        char_1** phn = new char_1*[ph_size_a];	int_4 spe_model_index = 0;	// allocate memory for Cd_models	//		cd_models_a = new Cd_model*[num_special_model_a];	for (j = 0; j < num_special_model_a;j++) {	  cd_models_a[j] = new Cd_model();	}		// now read the model data	//	for (int_4 i = 0; i < num_cd_models_a; i++) {	  	  // read the model index, phone name, number of states	  //	  fscanf(fpm_a, "%s%ld", tmp, &model_index);     // index line 	  fscanf(fpm_a, "%s%s", tmp, name);              // phone name	  fscanf(fpm_a, "%s%ld", tmp, &num_states);      // num_states	  fscanf(fpm_a, "%s%ld", tmp, &trans_index);  // the transition line	  	  // check if the left context exist	  //	  temp_str = (char_1*)strstr((char*)name, "-");	  	  // if not	  //	  if (temp_str == (char_1*)NULL) {	    lph = (char_1*)NULL;	    	    // check if right context exist	    //	    temp_str = (char_1*)strstr((char*)name, "+");	    if (temp_str == (char_1*)NULL) {	      cph = name ;	      rph = (char_1*)NULL;	    }	    else {	      cph = (char_1*)strtok((char*)name, "+");	      rph = (char_1*)strtok((char*)NULL, " ");	    } 	  }	  	  // if left context exist	  //	  else {	    	    // check if right context exist	    //	    temp_str = (char_1*)strstr((char*)name, "+");	    lph = (char_1*)strtok((char*)name, "-");	    	    if (temp_str == (char_1*)NULL) {	      cph = (char_1*)strtok((char*)NULL, " ");	      rph = (char_1*)NULL;	    }	    else {	      cph = (char_1*)strtok((char*)NULL, "+");	      rph = (char_1*)strtok((char*)NULL, " ");	    } 	  }	  	  // get the control phone index	  //	  if (cph!=(char_1*)NULL) {	    	    for (j = 0;j < num_mono_a; j++) {  	      if (strcmp((char*)cph, (char*)mono_a[j])==0) {		n_cph = j;		break;	      }	    }	  }	  else {	    n_cph = TS_EMPTY_PHN;	  }	  	  // check if it is a special model	  //	  for (k = 0; k < num_special_model_a; k++) {	    if (strcmp((char*)cph, (char*)special_models_a[k]) == 0) {	      tag_special_model = ISIP_TRUE;	      break;	    }	  }	  	  if (tag_special_model == ISIP_TRUE) {	    	    tag_special_model = ISIP_FALSE;	    trans_map_a[n_cph] = trans_index;	    	    // set phones in Cd_models	    //	    phn[0] = lph;	    phn[1] = cph;	    phn[2] = rph;	    cd_models_a[spe_model_index]->set_phones_cc(phn);		    cd_models_a[spe_model_index] ->set_num_states_cc(num_states-2);	    	    // build new states from old states	    //	    fscanf(fpm_a, "%s", tmp);	    for (j = 0; j < num_states; j++) {	      fscanf(fpm_a, "%ld", &state_ind);	      if ((j > 0) && (j < num_states-1)) {		// save the special model index		//		special_models_state_index[num_special_models_seen][j-1]		  = state_ind;				// set state index in Cd_models		//		cd_models_a[spe_model_index]->		  set_state_ind_cc(num_special_st_a,j);		special_models_cd_st_index[num_special_models_seen][j-1] 		  = num_special_st_a;				num_special_st_a ++;				// loop over all the states of all the previous special		// to determine any shared state		//		for (int_4 k = 0; k < num_special_models_seen; k++) {		  		  for (int_4 l = 0; l < 			 cd_models_a[special_model_index[num_special_models_seen-1]]->get_num_states_cc();		       l++) {		    		    if (special_models_state_index[k][l] == state_ind) {		      		      // set state index in cd_models		      //		      cd_models_a[spe_model_index]->			set_state_ind_cc(special_models_cd_st_index[k][l],j);		    }		 		  }		}				// copy to new states		//		new_states_a[num_special_st_a-1] = 		  new State(*states_a[state_ind]);	      }	    }	    	    special_model_index[num_special_models_seen] = spe_model_index;	    num_special_models_seen++;	    spe_model_index++;    	    fscanf(fpm_a, "%[^\n]", tmp);	    fscanf(fpm_a, "%[\n]", tmp);	  }	  	  // if non-special case read only transition matrix indices	  //	  else {	    	    trans_map_a[n_cph] = trans_index;	    fscanf(fpm_a, "%[^\n]", tmp);	    fscanf(fpm_a, "%[\n]", tmp);	    fscanf(fpm_a, "%[^\n]", tmp);	    fscanf(fpm_a, "%[\n]", tmp);	  }	}		num_cd_models_a = spe_model_index;		//release memory	//	delete [] phn;      }       }  }  delete [] name;  delete [] tmp;  for (int_4 i = 0; i < TS_MAX_NUM_SPEMODEL; i++) {    delete [] special_models_state_index[i];    delete [] special_models_cd_st_index[i];  }  delete [] special_models_state_index;  delete [] special_models_cd_st_index;  delete [] special_model_index;    // exit gracefully  //  return ISIP_TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -