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

📄 ht_project_0.cc

📁 这是处理语音信号的程序
💻 CC
字号:
// file: ht_project_0.cc//// isip include files//#include "hmm_train.h"#include "hmm_train_constants.h"static int_4* trans_states = (int_4*)NULL;static float_4* trans_scores = (float_4*)NULL;static int_4 trans_states_size = 0;// method: project_states_cc//// arguments://  Train_Link_list** token_list: (input) linked list of active tokens//  int_4 frame: (input) current frame//  float_8* feat: (input) input mfcc data//  int_4 sp_phone: (input) index of the sp phone//  Train_Link_list** phtr_list: (input) linked list of active phone-level traces//  int_4* ph_active: (input) list of active phones//  int_4 ph_numact: (input) number of active phones//  int_4 align_mode: (input) state/phone alignment//  Train_Phone** phones: (input) phone models//  int_4*& ngen: (output) number of traces generated//  int_4*& ndel: (output) number of traces deleted//  int_4& napmi: (output) number of active phone-level traces//  float_8*& score: (output) maximum path scores so far at each level//  Train_Link_node** ph_marker: (output) the new phone-level trace marker position//// return: a logical_1 indicating status//// this method loops over all the active states, evaluates them and// projects traces to the transitions with updated scores//logical_1 project_states_cc(Train_Link_list** token_list_a, int_4 frame_a,			    float_8* feat_a, int_4 sp_phone_a,			    Train_Link_list** phtr_list_a, int_4* ph_active_a,			    int_4 ph_numact_a, int_4 align_mode_a,			    Train_Phone** phones_a, int_4*& ngen_a,			    int_4*& ndel_a, int_4& napmi_a,			    float_8*& score_a, Train_Link_node** ph_marker_a) {  // dummy variables  //  Train_Link_list* trlist = (Train_Link_list*)NULL;  Train_Link_node* node = (Train_Link_node*)NULL;  Train_Link_node* nd = (Train_Link_node*)NULL;  Train_Link_node* mark = (Train_Link_node*)NULL;    Train_Trace* tr = (Train_Trace*)NULL;  Train_Trace* new_trace = (Train_Trace*)NULL;  Train_Trace** back = (Train_Trace**)NULL;  Train_Trace** back1 = (Train_Trace**)NULL;  int_4 num = (int_4)0;  int_4 num1 = (int_4)0;    Train_Token* tok = (Train_Token*)NULL;  Train_Model* model = (Train_Model*)NULL;  // state transition parameters  //  int_4 num_trans = (int_4)0;  // position flags and other params  //  logical_1 pos_flag = ISIP_FALSE;  float_8 score = (float_8)0;  int_4 ref = (int_4)0;  int_4 num_ph = (int_4)0;  int_4 num_st = (int_4)0;  int_4 st = (int_4)0;  int_4 phn = (int_4)0;  int_4 ii = (int_4)0;  // the index of the highest mixture for TRAIN  //  int_4 max_mix = (int_4)0;  // memory manager  //  Train_Memory_manager* manager = Train_Link_list::get_manager_cc();  // loop over all the phones  //  for (int_4 pp = 0; pp < ph_numact_a; pp++) {    // set the active phone index and the corresponding trace list index    //    ii = ph_active_a[pp];    phn = ii;    // make sure the tokens exist for this phone    //    if (token_list_a[ii] != (Train_Link_list*)NULL) {          // get the model params for this phone      //      model = phones_a[ii]->get_model_cc();      num_st = model->get_num_states_cc();      num_ph = phones_a[ii]->get_num_phones_cc();            // loop over all the active tokens --- each corresponds to an      // active state for this phone      //      for (Train_Link_node* tok_node = token_list_a[ii]->get_head_cc();	   tok_node != (Train_Link_node*)NULL;	   tok_node = tok_node->get_next_cc()) {		// get the corresponding token	//	tok = (Train_Token*)(tok_node->get_item_cc());		// find the position ahead of which to add projected traces	//	mark = tok->get_marker_cc();		// check if we need to evaluate this state here	//	if (mark != (Train_Link_node*)NULL) {	  	  // evaluate the state	  //	  max_mix = (int_4)0;	  st = tok->get_state_cc();	  score = model->get_output_prob_cc(st, feat_a, frame_a, max_mix);	  tok->set_score_cc(score);	  	  // find the possible transition states from here	  //	  model->get_next_states_cc(st, num_trans, trans_states,				    trans_scores, trans_states_size);	  	  // set the position flag	  //	  pos_flag = ISIP_FALSE;	  	  // get all the traces in this token	  //	  trlist = tok->get_trace_list_cc();	  // get the start position for the new traces	  //	  nd = tok->get_prev_marker_cc();	  	  // loop over all the traces to grow	  //	  while ((nd != (Train_Link_node*)NULL) && (pos_flag == ISIP_FALSE)) {	    	    // check position flag	    //	    if (nd == mark) {	      pos_flag = ISIP_TRUE;	    }	    	    // get the next trace to go to	    //	    node = nd->get_next_cc();	    	    // get the trace in the current node	    //	    tr = (Train_Trace*)(nd->get_item_cc());	    // set the maximum mixture index	    //	    tr->set_max_mixture_cc(max_mix);	    	    // increment its score and frame index	    //	    tr->incr_score_cc(score);	    tr->incr_frame_ind_cc();	    	    /*---	      Need to exercise care here --- if state-level alignment	      is desired, then we need to find the previous	      phone-level trace on its path and set that as active, as	      the immediate back-pointer could be state level. This is	      even more significant (and not handled by the following	      code) if the number of state-level back-pointers is	      larger than 1.	      ---*/	    // get its backpointer and mark it as active for this frame	    //	    back = tr->get_back_ptr_cc();	    num = tr->get_back_size_cc();	    while (back[0]->get_level_cc() == HT_STATE_LEVEL) {	      back = back[0]->get_back_ptr_cc();	      num = back[0]->get_back_size_cc();	    }	    	    for (int_4 i = 0; (i < num) && (back[i] != (Train_Trace*)NULL); i++) {	      if (back[i]->get_active_cc() == ISIP_FALSE) {		back[i]->set_active_cc(ISIP_TRUE);				// if this is a word-level trace also need to activate		// previous phone-level traces		//		if (back[i]->get_level_cc() == HT_WORD_LEVEL) {		  // get its backpointer and mark it as active for		  // this frame		  //		  back1 = back[i]->get_back_ptr_cc();		  if (back1 != (Train_Trace**)NULL) {		    num1 = back[i]->get_back_size_cc();		    for (int_4 j = 0; (j < num1) && (back1[j] != (Train_Trace*)NULL);			 j++) {		      if (back1[j]->get_active_cc() == ISIP_FALSE) {			back1[j]->set_active_cc(ISIP_TRUE);		      }		    } // end for j		  } // end if not null		  		} // end if word level	      } // end if not active	    } // end for i	    	    // if the current phone is sp then the trace index is	    // different	    //	    if (ii == sp_phone_a) {	      phn = back[0]->get_phone_ind_cc();	    }	    	    // loop over all of the possible next states and pass traces	    // to each	    //	    for (int_4 kk = 0; kk < num_trans; kk++) {	      	      // create a new trace with the transitioned state	      //	      new_trace = manager->new_trace_cc();	      new_trace->project_trace_cc(tr, (float_8)trans_scores[kk]);	      new_trace->set_state_ind_cc(trans_states[kk]);	      	      // if this transition is at the end of phone i.e. goes to	      // the exit state pass it to the active traces list	      //	      if (trans_states[kk] == num_st - (int_4)1) {		// copy the backpointer		//		new_trace->set_level_cc(HT_PHONE_LEVEL);		new_trace->set_back_size_cc(HT_PHONE_BACKPTR);		// if state level alignments needed, point to the trace		// creating this new trace		//		if (align_mode_a == HT_STATE_ALIGN) {		  new_trace->add_back_ptr_cc(tr);		}		// point to the back trace of the trace creating this new		// trace		//		else {		  new_trace->set_back_ptr_cc(back);		}				// for end of phone update the phone-level score and		// put this in the active traces list		//		insert_trace_cc(phtr_list_a[phn], new_trace, ph_marker_a[phn],				ref, ngen_a[HT_PHONE_LEVEL], napmi_a,				score_a[HT_PHONE_LEVEL]);				// update the positions in the trace list		//		if (ph_marker_a[phn] == (Train_Link_node*)NULL) {		  ph_marker_a[phn] = phtr_list_a[phn]->get_curr_cc();		}	      } // end if phone-end loop	      	      // otherwise this is a model-internal transition	      //	      else {		// set the state level and backpointer		//		new_trace->set_level_cc(HT_STATE_LEVEL);		new_trace->set_back_size_cc(HT_STATE_BACKPTR);		// if state level alignments needed, point to the trace		// creating this new trace		//		if (align_mode_a == HT_STATE_ALIGN) {		  new_trace->add_back_ptr_cc(tr);		}		// point to the back trace of the trace creating this new		// trace		//		else {		  new_trace->set_back_ptr_cc(back);		}						// put the trace in the appropriate token updating the		// state level max score		//		insert_token_cc(token_list_a[ii], new_trace,				trans_states[kk], ngen_a[HT_STATE_LEVEL],				score_a[HT_STATE_LEVEL]);	      }	    } // end for state transitions loop	    // free memory held in this node	    //	    if (align_mode_a == HT_MODEL_ALIGN) {	      manager->delete_cc(tr);	      trlist->remove_cc(nd);	      ndel_a[HT_STATE_LEVEL]++;	    }	    	    // set new node pointer	    //	    nd = node;	    	  } // end while loop	} // end if token needs to be eval loop	// set the new marker position	//	if (align_mode_a == HT_MODEL_ALIGN) {	  tok->set_marker_cc((Train_Link_node*)NULL);	}	      } // end all tokens loop    } // end if token list is not null  } // end all phones loop  // exit gracefully  //  return ISIP_TRUE;}

⌨️ 快捷键说明

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