FreeCalypso > hg > gsm-codec-lib
annotate libgsmefr/agc.c @ 106:e7c8d739c4c8
gsm-efr2amr: implement -w option like in gsm-amr2efr
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 27 Nov 2022 06:25:06 +0000 | 
| parents | 7b11cbe99a0e | 
| 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 * FUNCTION: agc | 
| 
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 * PURPOSE: Scales the postfilter output on a subframe basis by automatic | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 * control of the subframe gain. | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 * DESCRIPTION: | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 * sig_out[n] = sig_out[n] * gain[n]; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 * where gain[n] is the gain at the nth sample given by | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 * gain[n] = agc_fac * gain[n-1] + (1 - agc_fac) g_in/g_out | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 * g_in/g_out is the square root of the ratio of energy at the input | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 * and output of the postfilter. | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 *************************************************************************/ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 17 #include "gsm_efr.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 #include "typedef.h" | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 19 #include "namespace.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 #include "basic_op.h" | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 21 #include "no_count.h" | 
| 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 22 #include "cnst.h" | 
| 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 23 #include "dec_state.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 #include "sig_proc.h" | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 void agc ( | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 27 struct EFR_decoder_state *st, | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 Word16 *sig_in, /* (i) : postfilter input signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 Word16 *sig_out, /* (i/o) : postfilter output signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 Word16 agc_fac, /* (i) : AGC factor */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 Word16 l_trm /* (i) : subframe size */ | 
| 
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 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 Word16 i, exp; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 Word16 gain_in, gain_out, g0, gain; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 Word32 s; | 
| 
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 Word16 temp; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 /* calculate gain_out with exponent */ | 
| 
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 temp = shr (sig_out[0], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 s = L_mult (temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 for (i = 1; i < l_trm; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 temp = shr (sig_out[i], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 s = L_mac (s, temp, temp); | 
| 
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 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 if (s == 0) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 { | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 53 st->past_gain = 0; | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 return; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 exp = sub (norm_l (s), 1); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 gain_out = round (L_shl (s, exp)); | 
| 
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 /* calculate gain_in with exponent */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 temp = shr (sig_in[0], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 s = L_mult (temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 for (i = 1; i < l_trm; i++) | 
| 
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 temp = shr (sig_in[i], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 s = L_mac (s, temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 } | 
| 
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 if (s == 0) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 { | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 72 g0 = 0; | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 else | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 i = norm_l (s); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 gain_in = round (L_shl (s, i)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 exp = sub (exp, i); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 /*---------------------------------------------------* | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 * g0 = (1-agc_fac) * sqrt(gain_in/gain_out); * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 *---------------------------------------------------*/ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 s = L_deposit_l (div_s (gain_out, gain_in)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 s = L_shl (s, 7); /* s = gain_out / gain_in */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 s = L_shr (s, exp); /* add exponent */ | 
| 
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 s = Inv_sqrt (s); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 i = round (L_shl (s, 9)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 /* g0 = i * (1-agc_fac) */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 g0 = mult (i, sub (32767, agc_fac)); | 
| 
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 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 /* compute gain[n] = agc_fac * gain[n-1] | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 + (1-agc_fac) * sqrt(gain_in/gain_out) */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 /* sig_out[n] = gain[n] * sig_out[n] */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 99 gain = st->past_gain; | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 for (i = 0; i < l_trm; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 gain = mult (gain, agc_fac); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 gain = add (gain, g0); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], gain), 3)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 107 | 
| 54 
7b11cbe99a0e
libgsmefr: agc.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 108 st->past_gain = gain; | 
| 53 
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 return; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 111 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 112 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 113 void agc2 ( | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 114 Word16 *sig_in, /* (i) : postfilter input signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 115 Word16 *sig_out, /* (i/o) : postfilter output signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 116 Word16 l_trm /* (i) : subframe size */ | 
| 
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 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 119 Word16 i, exp; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 120 Word16 gain_in, gain_out, g0; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 121 Word32 s; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 122 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 123 Word16 temp; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 124 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 125 /* calculate gain_out with exponent */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 126 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 127 temp = shr (sig_out[0], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 128 s = L_mult (temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 129 for (i = 1; i < l_trm; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 130 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 131 temp = shr (sig_out[i], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 132 s = L_mac (s, temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 133 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 134 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 135 test (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 136 if (s == 0) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 137 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 138 return; | 
| 
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 exp = sub (norm_l (s), 1); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 141 gain_out = round (L_shl (s, exp)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 142 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 143 /* calculate gain_in with exponent */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 144 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 145 temp = shr (sig_in[0], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 146 s = L_mult (temp, temp); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 147 for (i = 1; i < l_trm; i++) | 
| 
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 temp = shr (sig_in[i], 2); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 150 s = L_mac (s, temp, temp); | 
| 
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 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 153 test (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 154 if (s == 0) | 
| 
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 g0 = 0; move16 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 157 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 158 else | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 159 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 160 i = norm_l (s); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 161 gain_in = round (L_shl (s, i)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 162 exp = sub (exp, i); | 
| 
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 * g0 = sqrt(gain_in/gain_out); * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 166 *---------------------------------------------------*/ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 167 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 168 s = L_deposit_l (div_s (gain_out, gain_in)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 169 s = L_shl (s, 7); /* s = gain_out / gain_in */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 170 s = L_shr (s, exp); /* add exponent */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 171 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 172 s = Inv_sqrt (s); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 173 g0 = round (L_shl (s, 9)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 174 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 175 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 176 /* sig_out(n) = gain(n) sig_out(n) */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 177 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 178 for (i = 0; i < l_trm; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 179 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 180 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], g0), 3)); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 181 move16 (); | 
| 
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 return; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 185 } | 
