use crate::g729::basic_operations::*;
use crate::g729::ld8k::*;
pub fn compute_adaptative_codebook_gain(
target_signal: &[Word16],
filtered_adaptative_codebook_vector: &[Word16],
gain_quantization_xy: &mut Word64,
gain_quantization_yy: &mut Word64,
) -> Word16 {
*gain_quantization_xy = 0;
*gain_quantization_yy = 0;
for i in 0..L_SUBFRAME {
*gain_quantization_xy = mac64(
*gain_quantization_xy,
target_signal[i] as Word32,
filtered_adaptative_codebook_vector[i] as Word32,
);
*gain_quantization_yy = mac64(
*gain_quantization_yy,
filtered_adaptative_codebook_vector[i] as Word32,
filtered_adaptative_codebook_vector[i] as Word32,
);
}
if *gain_quantization_xy <= 0 {
return 0;
}
let mut gain = div64(shl64(*gain_quantization_xy, 14), *gain_quantization_yy);
if gain > ONE_POINT_2_IN_Q14 as Word64 {
gain = ONE_POINT_2_IN_Q14 as Word64;
}
gain as Word16
}