comparison libgsmefr/agc.c @ 54:7b11cbe99a0e

libgsmefr: agc.c compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 25 Nov 2022 16:35:07 +0000
parents 49dd1ac8e75b
children
comparison
equal deleted inserted replaced
53:49dd1ac8e75b 54:7b11cbe99a0e
12 * g_in/g_out is the square root of the ratio of energy at the input 12 * g_in/g_out is the square root of the ratio of energy at the input
13 * and output of the postfilter. 13 * and output of the postfilter.
14 * 14 *
15 *************************************************************************/ 15 *************************************************************************/
16 16
17 #include "gsm_efr.h"
17 #include "typedef.h" 18 #include "typedef.h"
19 #include "namespace.h"
18 #include "basic_op.h" 20 #include "basic_op.h"
19 #include "count.h" 21 #include "no_count.h"
22 #include "cnst.h"
23 #include "dec_state.h"
20 #include "sig_proc.h" 24 #include "sig_proc.h"
21 #include "cnst.h"
22
23 Word16 past_gain; /* initial value of past_gain = 1.0 */
24 25
25 void agc ( 26 void agc (
27 struct EFR_decoder_state *st,
26 Word16 *sig_in, /* (i) : postfilter input signal */ 28 Word16 *sig_in, /* (i) : postfilter input signal */
27 Word16 *sig_out, /* (i/o) : postfilter output signal */ 29 Word16 *sig_out, /* (i/o) : postfilter output signal */
28 Word16 agc_fac, /* (i) : AGC factor */ 30 Word16 agc_fac, /* (i) : AGC factor */
29 Word16 l_trm /* (i) : subframe size */ 31 Word16 l_trm /* (i) : subframe size */
30 ) 32 )
44 { 46 {
45 temp = shr (sig_out[i], 2); 47 temp = shr (sig_out[i], 2);
46 s = L_mac (s, temp, temp); 48 s = L_mac (s, temp, temp);
47 } 49 }
48 50
49 test ();
50 if (s == 0) 51 if (s == 0)
51 { 52 {
52 past_gain = 0; move16 (); 53 st->past_gain = 0;
53 return; 54 return;
54 } 55 }
55 exp = sub (norm_l (s), 1); 56 exp = sub (norm_l (s), 1);
56 gain_out = round (L_shl (s, exp)); 57 gain_out = round (L_shl (s, exp));
57 58
64 { 65 {
65 temp = shr (sig_in[i], 2); 66 temp = shr (sig_in[i], 2);
66 s = L_mac (s, temp, temp); 67 s = L_mac (s, temp, temp);
67 } 68 }
68 69
69 test ();
70 if (s == 0) 70 if (s == 0)
71 { 71 {
72 g0 = 0; move16 (); 72 g0 = 0;
73 } 73 }
74 else 74 else
75 { 75 {
76 i = norm_l (s); 76 i = norm_l (s);
77 gain_in = round (L_shl (s, i)); 77 gain_in = round (L_shl (s, i));
94 94
95 /* compute gain[n] = agc_fac * gain[n-1] 95 /* compute gain[n] = agc_fac * gain[n-1]
96 + (1-agc_fac) * sqrt(gain_in/gain_out) */ 96 + (1-agc_fac) * sqrt(gain_in/gain_out) */
97 /* sig_out[n] = gain[n] * sig_out[n] */ 97 /* sig_out[n] = gain[n] * sig_out[n] */
98 98
99 gain = past_gain; move16 (); 99 gain = st->past_gain;
100 100
101 for (i = 0; i < l_trm; i++) 101 for (i = 0; i < l_trm; i++)
102 { 102 {
103 gain = mult (gain, agc_fac); 103 gain = mult (gain, agc_fac);
104 gain = add (gain, g0); 104 gain = add (gain, g0);
105 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], gain), 3)); 105 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], gain), 3));
106 move16 ();
107 } 106 }
108 107
109 past_gain = gain; move16 (); 108 st->past_gain = gain;
110 109
111 return; 110 return;
112 } 111 }
113 112
114 void agc2 ( 113 void agc2 (