123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- ********************************************************************************
- *
- * 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 : a_refl.c
- * Purpose : Convert from direct form coefficients to
- * reflection coefficients
- *
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * MODULE INCLUDE FILE AND VERSION ID
- ********************************************************************************
- */
- #include "a_refl.h"
- const char a_refl_id[] = "@(#)$Id $" a_refl_h;
-
- /*
- ********************************************************************************
- * INCLUDE FILES
- ********************************************************************************
- */
- #include "typedef.h"
- #include "basic_op.h"
- #include "oper_32b.h"
- #include "count.h"
- #include "cnst.h"
- /*
- ********************************************************************************
- * LOCAL VARIABLES AND TABLES
- ********************************************************************************
- */
- /*
- ********************************************************************************
- * PUBLIC PROGRAM CODE
- ********************************************************************************
- */
- /*
- **************************************************************************
- *
- * Function : A_Refl
- *
- **************************************************************************
- */
- void A_Refl(
- Word16 a[], /* i : Directform coefficients */
- Word16 refl[] /* o : Reflection coefficients */
- )
- {
- /* local variables */
- Word16 i,j;
- Word16 aState[M];
- Word16 bState[M];
- Word16 normShift;
- Word16 normProd;
- Word32 L_acc;
- Word16 scale;
- Word32 L_temp;
- Word16 temp;
- Word16 mult_ex;
- /* initialize states */
- for (i = 0; i < M; i++)
- {
- aState[i] = a[i]; move16 ();
- }
-
- /* backward Levinson recursion */
- for (i = M-1; i >= 0; i--)
- {
- if (sub_ex(abs_s_ex(aState[i]), 4096) >= 0)
- {
- goto ExitRefl;
- }
-
- refl[i] = shl_ex(aState[i], 3);
- L_temp = L_mult_ex(refl[i], refl[i]);
- L_acc = L_sub_ex(MAX_32, L_temp);
-
- normShift = norm_l_ex(L_acc);
- scale = sub_ex(15, normShift);
-
- L_acc = L_shl_ex(L_acc, normShift);
- normProd = round_ex(L_acc);
- mult_ex = div_s(16384, normProd);
-
- for (j = 0; j < i; j++)
- {
- L_acc = L_deposit_h_ex(aState[j]);
- L_acc = L_msu_ex(L_acc, refl[i], aState[i-j-1]);
-
- temp = round_ex(L_acc);
- L_temp = L_mult_ex(mult_ex, temp);
- L_temp = L_shr_r_ex(L_temp, scale);
-
- if (L_sub_ex(L_abs_ex(L_temp), 32767) > 0)
- {
- goto ExitRefl;
- }
-
- bState[j] = extract_l_ex(L_temp);
- }
-
- for (j = 0; j < i; j++)
- {
- aState[j] = bState[j]; move16 ();
- }
- }
- return;
- ExitRefl:
- for (i = 0; i < M; i++)
- {
- refl[i] = 0; move16 ();
- }
- }
|