/* HTS_b2en: calculate frame energy */ static double HTS_b2en(HTS_Vocoder * v, const double *b, const int m, const double a) { int i; double en = 0.0; double *cep; double *ir; if (v->spectrum2en_size < m) { if (v->spectrum2en_buff != NULL) HTS_free(v->spectrum2en_buff); v->spectrum2en_buff = (double *) HTS_calloc((m + 1) + 2 * IRLENG, sizeof(double)); v->spectrum2en_size = m; } cep = v->spectrum2en_buff + m + 1; ir = cep + IRLENG; HTS_b2mc(b, v->spectrum2en_buff, m, a); HTS_freqt(v, v->spectrum2en_buff, m, cep, IRLENG - 1, -a); HTS_c2ir(cep, IRLENG, ir, IRLENG); for (i = 0; i < IRLENG; i++) en += ir[i] * ir[i]; return (en); }
/* HTS_Vocoder_postfilter_mcp: postfilter for MCP */ void HTS_Vocoder_postfilter_mcp(HTS_Vocoder *v, double *mcp, const int m, double alpha, double beta) { double e1, e2; int k; if (beta > 0.0 && m > 1) { if (v->postfilter_size < m) { if (v->postfilter_buff != NULL) HTS_free(v->postfilter_buff); v->postfilter_buff = (double *) HTS_calloc(m + 1, sizeof(double)); v->postfilter_size = m; } HTS_mc2b(mcp, v->postfilter_buff, m, alpha); e1 = HTS_b2en(v, v->postfilter_buff, m, alpha); v->postfilter_buff[1] -= beta * alpha * mcp[2]; for (k = 2; k <= m; k++) v->postfilter_buff[k] *= (1.0 + beta); e2 = HTS_b2en(v, v->postfilter_buff, m, alpha); v->postfilter_buff[0] += log(e1 / e2) / 2; HTS_b2mc(v->postfilter_buff, mcp, m, alpha); } }