rtphone/src/libs/libg729/taming.c

140 lines
3.5 KiB
C

/*
ITU-T G.729A Speech Coder ANSI-C Source Code
Version 1.1 Last modified: September 1996
Copyright (c) 1996,
AT&T, France Telecom, NTT, Universite de Sherbrooke
All rights reserved.
*/
/**************************************************************************
* Taming functions. *
**************************************************************************/
#include "typedef.h"
#include "basic_op.h"
#include "oper_32b.h"
#include "ld8a.h"
#include "tab_ld8a.h"
#include "taming.h"
void
Init_exc_err (CodState *coder)
{
Word16 i;
for (i = 0; i < 4; i++)
coder->L_exc_err[i] = 0x00004000L; /* Q14 */
}
/**************************************************************************
* routine test_err - computes the accumulated potential error in the *
* adaptive codebook contribution *
**************************************************************************/
Word16
test_err (/* (o) flag set to 1 if taming is necessary */
CodState *coder,
Word16 T0, /* (i) integer part of pitch delay */
Word16 T0_frac /* (i) fractional part of pitch delay */
)
{
Word16 i, t1, zone1, zone2, flag;
Word32 L_maxloc, L_acc;
if (T0_frac > 0) {
t1 = add (T0, 1);
}
else {
t1 = T0;
}
i = sub (t1, (L_SUBFR + L_INTER10));
if (i < 0) {
i = 0;
}
zone1 = tab_zone[i];
i = add (t1, (L_INTER10 - 2));
zone2 = tab_zone[i];
L_maxloc = -1L;
flag = 0;
for (i = zone2; i >= zone1; i--) {
L_acc = L_sub (coder->L_exc_err[i], L_maxloc);
if (L_acc > 0L) {
L_maxloc = coder->L_exc_err[i];
}
}
L_acc = L_sub (L_maxloc, L_THRESH_ERR);
if (L_acc > 0L) {
flag = 1;
}
return (flag);
}
/**************************************************************************
*routine update_exc_err - maintains the memory used to compute the error *
* function due to an adaptive codebook mismatch between encoder and *
* decoder *
**************************************************************************/
void
update_exc_err (CodState *coder,
Word16 gain_pit, /* (i) pitch gain */
Word16 T0 /* (i) integer part of pitch delay */
)
{
Word16 i, zone1, zone2, n;
Word32 L_worst, L_temp, L_acc;
Word16 hi, lo;
L_worst = -1L;
n = sub (T0, L_SUBFR);
if (n < 0) {
L_Extract (coder->L_exc_err[0], &hi, &lo);
L_temp = Mpy_32_16 (hi, lo, gain_pit);
L_temp = L_shl (L_temp, 1);
L_temp = L_add (0x00004000L, L_temp);
L_acc = L_sub (L_temp, L_worst);
if (L_acc > 0L) {
L_worst = L_temp;
}
L_Extract (L_temp, &hi, &lo);
L_temp = Mpy_32_16 (hi, lo, gain_pit);
L_temp = L_shl (L_temp, 1);
L_temp = L_add (0x00004000L, L_temp);
L_acc = L_sub (L_temp, L_worst);
if (L_acc > 0L) {
L_worst = L_temp;
}
}
else {
zone1 = tab_zone[n];
i = sub (T0, 1);
zone2 = tab_zone[i];
for (i = zone1; i <= zone2; i++) {
L_Extract (coder->L_exc_err[i], &hi, &lo);
L_temp = Mpy_32_16 (hi, lo, gain_pit);
L_temp = L_shl (L_temp, 1);
L_temp = L_add (0x00004000L, L_temp);
L_acc = L_sub (L_temp, L_worst);
if (L_acc > 0L)
L_worst = L_temp;
}
}
for (i = 3; i >= 1; i--) {
coder->L_exc_err[i] = coder->L_exc_err[i - 1];
}
coder->L_exc_err[0] = L_worst;
return;
}