FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/int_lpc.c @ 381:32bc48faec4b
libtwamr: integrate int_lpc.c
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Mon, 06 May 2024 05:35:21 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 380:2ed325c9a507 | 381:32bc48faec4b |
|---|---|
| 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 : int_lpc.c | |
| 11 * | |
| 12 ******************************************************************************** | |
| 13 */ | |
| 14 /* | |
| 15 ******************************************************************************** | |
| 16 * MODULE INCLUDE FILE AND VERSION ID | |
| 17 ******************************************************************************** | |
| 18 */ | |
| 19 #include "namespace.h" | |
| 20 #include "int_lpc.h" | |
| 21 | |
| 22 /* | |
| 23 ******************************************************************************** | |
| 24 * INCLUDE FILES | |
| 25 ******************************************************************************** | |
| 26 */ | |
| 27 #include "typedef.h" | |
| 28 #include "basic_op.h" | |
| 29 #include "no_count.h" | |
| 30 #include "cnst.h" | |
| 31 #include "lsp_az.h" | |
| 32 | |
| 33 /* | |
| 34 ******************************************************************************** | |
| 35 * LOCAL VARIABLES AND TABLES | |
| 36 ******************************************************************************** | |
| 37 */ | |
| 38 /* | |
| 39 *--------------------------------------* | |
| 40 * Constants (defined in cnst.h) * | |
| 41 *--------------------------------------* | |
| 42 * M : LPC order * | |
| 43 * MP1 : LPC order + 1 * | |
| 44 *--------------------------------------* | |
| 45 */ | |
| 46 | |
| 47 /* | |
| 48 ******************************************************************************** | |
| 49 * PUBLIC PROGRAM CODE | |
| 50 ******************************************************************************** | |
| 51 */ | |
| 52 /* | |
| 53 ************************************************************************** | |
| 54 * | |
| 55 * Function : Int_lpc_1and3 | |
| 56 * Purpose : Interpolates the LSPs and converts to LPC parameters | |
| 57 * to get a different LP filter in each subframe. | |
| 58 * Description : The 20 ms speech frame is divided into 4 subframes. | |
| 59 * The LSPs are quantized and transmitted at the 2nd and | |
| 60 * 4th subframes (twice per frame) and interpolated at the | |
| 61 * 1st and 3rd subframe. | |
| 62 * | |
| 63 * |------|------|------|------| | |
| 64 * sf1 sf2 sf3 sf4 | |
| 65 * F0 Fm F1 | |
| 66 * | |
| 67 * sf1: 1/2 Fm + 1/2 F0 sf3: 1/2 F1 + 1/2 Fm | |
| 68 * sf2: Fm sf4: F1 | |
| 69 * Returns : void | |
| 70 * | |
| 71 ************************************************************************** | |
| 72 */ | |
| 73 void Int_lpc_1and3 ( | |
| 74 Word16 lsp_old[], /* i : LSP vector at the 4th subfr. of past frame (M) */ | |
| 75 Word16 lsp_mid[], /* i : LSP vector at the 2nd subfr. of | |
| 76 present frame (M) */ | |
| 77 Word16 lsp_new[], /* i : LSP vector at the 4th subfr. of | |
| 78 present frame (M) */ | |
| 79 Word16 Az[] /* o : interpolated LP parameters in all subfr. | |
| 80 (AZ_SIZE) */ | |
| 81 ) | |
| 82 { | |
| 83 Word16 i; | |
| 84 Word16 lsp[M]; | |
| 85 | |
| 86 /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */ | |
| 87 | |
| 88 for (i = 0; i < M; i++) | |
| 89 { | |
| 90 lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_old[i], 1)); | |
| 91 move16 (); | |
| 92 } | |
| 93 | |
| 94 Lsp_Az (lsp, Az); /* Subframe 1 */ | |
| 95 Az += MP1; move16 (); | |
| 96 | |
| 97 Lsp_Az (lsp_mid, Az); /* Subframe 2 */ | |
| 98 Az += MP1; move16 (); | |
| 99 | |
| 100 for (i = 0; i < M; i++) | |
| 101 { | |
| 102 lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_new[i], 1)); | |
| 103 move16 (); | |
| 104 } | |
| 105 | |
| 106 Lsp_Az (lsp, Az); /* Subframe 3 */ | |
| 107 Az += MP1; move16 (); | |
| 108 | |
| 109 Lsp_Az (lsp_new, Az); /* Subframe 4 */ | |
| 110 | |
| 111 return; | |
| 112 } | |
| 113 | |
| 114 /* | |
| 115 ************************************************************************** | |
| 116 * | |
| 117 * Function : Int_lpc_1and3_2 | |
| 118 * Purpose : Interpolation of the LPC parameters. Same as the Int_lpc | |
| 119 * function but we do not recompute Az() for subframe 2 and | |
| 120 * 4 because it is already available. | |
| 121 * Returns : void | |
| 122 * | |
| 123 ************************************************************************** | |
| 124 */ | |
| 125 void Int_lpc_1and3_2 ( | |
| 126 Word16 lsp_old[], /* i : LSP vector at the 4th subfr. of past frame (M) */ | |
| 127 Word16 lsp_mid[], /* i : LSP vector at the 2nd subframe of | |
| 128 present frame (M) */ | |
| 129 Word16 lsp_new[], /* i : LSP vector at the 4th subframe of | |
| 130 present frame (M) */ | |
| 131 Word16 Az[] /* o :interpolated LP parameters | |
| 132 in subframes 1 and 3 (AZ_SIZE) */ | |
| 133 ) | |
| 134 { | |
| 135 Word16 i; | |
| 136 Word16 lsp[M]; | |
| 137 | |
| 138 /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */ | |
| 139 | |
| 140 for (i = 0; i < M; i++) | |
| 141 { | |
| 142 lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_old[i], 1)); | |
| 143 move16 (); | |
| 144 } | |
| 145 Lsp_Az (lsp, Az); /* Subframe 1 */ | |
| 146 Az += MP1 * 2; move16 (); | |
| 147 | |
| 148 for (i = 0; i < M; i++) | |
| 149 { | |
| 150 lsp[i] = add (shr (lsp_mid[i], 1), shr (lsp_new[i], 1)); | |
| 151 move16 (); | |
| 152 } | |
| 153 Lsp_Az (lsp, Az); /* Subframe 3 */ | |
| 154 | |
| 155 return; | |
| 156 } | |
| 157 /************************************************************************* | |
| 158 * | |
| 159 * FUNCTION: Int_lpc_1to3() | |
| 160 * | |
| 161 * PURPOSE: Interpolates the LSPs and convert to LP parameters to get | |
| 162 * a different LP filter in each subframe. | |
| 163 * | |
| 164 * DESCRIPTION: | |
| 165 * The 20 ms speech frame is divided into 4 subframes. | |
| 166 * The LSPs are quantized and transmitted at the 4th subframe | |
| 167 * (once per frame) and interpolated at the 1st, 2nd and 3rd subframe. | |
| 168 * | |
| 169 * |------|------|------|------| | |
| 170 * sf1 sf2 sf3 sf4 | |
| 171 * F0 F1 | |
| 172 * | |
| 173 * sf1: 3/4 F0 + 1/4 F1 sf3: 1/4 F0 + 3/4 F1 | |
| 174 * sf2: 1/2 F0 + 1/2 F1 sf4: F1 | |
| 175 * | |
| 176 *************************************************************************/ | |
| 177 void Int_lpc_1to3( | |
| 178 Word16 lsp_old[], /* input : LSP vector at the 4th SF of past frame */ | |
| 179 Word16 lsp_new[], /* input : LSP vector at the 4th SF of present frame */ | |
| 180 Word16 Az[] /* output: interpolated LP parameters in all SFs */ | |
| 181 ) | |
| 182 { | |
| 183 Word16 i; | |
| 184 Word16 lsp[M]; | |
| 185 | |
| 186 for (i = 0; i < M; i++) { | |
| 187 lsp[i] = add(shr(lsp_new[i], 2), sub(lsp_old[i], shr(lsp_old[i], 2))); | |
| 188 move16 (); | |
| 189 } | |
| 190 | |
| 191 Lsp_Az(lsp, Az); /* Subframe 1 */ | |
| 192 Az += MP1; move16 (); | |
| 193 | |
| 194 | |
| 195 for (i = 0; i < M; i++) { | |
| 196 lsp[i] = add(shr(lsp_old[i], 1), shr(lsp_new[i], 1)); | |
| 197 move16 (); | |
| 198 } | |
| 199 | |
| 200 Lsp_Az(lsp, Az); /* Subframe 2 */ | |
| 201 Az += MP1; move16 (); | |
| 202 | |
| 203 for (i = 0; i < M; i++) { | |
| 204 lsp[i] = add(shr(lsp_old[i], 2), sub(lsp_new[i], shr(lsp_new[i], 2))); | |
| 205 move16 (); | |
| 206 } | |
| 207 | |
| 208 Lsp_Az(lsp, Az); /* Subframe 3 */ | |
| 209 Az += MP1; move16 (); | |
| 210 | |
| 211 Lsp_Az(lsp_new, Az); /* Subframe 4 */ | |
| 212 | |
| 213 return; | |
| 214 } | |
| 215 | |
| 216 /************************************************************************* | |
| 217 * Function Int_lpc_1to3_2() | |
| 218 * Interpolation of the LPC parameters. | |
| 219 * Same as the previous function but we do not recompute Az() for | |
| 220 * subframe 4 because it is already available. | |
| 221 *************************************************************************/ | |
| 222 | |
| 223 void Int_lpc_1to3_2( | |
| 224 Word16 lsp_old[], /* input : LSP vector at the 4th SF of past frame */ | |
| 225 Word16 lsp_new[], /* input : LSP vector at the 4th SF of present frame */ | |
| 226 Word16 Az[] /* output: interpolated LP parameters in SFs 1,2,3 */ | |
| 227 ) | |
| 228 { | |
| 229 Word16 i; | |
| 230 Word16 lsp[M]; | |
| 231 | |
| 232 for (i = 0; i < M; i++) { | |
| 233 lsp[i] = add(shr(lsp_new[i], 2), sub(lsp_old[i], shr(lsp_old[i], 2))); | |
| 234 move16 (); | |
| 235 } | |
| 236 | |
| 237 Lsp_Az(lsp, Az); /* Subframe 1 */ | |
| 238 Az += MP1; move16 (); | |
| 239 | |
| 240 for (i = 0; i < M; i++) { | |
| 241 lsp[i] = add(shr(lsp_old[i], 1), shr(lsp_new[i], 1)); | |
| 242 move16 (); | |
| 243 } | |
| 244 | |
| 245 Lsp_Az(lsp, Az); /* Subframe 2 */ | |
| 246 Az += MP1; move16 (); | |
| 247 | |
| 248 for (i = 0; i < M; i++) { | |
| 249 lsp[i] = add(shr(lsp_old[i], 2), sub(lsp_new[i], shr(lsp_new[i], 2))); | |
| 250 move16 (); | |
| 251 } | |
| 252 | |
| 253 Lsp_Az(lsp, Az); /* Subframe 3 */ | |
| 254 | |
| 255 return; | |
| 256 } |
