/* HTS_PStream_conv_gv: subfunction for mlpg using GV */ static void HTS_PStream_conv_gv(HTS_PStream *pst, const int m) { int t; double ratio; double mean; double vari; HTS_PStream_calc_gv(pst, &mean, &vari); ratio = sqrt(pst->gv_mean[m] / vari); for (t = 0; t < pst->length; t++) pst->gv_buff[t] = ratio * (pst->gv_buff[t] - mean) + mean; }
/* HTS_PStream_calc_derivative: subfunction for mlpg using GV */ static double HTS_PStream_calc_derivative(HTS_PStream * pst, const int m) { int t, i; double mean; double vari; double dv; double h; double gvobj; double hmmobj; const double w = 1.0 / (pst->win_size * pst->length); HTS_PStream_calc_gv(pst, &mean, &vari); gvobj = -0.5 * W2 * vari * pst->gv_vari[m] * (vari - 2.0 * pst->gv_mean[m]); dv = -2.0 * pst->gv_vari[m] * (vari - pst->gv_mean[m]) / pst->length; for (t = 0; t < pst->length; t++) { pst->sm.g[t] = pst->sm.wuw[t][0] * pst->gv_buff[t]; for (i = 1; i < pst->width; i++) { if (t + i < pst->length) pst->sm.g[t] += pst->sm.wuw[t][i] * pst->gv_buff[t + i]; if (t + 1 > i) pst->sm.g[t] += pst->sm.wuw[t - i][i] * pst->gv_buff[t - i]; } } for (t = 0, hmmobj = 0.0; t < pst->length; t++) { hmmobj += W1 * w * pst->gv_buff[t] * (pst->sm.wum[t] - 0.5 * pst->sm.g[t]); h = -W1 * w * pst->sm.wuw[t][1 - 1] - W2 * 2.0 / (pst->length * pst->length) * ((pst->length - 1) * pst->gv_vari[m] * (vari - pst->gv_mean[m]) + 2.0 * pst->gv_vari[m] * (pst->gv_buff[t] - mean) * (pst->gv_buff[t] - mean)); if (pst->gv_switch[t]) pst->sm.g[t] = 1.0 / h * (W1 * w * (-pst->sm.g[t] + pst->sm.wum[t]) + W2 * dv * (pst->gv_buff[t] - mean)); else pst->sm.g[t] = 1.0 / h * (W1 * w * (-pst->sm.g[t] + pst->sm.wum[t])); } return (-(hmmobj + gvobj)); }