FreeCalypso > hg > gsm-codec-lib
diff libgsmefr/pred_lt6.c @ 53:49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 25 Nov 2022 16:18:21 +0000 |
parents | |
children | db8e0b69a6bb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgsmefr/pred_lt6.c Fri Nov 25 16:18:21 2022 +0000 @@ -0,0 +1,80 @@ +/************************************************************************* + * + * FUNCTION: Pred_lt_6() + * + * PURPOSE: Compute the result of long term prediction with fractional + * interpolation of resolution 1/6. (Interpolated past excitation). + * + * DESCRIPTION: + * The past excitation signal at the given delay is interpolated at + * the given fraction to build the adaptive codebook excitation. + * On return exc[0..L_subfr-1] contains the interpolated signal + * (adaptive codebook excitation). + * + *************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "count.h" + +#define UP_SAMP 6 +#define L_INTERPOL 10 +#define FIR_SIZE (UP_SAMP*L_INTERPOL+1) + +/* 1/6 resolution interpolation filter (-3 dB at 3600 Hz) */ + +static const Word16 inter_6[FIR_SIZE] = +{ + 29443, + 28346, 25207, 20449, 14701, 8693, 3143, + -1352, -4402, -5865, -5850, -4673, -2783, + -672, 1211, 2536, 3130, 2991, 2259, + 1170, 0, -1001, -1652, -1868, -1666, + -1147, -464, 218, 756, 1060, 1099, + 904, 550, 135, -245, -514, -634, + -602, -451, -231, 0, 191, 308, + 340, 296, 198, 78, -36, -120, + -163, -165, -132, -79, -19, 34, + 73, 91, 89, 70, 38, 0 +}; + +void Pred_lt_6 ( + Word16 exc[], /* in/out: excitation buffer */ + Word16 T0, /* input : integer pitch lag */ + Word16 frac, /* input : fraction of lag */ + Word16 L_subfr /* input : subframe size */ +) +{ + Word16 i, j, k; + Word16 *x0, *x1, *x2; + const Word16 *c1, *c2; + Word32 s; + + x0 = &exc[-T0]; move16 (); + + frac = negate (frac); + test (); + if (frac < 0) + { + frac = add (frac, UP_SAMP); + x0--; + } + for (j = 0; j < L_subfr; j++) + { + x1 = x0++; move16 (); + x2 = x0; move16 (); + c1 = &inter_6[frac]; + c2 = &inter_6[sub (UP_SAMP, frac)]; + + s = 0; move32 (); + for (i = 0, k = 0; i < L_INTERPOL; i++, k += UP_SAMP) + { + s = L_mac (s, x1[-i], c1[k]); + s = L_mac (s, x2[i], c2[k]); + } + + exc[j] = round (s); move16 (); + } + + return; +}