TAMING.C
资源名称:G711-729.rar [点击查看]
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:4k
源码类别:
语音压缩
开发平台:
C/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"
- static Word32 L_exc_err[4];
- void Init_exc_err(void)
- {
- Word16 i;
- for(i=0; i<4; i++) 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 */
- 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(L_exc_err[i], L_maxloc);
- if(L_acc > 0L) {
- L_maxloc = 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(
- 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(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(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--) {
- L_exc_err[i] = L_exc_err[i-1];
- }
- L_exc_err[0] = L_worst;
- return;
- }