This is lpc.c in view mode; [Download] [Up]
/****************************************************************************** * * * Copyright (C) 1992,1993,1994 Tony Robinson * * * * See the file LICENSE for conditions on distribution and usage * * * ******************************************************************************/ # include <math.h> # include <stdio.h> # include "shorten.h" /* watch out, these are all 0 .. order inclusive arrays */ # define E_BITS_PER_COEF (2 + LPCQUANT) int wav2lpc(buf, nbuf, qlpc, nlpc, presn) long *buf; int nbuf, *qlpc, nlpc, *presn; { int i, j, bestnbit, bestnlpc; float e = 0.0, ci, esize; float acf[MAX_LPC_ORDER]; float ref[MAX_LPC_ORDER]; float lpc[MAX_LPC_ORDER]; float tmp[MAX_LPC_ORDER]; float escale = 0.5 * M_LN2 * M_LN2 / nbuf; if(nlpc >= nbuf) nlpc = nbuf - 1; for(j = 0; j < nbuf; j++) e += (float) buf[j] * (float) buf[j]; if(e == 0.0) *presn = 0; else { acf[0] = e; esize = 0.5 * log(escale * e) / M_LN2; bestnbit = nbuf * esize; *presn = floor(esize + 0.5); } bestnlpc = 0; for(i = 1; i <= nlpc && e > 0.0; i++) { float sum = 0.0; for(j = i; j < nbuf; j++) sum += (float) buf[j] * (float) buf[j - i]; acf[i] = sum; ci = 0.0; for(j = 1; j < i; j++) ci += lpc[j] * acf[i - j]; ref[i] = ci = (acf[i] - ci) / e; lpc[i] = ci; for(j = 1; j < i; j++) tmp[j] = lpc[j] - ci * lpc[i - j]; for(j = 1; j < i; j++) lpc[j] = tmp[j]; e = (1 - ci * ci) * e; if(e > 0.0) esize = 0.5 * log(escale * e) / M_LN2; if(e == 0.0 || nbuf * esize + i * E_BITS_PER_COEF < bestnbit) { /* store best model order */ bestnlpc = i; /* quantise lpc coefficients */ for(j = 0; j < bestnlpc; j++) qlpc[j] = lpc[j + 1] * (1 << LPCQUANT); if(e == 0.0) *presn = 0; else { bestnbit = nbuf * esize + i * E_BITS_PER_COEF; *presn = floor(esize + 0.5); } } } if(*presn < 0) *presn = 0; return(bestnlpc); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.