FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/agc.c @ 382:693ea1d5cf1e
libtwamr: integrate int_lsf.c
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 06 May 2024 05:45:31 +0000 | 
| parents | 6b33f3ba4289 | 
| children | 
| rev | line source | 
|---|---|
| 253 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 * R99 Version 3.3.0 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 * REL-4 Version 4.1.0 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 * File : agc.c | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 * MODULE INCLUDE FILE AND VERSION ID | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 #include "namespace.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 #include "agc.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 * INCLUDE FILES | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 #include "typedef.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 #include "basic_op.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 #include "no_count.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 #include "cnst.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 #include "inv_sqrt.h" | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 * LOCAL VARIABLES AND TABLES | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 * LOCAL PROGRAM CODE | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 static Word32 energy_old( /* o : return energy of signal */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 Word16 in[], /* i : input signal (length l_trm) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 Word16 l_trm /* i : signal length */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 ) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 Word32 s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 Word16 i, temp; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 temp = shr (in[0], 2); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 s = L_mult (temp, temp); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 for (i = 1; i < l_trm; i++) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 temp = shr (in[i], 2); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 s = L_mac (s, temp, temp); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 return s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 static Word32 energy_new( /* o : return energy of signal */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 Word16 in[], /* i : input signal (length l_trm) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 Word16 l_trm /* i : signal length */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 ) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 Word32 s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 Word16 i; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 Flag ov_save; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 ov_save = Overflow; move16 (); /* save overflow flag in case energy_old */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 /* must be called */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 s = L_mult(in[0], in[0]); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 for (i = 1; i < l_trm; i++) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 s = L_mac(s, in[i], in[i]); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 /* check for overflow */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 test (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 if (L_sub (s, MAX_32) == 0L) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 Overflow = ov_save; move16 (); /* restore overflow flag */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 s = energy_old (in, l_trm); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 else | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 s = L_shr(s, 4); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 return s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 * PUBLIC PROGRAM CODE | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 ***************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 * Function : agc_reset | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 * Purpose : Reset of agc (i.e. set state memory to 1.0) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 107 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 108 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 109 */ | 
| 307 
6b33f3ba4289
libtwamr: go for single-chunk-state approach
 Mychaela Falconia <falcon@freecalypso.org> parents: 
255diff
changeset | 110 void agc_reset (agcState *state) | 
| 253 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 111 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 112 state->past_gain = 4096; /* initial value of past_gain = 1.0 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 113 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 114 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 115 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 116 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 117 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 118 * Function : agc | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 119 * Purpose : Scales the postfilter output on a subframe basis | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 120 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 121 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 122 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 123 int agc ( | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 124 agcState *st, /* i/o : agc state */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 125 Word16 *sig_in, /* i : postfilter input signal (l_trm) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 126 Word16 *sig_out, /* i/o : postfilter output signal (l_trm) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 127 Word16 agc_fac, /* i : AGC factor */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 128 Word16 l_trm /* i : subframe size */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 129 ) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 130 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 131 Word16 i, exp; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 132 Word16 gain_in, gain_out, g0, gain; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 133 Word32 s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 134 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 135 /* calculate gain_out with exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 136 s = energy_new(sig_out, l_trm); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 137 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 138 test (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 139 if (s == 0) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 140 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 141 st->past_gain = 0; move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 142 return 0; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 143 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 144 exp = sub (norm_l (s), 1); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 145 gain_out = round (L_shl (s, exp)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 146 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 147 /* calculate gain_in with exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 148 s = energy_new(sig_in, l_trm); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 149 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 150 test (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 151 if (s == 0) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 152 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 153 g0 = 0; move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 154 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 155 else | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 156 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 157 i = norm_l (s); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 158 gain_in = round (L_shl (s, i)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 159 exp = sub (exp, i); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 160 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 161 /*---------------------------------------------------* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 162 * g0 = (1-agc_fac) * sqrt(gain_in/gain_out); * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 163 *---------------------------------------------------*/ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 164 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 165 s = L_deposit_l (div_s (gain_out, gain_in)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 166 s = L_shl (s, 7); /* s = gain_out / gain_in */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 167 s = L_shr (s, exp); /* add exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 168 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 169 s = Inv_sqrt (s); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 170 i = round (L_shl (s, 9)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 171 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 172 /* g0 = i * (1-agc_fac) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 173 g0 = mult (i, sub (32767, agc_fac)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 174 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 175 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 176 /* compute gain[n] = agc_fac * gain[n-1] | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 177 + (1-agc_fac) * sqrt(gain_in/gain_out) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 178 /* sig_out[n] = gain[n] * sig_out[n] */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 179 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 180 gain = st->past_gain; move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 181 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 182 for (i = 0; i < l_trm; i++) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 183 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 184 gain = mult (gain, agc_fac); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 185 gain = add (gain, g0); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 186 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], gain), 3)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 187 move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 188 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 189 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 190 st->past_gain = gain; move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 191 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 192 return 0; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 193 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 194 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 195 /* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 196 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 197 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 198 * Function : agc2 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 199 * Purpose : Scales the excitation on a subframe basis | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 200 * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 201 ************************************************************************** | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 202 */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 203 void agc2 ( | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 204 Word16 *sig_in, /* i : postfilter input signal */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 205 Word16 *sig_out, /* i/o : postfilter output signal */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 206 Word16 l_trm /* i : subframe size */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 207 ) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 208 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 209 Word16 i, exp; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 210 Word16 gain_in, gain_out, g0; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 211 Word32 s; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 212 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 213 /* calculate gain_out with exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 214 s = energy_new(sig_out, l_trm); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 215 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 216 test (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 217 if (s == 0) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 218 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 219 return; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 220 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 221 exp = sub (norm_l (s), 1); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 222 gain_out = round (L_shl (s, exp)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 223 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 224 /* calculate gain_in with exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 225 s = energy_new(sig_in, l_trm); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 226 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 227 test (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 228 if (s == 0) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 229 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 230 g0 = 0; move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 231 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 232 else | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 233 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 234 i = norm_l (s); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 235 gain_in = round (L_shl (s, i)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 236 exp = sub (exp, i); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 237 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 238 /*---------------------------------------------------* | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 239 * g0 = sqrt(gain_in/gain_out); * | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 240 *---------------------------------------------------*/ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 241 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 242 s = L_deposit_l (div_s (gain_out, gain_in)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 243 s = L_shl (s, 7); /* s = gain_out / gain_in */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 244 s = L_shr (s, exp); /* add exponent */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 245 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 246 s = Inv_sqrt (s); move32 (); /* function result */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 247 g0 = round (L_shl (s, 9)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 248 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 249 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 250 /* sig_out(n) = gain(n) sig_out(n) */ | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 251 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 252 for (i = 0; i < l_trm; i++) | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 253 { | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 254 sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], g0), 3)); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 255 move16 (); | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 256 } | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 257 | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 258 return; | 
| 
54f6bc41ed10
libtwamr: integrate a* modules
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 259 } | 
