/** * @file calc_mix.c * * * @brief 混合ガウス分布の重みつき和の計算:非 tied-mixture 用,キャッシュ無し * * * * @brief Compute weighed sum of Gaussian mixture for non tied-mixture model (no cache) * * * @author Akinobu LEE * @date Thu Feb 17 14:18:52 2005 * * $Revision: 1.6 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include #include #include #include #include /** * @brief Compute the output probability of current state OP_State. * * No codebook-level cache is done. * * @param wrk [i/o] HMM computation work area * * @return the output probability of the state OP_State in log10 */ LOGPROB calc_mix(HMMWork *wrk) { int i; LOGPROB logprob, logprobsum; PROB *w; int *id; int s; PROB stream_weight; /* compute Gaussian set */ logprobsum = 0.0; for(s=0;sOP_nstream;s++) { /* set stream weight */ if (wrk->OP_state->w) stream_weight = wrk->OP_state->w->weight[s]; else stream_weight = 1.0; /* setup storage pointer for this mixture pdf */ wrk->OP_vec = wrk->OP_vec_stream[s]; wrk->OP_veclen = wrk->OP_veclen_stream[s]; /* compute output probabilities */ /* computed Gaussians will be set in: score ... OP_calced_score[0..OP_calced_num] id ... OP_calced_id[0..OP_calced_num] */ (*(wrk->compute_gaussset))(wrk, wrk->OP_state->pdf[s]->b, wrk->OP_state->pdf[s]->mix_num, NULL, 0); /* add weights */ id = wrk->OP_calced_id; w = wrk->OP_state->pdf[s]->bweight; for(i=0;iOP_calced_num;i++) { //printf("s%d-m%d: %f %f\n", s+1, i+1, wrk->OP_calced_score[i], w[id[i]]); wrk->OP_calced_score[i] += w[id[i]]; } /* add log probs */ logprob = addlog_array(wrk->OP_calced_score, wrk->OP_calced_num); /* if outprob of a stream is zero, skip this stream */ if (logprob <= LOG_ZERO) continue; /* sum all the obtained mixture scores */ logprobsum += logprob * stream_weight; } if (logprobsum == 0.0) return(LOG_ZERO); /* no valid stream */ if (logprobsum <= LOG_ZERO) return(LOG_ZERO); /* lowest == LOG_ZERO */ return (logprobsum * INV_LOG_TEN); }