struct fvec *lpc2cep(const struct param *pptr, struct fvec *lpcptr) { /* Convert the LPC params to cepstra */ static struct fvec *outptr = NULL; if(outptr == NULL) { outptr = alloc_fvec(pptr->nout); } lpc_to_cep( pptr, lpcptr, outptr, pptr->nout); return outptr; }
/* * Main standard loop for LPC analysis. */ int cepstral_analysis(sigstream_t *is, spfstream_t *os) { unsigned long l, d, j; float *w = NULL, *r, *lift = NULL; sample_t *buf; spsig_t *s; spf_t *a, *k, *c; float sigma; int status; l = (unsigned long)(fm_l * is->Fs / 1000.0); /* frame length in samples */ d = (unsigned long)(fm_d * is->Fs / 1000.0); /* frame shift in samples */ /* ----- initialize some more stuff ----- */ if ((s = sig_alloc(l)) == NULL) /* frame signal */ return(SPRO_ALLOC_ERR); if (win) { if ((buf = (sample_t *)malloc(l * sizeof(sample_t))) == NULL) /* frame buffer */ return(SPRO_ALLOC_ERR); if ((w = set_sig_win(l, win)) == NULL) { free(buf); sig_free(s); return(SPRO_ALLOC_ERR); } } else buf = s->s; if ((r = (spf_t *)malloc((nlpc + 1) * sizeof(spf_t))) == NULL) { if (win) free(buf); sig_free(s); if (win) free(w); return(SPRO_ALLOC_ERR); } if ((a = (spf_t *)malloc(nlpc * sizeof(spf_t))) == NULL) { if (win) free(buf); sig_free(s); if (win) free(w); free(r); return(SPRO_ALLOC_ERR); } if ((k = (spf_t *)malloc(nlpc * sizeof(spf_t))) == NULL) { if (win) free(buf); sig_free(s); if (win) free(w); free(r); free(a); return(SPRO_ALLOC_ERR); } if ((c = (spf_t *)malloc((numceps + 1) * sizeof(spf_t))) == NULL) { if (win) free(buf); sig_free(s); if (win) free(w); free(r); free(a); free(k); return(SPRO_ALLOC_ERR); } if (lifter) if ((lift = set_lifter(lifter, numceps)) == NULL) { if (win) free(buf); sig_free(s); if (win) free(w); free(r); free(a); free(k); free(c); return(SPRO_ALLOC_ERR); } /* ----- loop on each frame ----- */ while (get_next_sig_frame(is, channel, l, d, emphco, buf)) { /* weight signal */ if (win) sig_weight(s, buf, w); /* run LPC analysis */ if ((status = sig_correl(s, alpha, r, nlpc)) != 0) { if (win) free(buf); sig_free(s); if (win) free(w); free(a); free(k); free(r); free(c); if (lift) free(lift); return(status); } lpc(r, nlpc, a, k, &sigma); lpc_to_cep(a, nlpc, numceps, c); if (lifter) for (j = 0; j < numceps; j++) *(c+j) *= *(lift+j); if (flag & WITHE) { if (sigma < SPRO_ENERGY_FLOOR) sigma = SPRO_ENERGY_FLOOR; *(c+numceps) = (spf_t)(2.0 * log(sigma)); } /* write vector to stream */ if (spf_stream_write(os, c, 1) != 1) { if (win) free(buf); sig_free(s); if (win) free(w); free(a); free(k); free(r); free(c); if (lift) free(lift); return(SPRO_FEATURE_WRITE_ERR); } } /* ----- reset memory ----- */ if (win) { free(buf); free(w); } sig_free(s); free(r); free(a); free(k); free(c); if (lift) free(lift); return(0); }