FreeCalypso > hg > gsm-codec-lib
annotate libgsmefr/d_gains.c @ 522:4d2cccaeb4a7
libtest: implement TW-TS-005 reader function
Spec reference:
https://www.freecalypso.org/specs/tw-ts-005-v010002.txt
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Sep 2024 03:08:47 +0000 |
parents | 9b07190a6d08 |
children |
rev | line source |
---|---|
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /************************************************************************* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * FILE NAME: D_GAINS.C |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * FUNCTIONS DEFINED IN THIS FILE: |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * d_gain_pitch(), d_gain_code() and gmed5() |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * MA prediction is performed on the innovation energy |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * ( in dB/(20*log10(2)) ) with mean removed. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 *************************************************************************/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
13 #include "gsm_efr.h" |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include "typedef.h" |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
15 #include "namespace.h" |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include "basic_op.h" |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include "oper_32b.h" |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
18 #include "no_count.h" |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 #include "sig_proc.h" |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
20 #include "memops.h" |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
21 #include "codec.h" |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #include "gains_tb.h" |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #include "cnst.h" |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
26 #include "dec_state.h" |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include "dtx.h" |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 /************************************************************************* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 * FUNCTION: gmed5 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 * PURPOSE: calculates 5-point median. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 * DESCRIPTION: |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 *************************************************************************/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
39 static Word16 gmed5 ( /* out : index of the median value (0...4) */ |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 Word16 ind[] /* in : Past gain values */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 ) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 Word16 i, j, ix = 0, tmp[5]; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 Word16 max, tmp2[5]; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
46 Copy (ind, tmp2, 5); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 for (i = 0; i < 5; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 max = -8192; move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 for (j = 0; j < 5; j++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
53 if (tmp2[j] >= max) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 max = tmp2[j]; move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 ix = j; move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 tmp2[ix] = -16384; move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 tmp[i] = ix; move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 return (ind[tmp[2]]); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 /************************************************************************* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 * FUNCTION: d_gain_pitch |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 * PURPOSE: decodes the pitch gain using the received index. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 * DESCRIPTION: |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 * In case of no frame erasure, the gain is obtained from the |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 * quantization table at the given index; otherwise, a downscaled |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 * past gain is used. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 *************************************************************************/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 Word16 d_gain_pitch ( /* out : quantized pitch gain */ |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
80 struct EFR_decoder_state *st, |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 Word16 index, /* in : index of quantization */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 Word16 bfi, /* in : bad frame indicator (good = 0) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 Word16 state, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 Word16 prev_bf, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 Word16 rxdtx_ctrl |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 ) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 static const Word16 pdown[7] = |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 32767, 32112, 32112, 26214, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 9830, 6553, 6553 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 }; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 Word16 gain, tmp, i; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 if (bfi == 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
100 gain = shr (qua_gain_pitch[index], 2); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 if (prev_bf != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
104 if (gain > st->prev_gp) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
106 gain = st->prev_gp; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
112 gain = 0; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
114 st->prev_gp = gain; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
120 tmp = gmed5 (st->pbuf); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
122 if (tmp < st->past_gain_pit) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
124 st->past_gain_pit = tmp; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
126 gain = mult (pdown[state], st->past_gain_pit); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
130 gain = 0; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
134 st->past_gain_pit = gain; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 |
188
9b07190a6d08
libgsmefr/d_gains.c: perf opt
Mychaela Falconia <falcon@freecalypso.org>
parents:
61
diff
changeset
|
136 if (st->past_gain_pit > 4096) /* if (past_gain_pit > 1.0) */ |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
138 st->past_gain_pit = 4096; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 for (i = 1; i < 5; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
142 st->pbuf[i - 1] = st->pbuf[i]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
145 st->pbuf[4] = st->past_gain_pit; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 return gain; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 /************************************************************************* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 * FUNCTION: d_gain_code |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 * PURPOSE: decode the fixed codebook gain using the received index. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 * DESCRIPTION: |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 * The received index gives the gain correction factor gamma. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 * The quantized gain is given by g_q = g0 * gamma |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 * where g0 is the predicted gain. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 * To find g0, 4th order MA prediction is applied to the mean-removed |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 * innovation energy in dB. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 * In case of frame erasure, downscaled past gain is used. |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 *************************************************************************/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 /* average innovation energy. */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 /* MEAN_ENER = 36.0/constant, constant = 20*Log10(2) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 #define MEAN_ENER 783741L /* 36/(20*log10(2)) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 void d_gain_code ( |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
171 struct EFR_decoder_state *st, |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 Word16 index, /* input : received quantization index */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 Word16 code[], /* input : innovation codevector */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 Word16 lcode, /* input : codevector length */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 Word16 *gain_code, /* output: decoded innovation gain */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 Word16 bfi, /* input : bad frame indicator */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 Word16 state, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 Word16 prev_bf, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 Word16 rxdtx_ctrl, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 Word16 i_subfr, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 Word16 rx_dtx_state |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 ) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 static const Word16 cdown[7] = |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 32767, 32112, 32112, 32112, |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 32112, 32112, 22937 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 }; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 Word16 i, tmp; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 Word16 gcode0, exp, frac, av_pred_en; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 Word32 ener, ener_code; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 if (((rxdtx_ctrl & RX_UPD_SID_QUANT_MEM) != 0) && (i_subfr == 0)) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
196 st->gcode0_CN = update_gcode0_CN (st->gain_code_old_rx); |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
197 st->gcode0_CN = shl (st->gcode0_CN, 4); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 /* Handle cases of comfort noise fixed codebook gain decoding in |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 which past valid SID frames are repeated */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 if (((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 || ((rxdtx_ctrl & RX_INVALID_SID_FRAME) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 || ((rxdtx_ctrl & RX_LOST_SID_FRAME) != 0)) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 if ((rxdtx_ctrl & RX_NO_TRANSMISSION) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 /* DTX active: no transmission. Interpolate gain values |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 in memory */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 if (i_subfr == 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
214 *gain_code = interpolate_CN_param (st->gain_code_old_CN, |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
215 st->gain_code_new_CN, rx_dtx_state); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
219 *gain_code = st->prev_gc; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 { /* Invalid or lost SID frame: |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 use gain values from last good SID frame */ |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
225 st->gain_code_old_CN = st->gain_code_new_CN; |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
226 *gain_code = st->gain_code_new_CN; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 /* reset table of past quantized energies */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 for (i = 0; i < 4; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
231 st->past_qua_en[i] = -2381; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 if ((rxdtx_ctrl & RX_DTX_MUTING) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 /* attenuate the gain value by 0.75 dB in each subframe */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 /* (total of 3 dB per frame) */ |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
239 st->gain_code_muting_CN = mult (st->gain_code_muting_CN, 30057); |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
240 *gain_code = st->gain_code_muting_CN; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 /* Prepare for DTX muting by storing last good gain value */ |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
245 st->gain_code_muting_CN = st->gain_code_new_CN; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
248 st->past_gain_code = *gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 for (i = 1; i < 5; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
252 st->gbuf[i - 1] = st->gbuf[i]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
255 st->gbuf[4] = st->past_gain_code; |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
256 st->prev_gc = st->past_gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 return; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 /*----------------- Test erasure ---------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 if (bfi != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
265 tmp = gmed5 (st->gbuf); |
188
9b07190a6d08
libgsmefr/d_gains.c: perf opt
Mychaela Falconia <falcon@freecalypso.org>
parents:
61
diff
changeset
|
266 if (tmp < st->past_gain_code) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
268 st->past_gain_code = tmp; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
270 st->past_gain_code = mult (st->past_gain_code, cdown[state]); |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
271 *gain_code = st->past_gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
273 av_pred_en = 0; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
274 for (i = 0; i < 4; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
275 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
276 av_pred_en = add (av_pred_en, st->past_qua_en[i]); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
277 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
278 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
279 /* av_pred_en = 0.25*av_pred_en - 4/(20Log10(2)) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
280 av_pred_en = mult (av_pred_en, 8192); /* *= 0.25 */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
281 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
282 /* if (av_pred_en < -14/(20Log10(2))) av_pred_en = .. */ |
188
9b07190a6d08
libgsmefr/d_gains.c: perf opt
Mychaela Falconia <falcon@freecalypso.org>
parents:
61
diff
changeset
|
283 if (av_pred_en < -2381) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
284 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
285 av_pred_en = -2381; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
286 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
287 for (i = 3; i > 0; i--) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
288 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
289 st->past_qua_en[i] = st->past_qua_en[i - 1]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
290 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
291 st->past_qua_en[0] = av_pred_en; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
292 for (i = 1; i < 5; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
293 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
294 st->gbuf[i - 1] = st->gbuf[i]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
295 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
296 st->gbuf[4] = st->past_gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
297 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
298 /* Use the most recent comfort noise fixed codebook gain value |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
299 for updating the fixed codebook gain history */ |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
300 if (st->gain_code_new_CN == 0) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
301 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
302 tmp = st->prev_gc; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
303 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
304 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
305 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
306 tmp = st->gain_code_new_CN; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
307 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
308 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
309 update_gain_code_history_rx (st, tmp); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 if (sub (i_subfr, (3 * L_SUBFR)) == 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
313 st->gain_code_old_CN = *gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 return; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 if ((rxdtx_ctrl & RX_SP_FLAG) != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 /*-------------- Decode codebook gain ---------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 /*-------------------------------------------------------------------* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 * energy of code: * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 * ~~~~~~~~~~~~~~~ * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 * ener_code = 10 * Log10(energy/lcode) / constant * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 * = 1/2 * Log2(energy/lcode) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 * constant = 20*Log10(2) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 *-------------------------------------------------------------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 /* ener_code = log10(ener_code/lcode) / (20*log10(2)) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 ener_code = 0; move32 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 for (i = 0; i < lcode; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
335 ener_code = L_mac (ener_code, code[i], code[i]); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 /* ener_code = ener_code / lcode */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 ener_code = L_mult (round (ener_code), 26214); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 /* ener_code = 1/2 * Log2(ener_code) */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 Log2 (ener_code, &exp, &frac); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 ener_code = L_Comp (sub (exp, 30), frac); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 /* predicted energy */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 ener = MEAN_ENER; move32 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 for (i = 0; i < 4; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
349 ener = L_mac (ener, st->past_qua_en[i], st->pred[i]); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 /*-------------------------------------------------------------------* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 * predicted codebook gain * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 * ~~~~~~~~~~~~~~~~~~~~~~~ * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
355 * gcode0 = Pow10( (ener*constant - ener_code*constant) / 20 ) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
356 * = Pow2(ener-ener_code) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
357 * constant = 20*Log10(2) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
358 *-------------------------------------------------------------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
359 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
360 ener = L_shr (L_sub (ener, ener_code), 1); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
361 L_Extract (ener, &exp, &frac); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
362 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
363 gcode0 = extract_l (Pow2 (exp, frac)); /* predicted gain */ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
364 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
365 gcode0 = shl (gcode0, 4); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
366 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
367 *gain_code = mult (qua_gain_code[index], gcode0); move16 (); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
368 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
369 if (prev_bf != 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
370 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
371 if (sub (*gain_code, st->prev_gc) > 0) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
372 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
373 *gain_code = st->prev_gc; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
374 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
375 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
376 /*-------------------------------------------------------------------* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
377 * update table of past quantized energies * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
378 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
379 * past_qua_en = 20 * Log10(qua_gain_code) / constant * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
380 * = Log2(qua_gain_code) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
381 * constant = 20*Log10(2) * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
382 *-------------------------------------------------------------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
383 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
384 for (i = 3; i > 0; i--) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
385 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
386 st->past_qua_en[i] = st->past_qua_en[i - 1]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
387 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
388 Log2 (L_deposit_l (qua_gain_code[index]), &exp, &frac); |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
389 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
390 st->past_qua_en[0] = shr (frac, 5); |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
391 st->past_qua_en[0] = add (st->past_qua_en[0], shl (sub (exp, 11), 10)); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
392 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
393 update_gain_code_history_rx (st, *gain_code); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
394 |
188
9b07190a6d08
libgsmefr/d_gains.c: perf opt
Mychaela Falconia <falcon@freecalypso.org>
parents:
61
diff
changeset
|
395 if (i_subfr == (3 * L_SUBFR)) |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
396 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
397 st->gain_code_old_CN = *gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
398 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
399 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
400 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
401 { |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
402 if (((rxdtx_ctrl & RX_FIRST_SID_UPDATE) != 0) && (i_subfr == 0)) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
403 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
404 st->gain_code_new_CN = mult (st->gcode0_CN, qua_gain_code[index]); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
405 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
406 /*---------------------------------------------------------------* |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
407 * reset table of past quantized energies * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
408 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
409 *---------------------------------------------------------------*/ |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
410 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
411 for (i = 0; i < 4; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
412 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
413 st->past_qua_en[i] = -2381; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
414 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
415 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
416 if (((rxdtx_ctrl & RX_CONT_SID_UPDATE) != 0) && (i_subfr == 0)) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
417 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
418 st->gain_code_old_CN = st->gain_code_new_CN; |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
419 st->gain_code_new_CN = mult (st->gcode0_CN, qua_gain_code[index]); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
420 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
421 if (i_subfr == 0) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
422 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
423 *gain_code = interpolate_CN_param (st->gain_code_old_CN, |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
424 st->gain_code_new_CN, |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
425 rx_dtx_state); |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
426 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
427 else |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
428 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
429 *gain_code = st->prev_gc; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
430 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
431 } |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
432 |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
433 st->past_gain_code = *gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
434 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
435 for (i = 1; i < 5; i++) |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
436 { |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
437 st->gbuf[i - 1] = st->gbuf[i]; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
438 } |
61
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
439 st->gbuf[4] = st->past_gain_code; |
a18782a7d270
libgsmefr: d_gains.c compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
53
diff
changeset
|
440 st->prev_gc = st->past_gain_code; |
53
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
441 |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
442 return; |
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
443 } |