annotate libgsmhr1/err_conc.c @ 600:5a7d04bf26f5

libgsmhr1: integrate signal-level err_conc code
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 10:24:06 +0000
parents 762cf36e2487
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /***************************************************************************
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * File Name: err_conc.c
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * Purpose:
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * Contains all functions for error concealment.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * Relevant specification: GSM 06.21
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 * Below is a listing of all the functions appearing in the file.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * All functions are called within speechDecoder().
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * Error concealment on parameter level:
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 * para_conceal_speech_decoder()
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 * Error concealment on signal level:
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 * signal_conceal_sub()
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * Additional functions to support concealment:
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * level_estimator()
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * level_calc()
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 **************************************************************************/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 | Include Files |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
600
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
30 #include "typedefs.h"
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
31 #include "tw_gsmhr.h"
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
32 #include "namespace.h"
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "mathhalf.h"
600
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
34 #include "dec_func.h"
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
35 #include "dec_state.h"
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 #include "err_conc.h"
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 | Local Defines |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 #define MIN_MUTE_LEVEL -45
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 /****************************************************************************
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * FUNCTION NAME: level_estimator
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * This subroutine determines the mean level and the maximum level
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * of the last four speech sub-frames. These parameters are the basis
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * for the level estimation in signal_conceal_sub().
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * Input: swUpdate = 0: the levels are determined
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 * = 1: the memory of the level estimator
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * is updated
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * pswDecodedSpeechFrame[] synthesized speech signal
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * Output: swLevelMean mean level of the last 4 sub-frames
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * swLevelMax maximum level of the last 4 sub-frames
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 ***************************************************************************/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63
600
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
64 void level_estimator_det(struct gsmhr_decoder_state *st,
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
65 Shortword *pswLevelMean, Shortword *pswLevelMax)
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
66 {
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
67
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
68 /*_________________________________________________________________________
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
69 | |
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
70 | Automatic Variables |
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
71 |_________________________________________________________________________|
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
72 */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
73 Shortword i;
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
74 Longword L_sum;
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
75
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
76 /*_________________________________________________________________________
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
77 | |
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
78 | Executable Code |
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
79 |_________________________________________________________________________|
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
80 */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
81
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
82 /* Determine mean level of the last 4 sub-frames: */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
83 /* ---------------------------------------------- */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
84 for (i = 0, L_sum = 0; i < 4; ++i)
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
85 {
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
86 L_sum = L_add(L_sum, st->plSubfrEnergyMem[i]);
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
87 }
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
88 *pswLevelMean = level_calc(1, &L_sum);
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
89
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
90 /* Determine maximum level of the last 4 sub-frames: */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
91 /* ------------------------------------------------- */
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
92 *pswLevelMax = -72;
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
93 for (i = 0; i < 4; ++i)
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
94 {
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
95 if (sub(st->swLevelMem[i], *pswLevelMax) > 0)
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
96 *pswLevelMax = st->swLevelMem[i];
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
97 }
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
98 }
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
99
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
100 void level_estimator_upd(struct gsmhr_decoder_state *st,
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
101 Shortword pswDecodedSpeechFrame[])
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 | Automatic Variables |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 Shortword i,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 tmp,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 swLevelSub;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 Longword L_sum;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 | Executable Code |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 /* Determine the energy of the synthesized speech signal: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 /* ------------------------------------------------------ */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 for (i = 0, L_sum = 0; i < S_LEN; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 tmp = shr(pswDecodedSpeechFrame[i], 3);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 L_sum = L_mac(L_sum, tmp, tmp);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 swLevelSub = level_calc(0, &L_sum);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 /* Update memories of level estimator: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 /* ----------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 for (i = 0; i < 3; ++i)
600
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
132 st->plSubfrEnergyMem[i] = st->plSubfrEnergyMem[i + 1];
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
133 st->plSubfrEnergyMem[3] = L_sum;
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 for (i = 0; i < 3; ++i)
600
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
136 st->swLevelMem[i] = st->swLevelMem[i + 1];
5a7d04bf26f5 libgsmhr1: integrate signal-level err_conc code
Mychaela Falconia <falcon@freecalypso.org>
parents: 599
diff changeset
137 st->swLevelMem[3] = swLevelSub;
599
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 /*****************************************************************************
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 * FUNCTION NAME: signal_conceal_sub
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * This subroutine performs concealment on subframe signal level.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * A test synthesis is performed and the level of the synthesized speech
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * signal is compared to the estimated level. Depending on the control
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 * flag "swMutePermit" a muting factor is determined.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * If muting is permitted (swMutePermit=1) and the actual sub-frame level
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 * exceeds the maximum level of the last four sub-frames "swLevelMax" plus
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * an allowed increase "psrLevelMaxIncrease[]" then the synthesized speech
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * signal together with the signal memories is muted.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * In table "psrLevelMaxIncrease[]" the maximum allowed increase
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 * of the maximum sub-frame level is stored. The table is controled by the
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 * mean level "swMeanLevel".
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 * If e.g. the level is in the range between -30 and -35 db
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 * the allowed maximum increase is 4 db (psrLevelMaxIncrease[6]).
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * The figures in psrLevelMaxIncrease[] have been determined
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 * by measuring the level statistics of error free synthesized speech.
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 * Input: pswPPFExcit[] excitation signal
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 * pswSynthFiltState[] state of LPC synthesis filter
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 * ppswSynthAs[] LPC coefficients
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 * pswLtpStateOut[] state of long term predictor
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 * pswPPreState[] state of pitch prefilter
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 * swLevelMean mean level
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 * swLevelMax maximum level
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 * swUFI unreliable frame flag
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 * swMuteFlagOld last muting flag
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 * pswMuteFlag actual muting flag
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 * swMutePermit mute permission
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 * Output: pswPPFExcit[] muted excitation signal
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 * pswSynthFiltState[] muted state of LPC synthesis filter
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 * pswLtpStateOut[] muted state of long term predictor
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 * pswPPreState[] muted state of pitch prefilter
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 * Constants: psrConceal[0:15] muting factors
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 * psrLevelMaxIncrease[0:7] maximum allowed level increase
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 ****************************************************************************/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 void signal_conceal_sub(Shortword pswPPFExcit[],
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 Shortword ppswSynthAs[], Shortword pswSynthFiltState[],
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 Shortword pswLtpStateOut[], Shortword pswPPreState[],
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 Shortword swLevelMean, Shortword swLevelMax,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 Shortword swUFI, Shortword swMuteFlagOld,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 Shortword *pswMuteFlag, Shortword swMutePermit)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 | Local Static Variables |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 static const Shortword psrConceal[15] = {29205, 27571, 24573, 21900,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 19519, 17396, 15504, 13818, 12315, 10976, 9783, 8719, 7771, 6925, 6172};
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 static const Shortword psrLevelMaxIncrease[16] =
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 {0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16};
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 | Automatic Variables |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 Shortword swMute,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 swLevelSub,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 i,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 swIndex;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 Shortword swTmp,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 pswStateTmp[10],
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 swOutTmp[40],
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 swPermitMuteSub;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 Longword L_sum;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 | Executable Code |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 /* Test synthesis filter: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 /* ---------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 for (i = 0; i < 10; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 pswStateTmp[i] = pswSynthFiltState[i];
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 lpcIir(pswPPFExcit, ppswSynthAs, pswStateTmp, swOutTmp);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 /* Determine level in db of synthesized signal: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 /* -------------------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 L_sum = 0;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 for (i = 0; i < S_LEN; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 swTmp = shr(swOutTmp[i], 2);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 L_sum = L_mac(L_sum, swTmp, swTmp);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 swLevelSub = level_calc(0, &L_sum);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 /* Determine index to table, specifying the allowed level increase: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 /* level [ 0 .. -5] --> swIndex = 0 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 /* level [-5 .. -10] --> swIndex = 1 etc. */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 /*---------------------------------------------*/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 swIndex = mult(negate(swLevelMean), 1638);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 if (sub(swIndex, 15) > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 swIndex = 15;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 /* Muting is permitted, if it is signalled from the parameter concealment */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 /* unit or if muting has been performed in the last frame */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 /*-----------------------------------------------------------------------*/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 swPermitMuteSub = swMutePermit;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 if (swMuteFlagOld > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 swPermitMuteSub = 1;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 if (swPermitMuteSub > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 /* Muting is not permitted if the sub-frame level is less than */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 /* MIN_MUTE_LEVEL */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 /* ------------------------------------------------------------ */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 if (sub(swLevelSub, MIN_MUTE_LEVEL) <= 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 swPermitMuteSub = 0;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 /* Muting is not permitted if the sub-frame level is less than */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 /* the maximum level of the last 4 sub-frames plus the allowed */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 /* increase */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 /* ------------------------------------------------------------ */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 swMute = sub(swLevelSub, add(swLevelMax, psrLevelMaxIncrease[swIndex]));
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 if (swMute <= 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 swPermitMuteSub = 0;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 /* Perform muting, if allowed */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 /* -------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 if (swPermitMuteSub > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 if (sub(swMute, (Shortword) 15) > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 swMute = 15;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 /* Keep information that muting occured for next frame */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 /* --------------------------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 if (swUFI > 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 *pswMuteFlag = 1;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 /* Mute excitation signal: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 /* ----------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 for (i = 0; i < 10; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 pswSynthFiltState[i] =
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 mult_r(pswSynthFiltState[i], psrConceal[swMute - 1]);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 for (i = 0; i < S_LEN; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 pswPPFExcit[i] = mult_r(pswPPFExcit[i], psrConceal[swMute - 1]);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 /* Mute pitch memory: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 /* ------------------ */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 for (i = 0; i < S_LEN; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 pswLtpStateOut[i] =
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 mult_r(pswLtpStateOut[i], psrConceal[swMute - 1]);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 /* Mute pitch prefilter memory: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 /* ---------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 for (i = 0; i < S_LEN; ++i)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 pswPPreState[i] = mult_r(pswPPreState[i], psrConceal[swMute - 1]);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 /****************************************************************************
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 * FUNCTION NAME: level_calc
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 * This subroutine calculates the level (db) from the energy
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 * of a speech sub-frame (swInd=0) or a speech frame (swInd=1):
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 * The level of a speech subframe is:
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 * swLevel = 10 * lg(EN/(40.*4096*4096))
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 * = 3 * ld(EN) - 88.27
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 * = (3*4*ld(EN) - 353)/4
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 * = (3*(4*POS(MSB(EN)) + 2*BIT(MSB-1) + BIT(MSB-2)) - 353)/4
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 * Input: pl_en energy of the speech subframe or frame
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 * The energy is multiplied by 2 because of the
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 * MAC routines !!
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 * swInd = 0: EN is the energy of one subframe
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 * = 1: EN is the energy of one frame
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 * Output: swLevel level in db
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 *
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 ***************************************************************************/
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 Shortword level_calc(Shortword swInd, Longword *pl_en)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 | Automatic Variables |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 Shortword swPos,
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 swLevel;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 Longword L_tmp;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 /*_________________________________________________________________________
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 | |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 | Executable Code |
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 |_________________________________________________________________________|
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 if (*pl_en != 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 swPos = sub((Shortword) 29, norm_l(*pl_en));
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 else
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 swPos = 0;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 /* Determine the term: 4*POS(MSB(EN)): */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 /* ----------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 swLevel = shl(swPos, 2);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 /* Determine the term: 2*BIT(MSB-1): */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 /* --------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 if (swPos >= 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 L_tmp = L_shl((Longword) 1, swPos);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 if ((*pl_en & L_tmp) != 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 swLevel += 2;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 /* Determine the term: BIT(MSB-2): */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 /* ------------------------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 if (--swPos >= 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 L_tmp = L_shl((Longword) 1, swPos);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 if ((*pl_en & L_tmp) != 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 ++swLevel;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381 /* Multiply by 3: */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 /* -------------- */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 swLevel += shl(swLevel, 1);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 swLevel -= (swInd == 0) ? 353 : 377;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 swLevel = mult_r(swLevel, 0X2000); /* >> 2 */
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 if (sub(swLevel, -72) < 0)
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 {
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 swLevel = -72;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 *pl_en = (swInd == 0) ? 80 : 320;
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 }
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 return (swLevel);
762cf36e2487 libgsmhr1/err_conc.[ch]: import original
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 }