static void eval_cb(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) { vqFeature_t *worst, *best, *topn; mfcc_t *mean; mfcc_t *var, *det, *detP, *detE; int32 i, ceplen; best = topn = s->f[feat]; worst = topn + (s->max_topn - 1); mean = s->means[feat][0]; var = s->vars[feat][0]; det = s->dets[feat]; detE = det + s->n_density; ceplen = s->veclen[feat]; for (detP = det; detP < detE; ++detP) { mfcc_t diff, sqdiff, compl; /* diff, diff^2, component likelihood */ mfcc_t d; mfcc_t *obs; vqFeature_t *cur; int32 cw, j; d = *detP; obs = z; cw = detP - det; for (j = 0; (j < ceplen) && (d >= worst->score); ++j) { diff = *obs++ - *mean++; sqdiff = MFCCMUL(diff, diff); compl = MFCCMUL(sqdiff, *var); d = GMMSUB(d, compl); ++var; } if (j < ceplen) { /* terminated early, so not in topn */ mean += (ceplen - j); var += (ceplen - j); continue; } if ((int32)d < worst->score) continue; for (i = 0; i < s->max_topn; i++) { /* already there, so don't need to insert */ if (topn[i].codeword == cw) break; } if (i < s->max_topn) continue; /* already there. Don't insert */ /* remaining code inserts codeword and dist in correct spot */ for (cur = worst - 1; cur >= best && (int32)d >= cur->score; --cur) memcpy(cur + 1, cur, sizeof(vqFeature_t)); ++cur; cur->codeword = cw; cur->score = (int32)d; } }
static void eval_cb_kdtree(s2_semi_mgau_t *s, int32 feat, mfcc_t *z, kd_tree_node_t *node, uint32 maxbbi) { vqFeature_t *worst, *best, *topn; int32 i, ceplen; best = topn = s->f[feat]; worst = topn + (s->max_topn - 1); ceplen = s->veclen[feat]; for (i = 0; i < maxbbi; ++i) { mfcc_t *mean, diff, sqdiff, compl; /* diff, diff^2, component likelihood */ mfcc_t *var, d; mfcc_t *obs; vqFeature_t *cur; int32 cw, j, k; cw = node->bbi[i]; mean = s->means[feat] + cw * ceplen; var = s->vars[feat] + cw * ceplen; d = s->dets[feat][cw]; obs = z; for (j = 0; (j < ceplen) && (d >= worst->score); j++) { diff = *obs++ - *mean++; sqdiff = MFCCMUL(diff, diff); compl = MFCCMUL(sqdiff, *var); d = GMMSUB(d, compl); ++var; } if (j < ceplen) continue; if ((int32)d < worst->score) continue; for (k = 0; k < s->max_topn; k++) { /* already there, so don't need to insert */ if (topn[k].codeword == cw) break; } if (k < s->max_topn) continue; /* already there. Don't insert */ /* remaining code inserts codeword and dist in correct spot */ for (cur = worst - 1; cur >= best && (int32)d >= cur->score; --cur) memcpy(cur + 1, cur, sizeof(vqFeature_t)); ++cur; cur->codeword = cw; cur->score = (int32)d; } }
static void eval_topn(s2_semi_mgau_t *s, int32 feat, mfcc_t *z) { int i, ceplen; vqFeature_t *topn; topn = s->f[feat]; ceplen = s->veclen[feat]; for (i = 0; i < s->max_topn; i++) { mfcc_t *mean, diff, sqdiff, compl; /* diff, diff^2, component likelihood */ vqFeature_t vtmp; mfcc_t *var, d; mfcc_t *obs; int32 cw, j; cw = topn[i].codeword; mean = s->means[feat][0] + cw * ceplen; var = s->vars[feat][0] + cw * ceplen; d = s->dets[feat][cw]; obs = z; for (j = 0; j < ceplen; j++) { diff = *obs++ - *mean++; sqdiff = MFCCMUL(diff, diff); compl = MFCCMUL(sqdiff, *var); d = GMMSUB(d, compl); ++var; } topn[i].score = (int32)d; if (i == 0) continue; vtmp = topn[i]; for (j = i - 1; j >= 0 && (int32)d > topn[j].score; j--) { topn[j + 1] = topn[j]; } topn[j + 1] = vtmp; } }