|
|
|
@@ -271,62 +271,6 @@ int ff_lpc_calc_coefs(LPCContext *s, |
|
|
|
return opt_order; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Simplified Levinson LPC accepting float samples |
|
|
|
* |
|
|
|
* @param lpc_type LPC method for determining coefficients, |
|
|
|
* see #FFLPCType for details |
|
|
|
*/ |
|
|
|
int ff_lpc_calc_levinson(LPCContext *s, const float *samples, int len, |
|
|
|
double lpc[][MAX_LPC_ORDER], int min_order, |
|
|
|
int max_order, int omethod) |
|
|
|
{ |
|
|
|
double ref[MAX_LPC_ORDER] = { 0 }; |
|
|
|
double autoc[MAX_LPC_ORDER+1]; |
|
|
|
double *w_data = s->windowed_samples; |
|
|
|
int i, n2 = (len >> 1); |
|
|
|
double w, c = 2.0 / (len - 1.0); |
|
|
|
|
|
|
|
av_assert2(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER); |
|
|
|
|
|
|
|
/* reinit LPC context if parameters have changed */ |
|
|
|
if (len > s->blocksize || max_order > s->max_order) { |
|
|
|
ff_lpc_end(s); |
|
|
|
ff_lpc_init(s, len, max_order, FF_LPC_TYPE_LEVINSON); |
|
|
|
} |
|
|
|
|
|
|
|
/* Apply welch window */ |
|
|
|
if (len & 1) { |
|
|
|
for(i=0; i<n2; i++) { |
|
|
|
w = c - i - 1.0; |
|
|
|
w = 1.0 - (w * w); |
|
|
|
w_data[i] = samples[i] * w; |
|
|
|
w_data[len-1-i] = samples[len-1-i] * w; |
|
|
|
} |
|
|
|
} else { |
|
|
|
w_data+=n2; |
|
|
|
samples+=n2; |
|
|
|
for(i=0; i<n2; i++) { |
|
|
|
w = c - n2 + i; |
|
|
|
w = 1.0 - (w * w); |
|
|
|
w_data[-i-1] = samples[-i-1] * w; |
|
|
|
w_data[+i ] = samples[+i ] * w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
s->lpc_compute_autocorr(w_data, len, max_order, autoc); |
|
|
|
|
|
|
|
compute_lpc_coefs(autoc, max_order, &lpc[0][0], max_order, 0, 1); |
|
|
|
|
|
|
|
if(omethod == ORDER_METHOD_EST) { |
|
|
|
for(i=0; i<max_order; i++) |
|
|
|
ref[i] = fabs(lpc[i][i]); |
|
|
|
return estimate_best_order(ref, min_order, max_order); |
|
|
|
} |
|
|
|
|
|
|
|
return max_order; |
|
|
|
} |
|
|
|
|
|
|
|
av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order, |
|
|
|
enum FFLPCType lpc_type) |
|
|
|
{ |
|
|
|
|