use crate::silk::macros::*;
const A_FB1_20: i32 = 5394 << 1;
const A_FB1_21: i32 = -24290;
#[inline(always)]
fn all_pass_even(y: i32) -> i32 {
((y as i64 * (65536 + A_FB1_21) as i64) >> 16) as i32
}
#[inline(always)]
fn all_pass_odd(y: i32) -> i32 {
silk_smulwb(y, A_FB1_20)
}
#[inline(always)]
fn band_outputs(out_1: i32, out_2: i32) -> (i16, i16) {
(
silk_sat16(out_2.wrapping_add(out_1).wrapping_add(1024) >> 11) as i16,
silk_sat16(out_2.wrapping_sub(out_1).wrapping_add(1024) >> 11) as i16,
)
}
pub fn silk_ana_filt_bank_1(
input: &[i16],
s: &mut [i32],
out_l: &mut [i16],
out_h: &mut [i16],
n: usize,
) {
if !(2..=4096).contains(&n) || n > input.len() {
return;
}
let n2 = n >> 1;
if n2 > out_l.len() || n2 > out_h.len() {
return;
}
let (pairs, _) = input[..2 * n2].as_chunks::<2>();
let (out_l, out_h) = (&mut out_l[..n2], &mut out_h[..n2]);
let scaled = |pair: &[i16; 2]| [(pair[0] as i32) << 10, (pair[1] as i32) << 10];
let [mut in_even, mut in_odd] = scaled(&pairs[0]);
let mut y_even = in_even.wrapping_sub(s[0]);
let mut y_odd = in_odd.wrapping_sub(s[1]);
for ((next, low), high) in pairs[1..]
.iter()
.zip(out_l.iter_mut())
.zip(out_h.iter_mut())
{
let [next_even, next_odd] = scaled(next);
let x_even = all_pass_even(y_even);
let x_odd = all_pass_odd(y_odd);
let out_1 = in_even.wrapping_sub(y_even).wrapping_add(x_even);
let out_2 = in_odd.wrapping_sub(y_odd).wrapping_add(x_odd);
(*low, *high) = band_outputs(out_1, out_2);
y_even = next_even.wrapping_sub(in_even).wrapping_sub(x_even);
y_odd = next_odd.wrapping_sub(in_odd).wrapping_sub(x_odd);
in_even = next_even;
in_odd = next_odd;
}
let x_even = all_pass_even(y_even);
let x_odd = all_pass_odd(y_odd);
let out_1 = in_even.wrapping_sub(y_even).wrapping_add(x_even);
let out_2 = in_odd.wrapping_sub(y_odd).wrapping_add(x_odd);
(out_l[n2 - 1], out_h[n2 - 1]) = band_outputs(out_1, out_2);
s[0] = in_even.wrapping_add(x_even);
s[1] = in_odd.wrapping_add(x_odd);
}