void mdaTalkBox::lpc(float *buf, float *car, VstInt32 n, VstInt32 o) { float z[ORD_MAX], r[ORD_MAX], k[ORD_MAX], G, x; VstInt32 i, j, nn=n; for(j=0; j<=o; j++, nn--) //buf[] is already emphasized and windowed { z[j] = r[j] = 0.0f; for(i=0; i<nn; i++) r[j] += buf[i] * buf[i+j]; //autocorrelation } r[0] *= 1.001f; //stability fix float min = 0.00001f; if(r[0] < min) { for(i=0; i<n; i++) buf[i] = 0.0f; return; } lpc_durbin(r, o, k, &G); //calc reflection coeffs for(i=0; i<=o; i++) { if(k[i] > 0.995f) k[i] = 0.995f; else if(k[i] < -0.995f) k[i] = -.995f; } for(i=0; i<n; i++) { x = G * car[i]; for(j=o; j>0; j--) //lattice filter { x -= k[j] * z[j-1]; z[j] = z[j-1] + k[j] * x; } buf[i] = z[0] = x; //output buf[] will be windowed elsewhere } }
static void lpc(float *buf, float *car, uint32_t n, uint32_t o) { SPFLOAT z[ORD_MAX], r[ORD_MAX], k[ORD_MAX], G, x; uint32_t i, j, nn=n; SPFLOAT min; /* buf[] is already emphasized and windowed */ for(j=0; j<=o; j++, nn--) { z[j] = r[j] = 0.0f; for(i=0; i<nn; i++) r[j] += buf[i] * buf[i+j]; /* autocorrelation */ } r[0] *= 1.001f; /* stability fix */ min = 0.00001f; if(r[0] < min) { for(i=0; i<n; i++) buf[i] = 0.0f; return; } lpc_durbin(r, o, k, &G); /* calc reflection coeffs */ for(i=1; i<=o; i++) { if(k[i] > 0.995f) k[i] = 0.995f; else if(k[i] < -0.995f) k[i] = -.995f; } for(i=0; i<n; i++) { x = G * car[i]; /* lattice filter */ for(j=o; j>0; j--) { x -= k[j] * z[j-1]; z[j] = z[j-1] + k[j] * x; } buf[i] = z[0] = x; /* output buf[] will be windowed elsewhere */ } }