FreeCalypso > hg > gsm-codec-lib
diff libtwamr/hp_max.c @ 379:176a44ff94a1
libtwamr: integrate hp_max.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 06 May 2024 05:10:03 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/hp_max.c Mon May 06 05:10:03 2024 +0000 @@ -0,0 +1,121 @@ +/* +******************************************************************************** +* +* GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 +* R99 Version 3.3.0 +* REL-4 Version 4.1.0 +* +******************************************************************************** +* +* File : hp_max.c +* Purpose : Find the maximum correlation of scal_sig[] in a given +* delay range. +* +******************************************************************************** +*/ + +/* +******************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +******************************************************************************** +*/ +#include "namespace.h" +#include "hp_max.h" + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "no_count.h" +#include "cnst.h" + +/* +******************************************************************************** +* PUBLIC PROGRAM CODE +******************************************************************************** +*/ +Word16 hp_max ( + Word32 corr[], /* i : correlation vector. */ + Word16 scal_sig[], /* i : scaled signal. */ + Word16 L_frame, /* i : length of frame to compute pitch */ + Word16 lag_max, /* i : maximum lag */ + Word16 lag_min, /* i : minimum lag */ + Word16 *cor_hp_max) /* o : max high-pass filtered norm. correlation */ +{ + Word16 i; + Word16 *p, *p1; + Word32 max, t0, t1; + Word16 max16, t016, cor_max; + Word16 shift, shift1, shift2; + + max = MIN_32; move32 (); + t0 = 0L; move32 (); + + for (i = lag_max-1; i > lag_min; i--) + { + /* high-pass filtering */ + t0 = L_sub (L_sub(L_shl(corr[-i], 1), corr[-i-1]), corr[-i+1]); + t0 = L_abs (t0); + + test (); + if (L_sub (t0, max) >= 0) + { + max = t0; move32 (); + } + } + + /* compute energy */ + p = scal_sig; move16 (); + p1 = &scal_sig[0]; move16 (); + t0 = 0L; move32 (); + for (i = 0; i < L_frame; i++, p++, p1++) + { + t0 = L_mac (t0, *p, *p1); + } + + p = scal_sig; move16 (); + p1 = &scal_sig[-1]; move16 (); + t1 = 0L; move32 (); + for (i = 0; i < L_frame; i++, p++, p1++) + { + t1 = L_mac (t1, *p, *p1); + } + + /* high-pass filtering */ + t0 = L_sub(L_shl(t0, 1), L_shl(t1, 1)); + t0 = L_abs (t0); + + /* max/t0 */ + shift1 = sub(norm_l(max), 1); + max16 = extract_h(L_shl(max, shift1)); + shift2 = norm_l(t0); + t016 = extract_h(L_shl(t0, shift2)); + + test (); + if (t016 != 0) + { + cor_max = div_s(max16, t016); + } + else + { + cor_max = 0; move16 (); + } + + shift = sub(shift1, shift2); + + test (); + if (shift >= 0) + { + *cor_hp_max = shr(cor_max, shift); move16 (); /* Q15 */ + } + else + { + *cor_hp_max = shl(cor_max, negate(shift)); move16 (); /* Q15 */ + } + + return 0; +}