static void fsg_model_write_fsm_trans(fsg_model_t * fsg, int i, FILE * fp) { fsg_arciter_t *itor; for (itor = fsg_model_arcs(fsg, i); itor; itor = fsg_arciter_next(itor)) { fsg_link_t *tl = fsg_arciter_get(itor); fprintf(fp, "%d %d %s %f\n", tl->from_state, tl->to_state, (tl->wid < 0) ? "<eps>" : fsg_model_word_str(fsg, tl->wid), -logmath_log_to_ln(fsg->lmath, tl->logs2prob / fsg->lw)); } }
gauden_t * gauden_init(const char *meanfile, const char *varfile, float32 varfloor, int32 precompute, logmath_t *logmath) { int32 i, m, f, d, *flen; gauden_t *g; assert(meanfile != NULL); assert(varfile != NULL); assert(varfloor > 0.0); g = (gauden_t *) ckd_calloc(1, sizeof(gauden_t)); g->mean = g->var = NULL; /* To force them to be allocated */ g->logmath = logmath; /* Read means and (diagonal) variances for all mixture gaussians */ gauden_param_read(&(g->mean), &g->n_mgau, &g->n_feat, &g->n_density, &g->featlen, meanfile); gauden_param_read(&(g->var), &m, &f, &d, &flen, varfile); /* Verify mean and variance parameter dimensions */ if ((m != g->n_mgau) || (f != g->n_feat) || (d != g->n_density)) E_FATAL ("Mixture-gaussians dimensions for means and variances differ\n"); for (i = 0; i < g->n_feat; i++) if (g->featlen[i] != flen[i]) E_FATAL("Feature lengths for means and variances differ\n"); ckd_free(flen); /* Floor variances and precompute variance determinants */ if (precompute) gauden_dist_precompute(g, varfloor); /* Floor for density values */ min_density = logmath_log_to_ln(logmath, S3_LOGPROB_ZERO); return g; }
int32 gc_compute_closest_cw(gs_t * gs, float32 * feat) { int32 codeid, bst_codeid; float64 diff1, diff2, tmp1, tmp2, min; int32 cid; float64 min_density; /*E_INFO("Compute the closest Code word\n"); */ min_density = logmath_log_to_ln(gs->logmath, S3_LOGPROB_ZERO); bst_codeid = 0; min = MAX_POS_FLOAT64; for (codeid = 0; codeid < gs->n_code; codeid += 2) { tmp1 = 0; tmp2 = 0; for (cid = 0; cid < gs->n_featlen; cid++) { diff1 = feat[cid] - (gs->codeword[codeid][cid]); tmp1 += diff1 * diff1; diff2 = feat[cid] - (gs->codeword[codeid + 1][cid]); tmp2 += diff2 * diff2; } if (tmp1 < min) { min = tmp1; bst_codeid = codeid; } if (tmp2 < min) { min = tmp2; bst_codeid = codeid + 1; } } return bst_codeid; }