FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/g_adapt.c @ 365:2a265be82195
libtwamr: integrate g_adapt.c
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Mon, 06 May 2024 03:01:15 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 364:3f27ca24c620 | 365:2a265be82195 |
|---|---|
| 1 /* | |
| 2 ******************************************************************************** | |
| 3 * | |
| 4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 | |
| 5 * R99 Version 3.3.0 | |
| 6 * REL-4 Version 4.1.0 | |
| 7 * | |
| 8 ******************************************************************************** | |
| 9 * | |
| 10 * File : g_adapt.c | |
| 11 * Purpose : gain adaptation for MR795 gain quantization | |
| 12 * | |
| 13 ******************************************************************************** | |
| 14 */ | |
| 15 | |
| 16 /* | |
| 17 ******************************************************************************** | |
| 18 * MODULE INCLUDE FILE AND VERSION ID | |
| 19 ******************************************************************************** | |
| 20 */ | |
| 21 #include "namespace.h" | |
| 22 #include "g_adapt.h" | |
| 23 | |
| 24 /* | |
| 25 ******************************************************************************** | |
| 26 * INCLUDE FILES | |
| 27 ******************************************************************************** | |
| 28 */ | |
| 29 #include "typedef.h" | |
| 30 #include "basic_op.h" | |
| 31 #include "oper_32b.h" | |
| 32 #include "no_count.h" | |
| 33 #include "cnst.h" | |
| 34 #include "gmed_n.h" | |
| 35 | |
| 36 /* | |
| 37 ******************************************************************************** | |
| 38 * LOCAL VARIABLES AND TABLES | |
| 39 ******************************************************************************** | |
| 40 */ | |
| 41 #define LTP_GAIN_THR1 2721 /* 2721 Q13 = 0.3322 ~= 1.0 / (10*log10(2)) */ | |
| 42 #define LTP_GAIN_THR2 5443 /* 5443 Q13 = 0.6644 ~= 2.0 / (10*log10(2)) */ | |
| 43 | |
| 44 /* | |
| 45 ******************************************************************************** | |
| 46 * PUBLIC PROGRAM CODE | |
| 47 ******************************************************************************** | |
| 48 */ | |
| 49 | |
| 50 /************************************************************************* | |
| 51 * | |
| 52 * Function: gain_adapt_reset | |
| 53 * Purpose: Initializes state memory to zero | |
| 54 * | |
| 55 ************************************************************************** | |
| 56 */ | |
| 57 void gain_adapt_reset (GainAdaptState *st) | |
| 58 { | |
| 59 Word16 i; | |
| 60 | |
| 61 st->onset = 0; | |
| 62 st->prev_alpha = 0; | |
| 63 st->prev_gc = 0; | |
| 64 | |
| 65 for (i = 0; i < LTPG_MEM_SIZE; i++) | |
| 66 { | |
| 67 st->ltpg_mem[i] = 0; | |
| 68 } | |
| 69 } | |
| 70 | |
| 71 /************************************************************************* | |
| 72 * | |
| 73 * Function: gain_adapt() | |
| 74 * Purpose: calculate pitch/codebook gain adaptation factor alpha | |
| 75 * (and update the adaptor state) | |
| 76 * | |
| 77 ************************************************************************** | |
| 78 */ | |
| 79 void gain_adapt( | |
| 80 GainAdaptState *st, /* i : state struct */ | |
| 81 Word16 ltpg, /* i : ltp coding gain (log2()), Q13 */ | |
| 82 Word16 gain_cod, /* i : code gain, Q1 */ | |
| 83 Word16 *alpha /* o : gain adaptation factor, Q15 */ | |
| 84 ) | |
| 85 { | |
| 86 Word16 adapt; /* adaptdation status; 0, 1, or 2 */ | |
| 87 Word16 result; /* alpha factor, Q13 */ | |
| 88 Word16 filt; /* median-filtered LTP coding gain, Q13 */ | |
| 89 Word16 tmp, i; | |
| 90 | |
| 91 /* basic adaptation */ | |
| 92 test (); | |
| 93 if (sub (ltpg, LTP_GAIN_THR1) <= 0) | |
| 94 { | |
| 95 adapt = 0; move16 (); | |
| 96 } | |
| 97 else | |
| 98 { | |
| 99 test (); | |
| 100 if (sub (ltpg, LTP_GAIN_THR2) <= 0) | |
| 101 { | |
| 102 adapt = 1; move16 (); | |
| 103 } | |
| 104 else | |
| 105 { | |
| 106 adapt = 2; move16 (); | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 /* | |
| 111 * // onset indicator | |
| 112 * if ((cbGain > onFact * cbGainMem[0]) && (cbGain > 100.0)) | |
| 113 * onset = 8; | |
| 114 * else | |
| 115 * if (onset) | |
| 116 * onset--; | |
| 117 */ | |
| 118 /* tmp = cbGain / onFact; onFact = 2.0; 200 Q1 = 100.0 */ | |
| 119 tmp = shr_r (gain_cod, 1); | |
| 120 test (); test (); | |
| 121 if ((sub (tmp, st->prev_gc) > 0) && sub(gain_cod, 200) > 0) | |
| 122 { | |
| 123 st->onset = 8; move16 (); | |
| 124 } | |
| 125 else | |
| 126 { | |
| 127 test (); | |
| 128 if (st->onset != 0) | |
| 129 { | |
| 130 st->onset = sub (st->onset, 1); move16 (); | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 /* | |
| 135 * // if onset, increase adaptor state | |
| 136 * if (onset && (gainAdapt < 2)) gainAdapt++; | |
| 137 */ | |
| 138 test(); test (); | |
| 139 if ((st->onset != 0) && (sub (adapt, 2) < 0)) | |
| 140 { | |
| 141 adapt = add (adapt, 1); | |
| 142 } | |
| 143 | |
| 144 st->ltpg_mem[0] = ltpg; move16 (); | |
| 145 filt = gmed_n (st->ltpg_mem, 5); move16 (); /* function result */ | |
| 146 | |
| 147 test (); | |
| 148 if (adapt == 0) | |
| 149 { | |
| 150 test (); | |
| 151 if (sub (filt, 5443) > 0) /* 5443 Q13 = 0.66443... */ | |
| 152 { | |
| 153 result = 0; move16 (); | |
| 154 } | |
| 155 else | |
| 156 { | |
| 157 test (); | |
| 158 if (filt < 0) | |
| 159 { | |
| 160 result = 16384; move16 (); /* 16384 Q15 = 0.5 */ | |
| 161 } | |
| 162 else | |
| 163 { /* result = 0.5 - 0.75257499*filt */ | |
| 164 /* result (Q15) = 16384 - 24660 * (filt << 2) */ | |
| 165 filt = shl (filt, 2); /* Q15 */ | |
| 166 result = sub (16384, mult (24660, filt)); | |
| 167 } | |
| 168 } | |
| 169 } | |
| 170 else | |
| 171 { | |
| 172 result = 0; move16 (); | |
| 173 } | |
| 174 /* | |
| 175 * if (prevAlpha == 0.0) result = 0.5 * (result + prevAlpha); | |
| 176 */ | |
| 177 test (); | |
| 178 if (st->prev_alpha == 0) | |
| 179 { | |
| 180 result = shr (result, 1); | |
| 181 } | |
| 182 | |
| 183 /* store the result */ | |
| 184 *alpha = result; move16 (); | |
| 185 | |
| 186 /* update adapter state memory */ | |
| 187 st->prev_alpha = result; move16 (); | |
| 188 st->prev_gc = gain_cod; move16 (); | |
| 189 | |
| 190 for (i = LTPG_MEM_SIZE-1; i > 0; i--) | |
| 191 { | |
| 192 st->ltpg_mem[i] = st->ltpg_mem[i-1]; move16 (); | |
| 193 } | |
| 194 /* mem[0] is just present for convenience in calling the gmed_n[5] | |
| 195 * function above. The memory depth is really LTPG_MEM_SIZE-1. | |
| 196 */ | |
| 197 } |
