这是处理语音信号的程序

源代码在线查看: dec_project_0.cc

软件大小: 1980 K
上传用户: whyzhao
关键词: 语音信号 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				// file: dec_project_0.cc				//				 				// isip include files				//				#include "decoder.h"				#include "decoder_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: none				//  				// return: a logical_1 indicating status				//				// this method projects state level traces within models and activates				// instances wherever necessary				//				logical_1 Decoder::project_states_cc() {								  // dummy variables				  //				  Link_list* toklist = (Link_list*)NULL;								  Trace* mark = (Trace*)NULL;				  Trace* new_trace = (Trace*)NULL;								  History* hist = (History*)NULL;				  History* new_hist = (History*)NULL;								  Instance* inst = (Instance*)NULL;								  Token* tok = (Token*)NULL;				  Model* model = (Model*)NULL;								  Lex_node* lexnode = (Lex_node*)NULL;				  Lex_node* lexnext = (Lex_node*)NULL;				  				  // state transition parameters				  //				  int_4 num_trans = (int_4)0;								  // position flags and other params				  //				  float_4 new_score = (float_4)0;				  float_4 score = (float_4)0;				  int_4 num_st = (int_4)0;				  int_4 st = (int_4)0;								  // index params				  //				  int_4 stn = (int_4)0;				  int_4 phn = (int_4)0;								  // reset state level max score				  //				  max_score_d[DEC_STATE_LEVEL] = DEC_DEFAULT_SCORE;								  // reset the number of active models				  //				  num_active_models_d = (int_4)0;				  				  // set up flag for align mode				  //				  logical_1 flag = ISIP_FALSE;				  if (align_mode_d == DEC_STATE_ALIGN_MODE) {				    flag = ISIP_TRUE;				  }								  // check if the current frame is the same as any of the model-level				  // endpoints (alignments) if segmental-mode is ON				  //				  logical_1 segment = ISIP_FALSE;				  if (segment_mode_d == DEC_MODEL_SEGMENT_MODE) {				    segment = is_curframe_mendpt_cc();				  }				  				  // loop over all instances in the instance list				  //				  for (Link_node* ninst = inst_list_d->get_head_cc();				       ninst != (Link_node*)NULL; ninst = ninst->get_next_cc()) {				    				    // get the instance here and mark active frame				    //				    inst = (Instance*)(ninst->get_item_cc());								    // get the token list				    //				    toklist = inst->get_toklist_cc();				    				    // process only if this is valid				    //				    if (toklist != (Link_list*)NULL) {				      				      // get the lexical node for this instance				      //				      lexnode = inst->get_lex_node_cc();				    				      // loop over all the active tokens --- each corresponds to an				      // active state for this phone				      //				      for (Link_node* tnode = toklist->get_head_cc();					   tnode != (Link_node*)NULL; tnode = tnode->get_next_cc()) {										// get the corresponding token					//					tok = (Token*)(tnode->get_item_cc());										// find the marker trace					//					mark = tok->get_marker_cc();										// check if we need to evaluate this state here					//					if (mark != (Trace*)NULL) {					  					  // perform beam pruning if required					  //					  if (beam_thresh_d[DEC_STATE_LEVEL] > mark->get_score_cc()) {					    					    // update reference counts					    //					    if (align_mode_d == DEC_STATE_ALIGN_MODE) {					      mark->decr_ref_cc();					    }					  } // end if beam pruning is needed					  					  // otherwise propagate this trace					  //					  else {									    // get the model index					    //					    stn = inst->get_phone_ind_cc();					    phn = mark->get_phone_ind_cc();					    					    // get the model params for this model					    //					    model = cd_models_d[phn]->get_model_cc();					    num_st = model->get_num_states_cc();				      					    // evaluate this state --- the Gaussian eval happens only once					    //					    st = tok->get_state_cc();					    score = model->get_output_prob_cc(st, features_d, frame_d);											    // find the possible transition states from here					    //					    model->get_next_states_cc(st, num_trans, trans_states,								      trans_scores, trans_states_size);					    					    // update the score					    //					    mark->incr_score_cc(score);					    					    // get the current path history					    //					    hist = mark->get_hist_cc();					    					    // update history					    //					    if (align_mode_d == DEC_STATE_ALIGN_MODE) {					      hist->incr_score_cc(score);					      hist->incr_frame_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 and					      // the same history					      //					      new_trace = manager_d->new_trace_cc();					      new_trace->project_trace_cc(mark, (float_4)trans_scores[kk]);					      new_trace->set_state_ind_cc(trans_states[kk]);					      					      // update instance score					      //					      new_score = new_trace->get_score_cc();					      inst->compare_score_cc(new_score);					      					      // 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) {										// add new model-level trace only if either						// segmental-mode is not set or it segmental model is						// set the current frame belongs to one of the						// model-level endpoints						//						if ((segment_mode_d != DEC_MODEL_SEGMENT_MODE) ||						    ((segment_mode_d == DEC_MODEL_SEGMENT_MODE)						     && segment)) {						  						  // set the history parameters						  //						  new_trace->set_level_cc(DEC_MODEL_LEVEL);						  new_trace->set_max_hist_cc(DEC_PHONE_BACKPTR);						  						  // if the alignment mode is phone-level or state-level						  //						  if ((align_mode_d == DEC_STATE_ALIGN_MODE) ||						      (align_mode_d == DEC_MODEL_ALIGN_MODE)) {						    						    // create a new history node here						    //						    new_hist = manager_d->new_hist_cc();						    						    // copy the histwords						    //						    void_p* prev_words = hist->get_histwords_cc();						    						    int_4 hist_len = History::get_hist_len_cc();						    void_p* newhist_words = new void_p[hist_len];						    						    for (int_4 i = 0; i						      newhist_words[i] = prev_words[i];						    }						    						    new_hist->init_cc(newhist_words, DEC_MODEL_LEVEL,								      phn, trans_states[kk], frame_d,								      new_score);						    history_list_d->insert_cc(new_hist);						  						    // set the correct history node						    //						    new_trace->set_hist_cc(new_hist);						    new_trace->add_path_cc(hist, new_score);						  }						  						  // add the current phone to the list of active phones						  //						  if (cd_models_d[stn]->get_active_cc() == ISIP_FALSE) {						    cd_models_d[stn]->set_active_cc(ISIP_TRUE);						    active_models_d[num_active_models_d++] = stn;						  }						  						  // for end of phone update the phone-level score and						  // put this in the active traces list						  //						  if (insert_model_cc(model_trlist_d[stn], new_trace)						      == ISIP_TRUE) {		  						    						    // if this is a context dependent mode						    //						    if (context_mode_d != DEC_MONO_PHONE_MODE) {						      						      // if this is a word end						      //						      if (lexnode->get_phone_cc() == LXN_SP_PHONE) {														// add the sp skip transition and create traces							//							project_sp_word_cc(new_trace, lexnode, stn);													      } // end if this is a word-end phone with sp skip						    } // end if context-dependent mode						    						    // otherwise in monophone mode, need to check if						    // next phone could be sp						    //						    else {						      						      // check the next lex nodes for an sp						      //						      lexnext = lexnode->get_node_cc(LXN_SP_PHONE);						      						      // if this exists, create sp skip traces with						      // word-end lex nodes						      //						      if (lexnext != (Lex_node*)NULL) {							project_sp_word_cc(new_trace, lexnext, stn);						      }						    } // end else monophone mode		  						  } // end if the previous phone trace got added						} // end if segmental pruning					      } // end if phone-end loop					      					      // otherwise this is a model-internal transition					      //					      else {												// set the state level and backpointer						//						new_trace->set_level_cc(DEC_STATE_LEVEL);						new_trace->set_max_hist_cc(DEC_STATE_BACKPTR);												// if the alignment mode state-level						//						if (align_mode_d == DEC_STATE_ALIGN_MODE) {						  						  // create a new history node here						  //						  new_hist = manager_d->new_hist_cc();										  // copy the histwords						  //						  void_p* prev_words = hist->get_histwords_cc();										  int_4 hist_len = History::get_hist_len_cc();						  void_p* newhist_words = new void_p[hist_len];										  for (int_4 i = 0; i						    newhist_words[i] = prev_words[i];						  }										  new_hist->init_cc(newhist_words, DEC_STATE_LEVEL,								    phn, trans_states[kk], frame_d,								    new_score);						  history_list_d->insert_cc(new_hist);						  						  // set the correct history node						  //						  new_trace->set_hist_cc(new_hist);						  new_trace->add_path_cc(hist, new_score);						}												// put the trace in the appropriate token updating the						// state level max score						//						if (inst->insert_trace_cc(new_trace, trans_states[kk], flag,									  max_score_d[DEC_STATE_LEVEL]) ==						    ISIP_TRUE) {						  num_traces_gen_d[DEC_STATE_LEVEL]++;						}					      } // end else state level					    } // end for state transitions loop					  } // end else propagate trace					    					  // delete the marker trace					  //					  manager_d->delete_cc(mark);					  num_traces_del_d[DEC_STATE_LEVEL]++;					  					  // reset the marker for this token					  //					  tok->set_marker_cc((Trace*)NULL);					  					} // end if token needs to be eval loop				      } // end all tokens loop				    } // end if token list is not null				  } // end loop over all instances				  				  // exit gracefully				  //				  return ISIP_TRUE;				}							

相关资源