use crate::g729::basic_operations::*;
fn compute_polynomial_coefficients(q_lsp: &[Word16], f: &mut [Word32]) {
f[0] = 16777216;
f[1] = mult16_16(q_lsp[0], -1024);
for i in 2..6 {
f[i] = sshl(
sub32(f[i - 2], mult16_32_p15(q_lsp[2 * i - 2], f[i - 1])),
1,
);
for j in (2..i).rev() {
f[j] = add32(
f[j],
sub32(f[j - 2], mult16_32_p14(q_lsp[2 * i - 2], f[j - 1])),
);
}
f[1] = sub32(f[1], sshl(q_lsp[2 * i - 2] as Word32, 10));
}
}
pub fn q_lsp_2_lp(q_lsp: &[Word16], lp: &mut [Word16]) {
let mut f1 = [0 as Word32; 6];
let mut f2 = [0 as Word32; 6];
compute_polynomial_coefficients(q_lsp, &mut f1);
compute_polynomial_coefficients(&q_lsp[1..], &mut f2);
for i in (1..6).rev() {
f1[i] = add32(f1[i], f1[i - 1]);
f2[i] = sub32(f2[i], f2[i - 1]);
}
for i in 0..5 {
lp[i] = pshr(add32(f1[i + 1], f2[i + 1]), 13) as Word16;
lp[9 - i] = pshr(sub32(f1[i + 1], f2[i + 1]), 13) as Word16;
}
}