Mercurial > hg > audiostuff
comparison intercom/ilbc/iLBC_decode.c @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 | |
| 2 /****************************************************************** | |
| 3 | |
| 4 iLBC Speech Coder ANSI-C Source Code | |
| 5 | |
| 6 iLBC_decode.c | |
| 7 | |
| 8 Copyright (C) The Internet Society (2004). | |
| 9 All Rights Reserved. | |
| 10 | |
| 11 ******************************************************************/ | |
| 12 | |
| 13 #include <math.h> | |
| 14 #include <stdlib.h> | |
| 15 | |
| 16 #include "iLBC_define.h" | |
| 17 #include "StateConstructW.h" | |
| 18 #include "LPCdecode.h" | |
| 19 #include "iCBConstruct.h" | |
| 20 #include "doCPLC.h" | |
| 21 #include "helpfun.h" | |
| 22 #include "constants.h" | |
| 23 #include "packing.h" | |
| 24 #include "string.h" | |
| 25 #include "enhancer.h" | |
| 26 #include "hpOutput.h" | |
| 27 #include "syntFilter.h" | |
| 28 | |
| 29 /*----------------------------------------------------------------* | |
| 30 * Initiation of decoder instance. | |
| 31 *---------------------------------------------------------------*/ | |
| 32 | |
| 33 short initDecode( /* (o) Number of decoded | |
| 34 samples */ | |
| 35 iLBC_Dec_Inst_t * iLBCdec_inst, /* (i/o) Decoder instance */ | |
| 36 int mode, /* (i) frame size mode */ | |
| 37 int use_enhancer /* (i) 1 to use enhancer | |
| 38 0 to run without | |
| 39 enhancer */ | |
| 40 ) | |
| 41 { | |
| 42 int i; | |
| 43 | |
| 44 iLBCdec_inst->mode = mode; | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 if (mode == 30) { | |
| 51 iLBCdec_inst->blockl = BLOCKL_30MS; | |
| 52 iLBCdec_inst->nsub = NSUB_30MS; | |
| 53 iLBCdec_inst->nasub = NASUB_30MS; | |
| 54 iLBCdec_inst->lpc_n = LPC_N_30MS; | |
| 55 iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS; | |
| 56 iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS; | |
| 57 iLBCdec_inst->state_short_len = STATE_SHORT_LEN_30MS; | |
| 58 /* ULP init */ | |
| 59 iLBCdec_inst->ULP_inst = &ULP_30msTbl; | |
| 60 } else if (mode == 20) { | |
| 61 iLBCdec_inst->blockl = BLOCKL_20MS; | |
| 62 iLBCdec_inst->nsub = NSUB_20MS; | |
| 63 iLBCdec_inst->nasub = NASUB_20MS; | |
| 64 iLBCdec_inst->lpc_n = LPC_N_20MS; | |
| 65 iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS; | |
| 66 iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS; | |
| 67 iLBCdec_inst->state_short_len = STATE_SHORT_LEN_20MS; | |
| 68 /* ULP init */ | |
| 69 iLBCdec_inst->ULP_inst = &ULP_20msTbl; | |
| 70 } else { | |
| 71 exit(2); | |
| 72 } | |
| 73 | |
| 74 memset(iLBCdec_inst->syntMem, 0, LPC_FILTERORDER * sizeof(float)); | |
| 75 memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl, | |
| 76 LPC_FILTERORDER * sizeof(float)); | |
| 77 | |
| 78 memset(iLBCdec_inst->old_syntdenum, 0, | |
| 79 ((LPC_FILTERORDER + 1) * NSUB_MAX) * sizeof(float)); | |
| 80 for (i = 0; i < NSUB_MAX; i++) | |
| 81 iLBCdec_inst->old_syntdenum[i * (LPC_FILTERORDER + 1)] = 1.0; | |
| 82 | |
| 83 iLBCdec_inst->last_lag = 20; | |
| 84 | |
| 85 iLBCdec_inst->prevLag = 120; | |
| 86 iLBCdec_inst->per = 0.0; | |
| 87 iLBCdec_inst->consPLICount = 0; | |
| 88 iLBCdec_inst->prevPLI = 0; | |
| 89 iLBCdec_inst->prevLpc[0] = 1.0; | |
| 90 memset(iLBCdec_inst->prevLpc + 1, 0, LPC_FILTERORDER * sizeof(float)); | |
| 91 memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX * sizeof(float)); | |
| 92 iLBCdec_inst->seed = 777; | |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | |
| 98 | |
| 99 memset(iLBCdec_inst->hpomem, 0, 4 * sizeof(float)); | |
| 100 | |
| 101 iLBCdec_inst->use_enhancer = use_enhancer; | |
| 102 memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL * sizeof(float)); | |
| 103 for (i = 0; i < ENH_NBLOCKS_TOT; i++) | |
| 104 iLBCdec_inst->enh_period[i] = (float) 40.0; | |
| 105 | |
| 106 iLBCdec_inst->prev_enh_pl = 0; | |
| 107 | |
| 108 return (iLBCdec_inst->blockl); | |
| 109 } | |
| 110 | |
| 111 /*----------------------------------------------------------------* | |
| 112 * frame residual decoder function (subrutine to iLBC_decode) | |
| 113 *---------------------------------------------------------------*/ | |
| 114 | |
| 115 void Decode(iLBC_Dec_Inst_t * iLBCdec_inst, /* (i/o) the decoder state | |
| 116 structure */ | |
| 117 float *decresidual, /* (o) decoded residual frame */ | |
| 118 int start, /* (i) location of start | |
| 119 state */ | |
| 120 int idxForMax, /* (i) codebook index for the | |
| 121 maximum value */ | |
| 122 int *idxVec, /* (i) codebook indexes for the | |
| 123 samples in the start | |
| 124 state */ | |
| 125 float *syntdenum, /* (i) the decoded synthesis | |
| 126 filter coefficients */ | |
| 127 int *cb_index, /* (i) the indexes for the | |
| 128 adaptive codebook */ | |
| 129 int *gain_index, /* (i) the indexes for the | |
| 130 corresponding gains */ | |
| 131 int *extra_cb_index, /* (i) the indexes for the | |
| 132 adaptive codebook part | |
| 133 of start state */ | |
| 134 int *extra_gain_index, /* (i) the indexes for the | |
| 135 corresponding gains */ | |
| 136 int state_first /* (i) 1 if non adaptive part | |
| 137 of start state comes | |
| 138 first 0 if that part | |
| 139 comes last */ | |
| 140 ) | |
| 141 { | |
| 142 float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; | |
| 143 int k, meml_gotten, Nfor, Nback, i; | |
| 144 int diff, start_pos; | |
| 145 int subcount, subframe; | |
| 146 | |
| 147 | |
| 148 | |
| 149 | |
| 150 | |
| 151 | |
| 152 diff = STATE_LEN - iLBCdec_inst->state_short_len; | |
| 153 | |
| 154 if (state_first == 1) { | |
| 155 start_pos = (start - 1) * SUBL; | |
| 156 } else { | |
| 157 start_pos = (start - 1) * SUBL + diff; | |
| 158 } | |
| 159 | |
| 160 /* decode scalar part of start state */ | |
| 161 | |
| 162 StateConstructW(idxForMax, idxVec, | |
| 163 &syntdenum[(start - 1) * (LPC_FILTERORDER + 1)], | |
| 164 &decresidual[start_pos], iLBCdec_inst->state_short_len); | |
| 165 | |
| 166 | |
| 167 if (state_first) { /* put adaptive part in the end */ | |
| 168 | |
| 169 /* setup memory */ | |
| 170 | |
| 171 memset(mem, 0, | |
| 172 (CB_MEML - iLBCdec_inst->state_short_len) * sizeof(float)); | |
| 173 memcpy(mem + CB_MEML - iLBCdec_inst->state_short_len, | |
| 174 decresidual + start_pos, | |
| 175 iLBCdec_inst->state_short_len * sizeof(float)); | |
| 176 | |
| 177 /* construct decoded vector */ | |
| 178 | |
| 179 iCBConstruct(&decresidual[start_pos + | |
| 180 iLBCdec_inst->state_short_len], extra_cb_index, | |
| 181 extra_gain_index, mem + CB_MEML - stMemLTbl, stMemLTbl, diff, | |
| 182 CB_NSTAGES); | |
| 183 | |
| 184 } else { /* put adaptive part in the beginning */ | |
| 185 | |
| 186 /* create reversed vectors for prediction */ | |
| 187 | |
| 188 for (k = 0; k < diff; k++) { | |
| 189 reverseDecresidual[k] = | |
| 190 decresidual[(start + 1) * SUBL - 1 - | |
| 191 (k + iLBCdec_inst->state_short_len)]; | |
| 192 } | |
| 193 | |
| 194 /* setup memory */ | |
| 195 | |
| 196 meml_gotten = iLBCdec_inst->state_short_len; | |
| 197 for (k = 0; k < meml_gotten; k++) { | |
| 198 mem[CB_MEML - 1 - k] = decresidual[start_pos + k]; | |
| 199 | |
| 200 | |
| 201 | |
| 202 | |
| 203 | |
| 204 } | |
| 205 memset(mem, 0, (CB_MEML - k) * sizeof(float)); | |
| 206 | |
| 207 /* construct decoded vector */ | |
| 208 | |
| 209 iCBConstruct(reverseDecresidual, extra_cb_index, | |
| 210 extra_gain_index, mem + CB_MEML - stMemLTbl, stMemLTbl, | |
| 211 diff, CB_NSTAGES); | |
| 212 | |
| 213 /* get decoded residual from reversed vector */ | |
| 214 | |
| 215 for (k = 0; k < diff; k++) { | |
| 216 decresidual[start_pos - 1 - k] = reverseDecresidual[k]; | |
| 217 } | |
| 218 } | |
| 219 | |
| 220 /* counter for predicted sub-frames */ | |
| 221 | |
| 222 subcount = 0; | |
| 223 | |
| 224 /* forward prediction of sub-frames */ | |
| 225 | |
| 226 Nfor = iLBCdec_inst->nsub - start - 1; | |
| 227 | |
| 228 if (Nfor > 0) { | |
| 229 | |
| 230 /* setup memory */ | |
| 231 | |
| 232 memset(mem, 0, (CB_MEML - STATE_LEN) * sizeof(float)); | |
| 233 memcpy(mem + CB_MEML - STATE_LEN, decresidual + (start - 1) * SUBL, | |
| 234 STATE_LEN * sizeof(float)); | |
| 235 | |
| 236 /* loop over sub-frames to encode */ | |
| 237 | |
| 238 for (subframe = 0; subframe < Nfor; subframe++) { | |
| 239 | |
| 240 /* construct decoded vector */ | |
| 241 | |
| 242 iCBConstruct(&decresidual[(start + 1 + subframe) * SUBL], | |
| 243 cb_index + subcount * CB_NSTAGES, | |
| 244 gain_index + subcount * CB_NSTAGES, | |
| 245 mem + CB_MEML - memLfTbl[subcount], | |
| 246 memLfTbl[subcount], SUBL, CB_NSTAGES); | |
| 247 | |
| 248 /* update memory */ | |
| 249 | |
| 250 memcpy(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(float)); | |
| 251 memcpy(mem + CB_MEML - SUBL, | |
| 252 &decresidual[(start + 1 + subframe) * SUBL], | |
| 253 SUBL * sizeof(float)); | |
| 254 | |
| 255 subcount++; | |
| 256 | |
| 257 } | |
| 258 | |
| 259 } | |
| 260 | |
| 261 /* backward prediction of sub-frames */ | |
| 262 | |
| 263 Nback = start - 1; | |
| 264 | |
| 265 if (Nback > 0) { | |
| 266 | |
| 267 /* setup memory */ | |
| 268 | |
| 269 meml_gotten = SUBL * (iLBCdec_inst->nsub + 1 - start); | |
| 270 | |
| 271 if (meml_gotten > CB_MEML) { | |
| 272 meml_gotten = CB_MEML; | |
| 273 } | |
| 274 for (k = 0; k < meml_gotten; k++) { | |
| 275 mem[CB_MEML - 1 - k] = decresidual[(start - 1) * SUBL + k]; | |
| 276 } | |
| 277 memset(mem, 0, (CB_MEML - k) * sizeof(float)); | |
| 278 | |
| 279 /* loop over subframes to decode */ | |
| 280 | |
| 281 for (subframe = 0; subframe < Nback; subframe++) { | |
| 282 | |
| 283 /* construct decoded vector */ | |
| 284 | |
| 285 iCBConstruct(&reverseDecresidual[subframe * SUBL], | |
| 286 cb_index + subcount * CB_NSTAGES, | |
| 287 gain_index + subcount * CB_NSTAGES, | |
| 288 mem + CB_MEML - memLfTbl[subcount], memLfTbl[subcount], | |
| 289 SUBL, CB_NSTAGES); | |
| 290 | |
| 291 /* update memory */ | |
| 292 | |
| 293 memcpy(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(float)); | |
| 294 memcpy(mem + CB_MEML - SUBL, | |
| 295 &reverseDecresidual[subframe * SUBL], SUBL * sizeof(float)); | |
| 296 | |
| 297 subcount++; | |
| 298 } | |
| 299 | |
| 300 | |
| 301 | |
| 302 | |
| 303 | |
| 304 /* get decoded residual from reversed vector */ | |
| 305 | |
| 306 for (i = 0; i < SUBL * Nback; i++) | |
| 307 decresidual[SUBL * Nback - i - 1] = reverseDecresidual[i]; | |
| 308 } | |
| 309 } | |
| 310 | |
| 311 /*----------------------------------------------------------------* | |
| 312 * main decoder function | |
| 313 *---------------------------------------------------------------*/ | |
| 314 | |
| 315 void iLBC_decode(float *decblock, /* (o) decoded signal block */ | |
| 316 unsigned char *bytes, /* (i) encoded signal bits */ | |
| 317 iLBC_Dec_Inst_t * iLBCdec_inst, /* (i/o) the decoder state | |
| 318 structure */ | |
| 319 int mode /* (i) 0: bad packet, PLC, | |
| 320 1: normal */ | |
| 321 ) | |
| 322 { | |
| 323 float data[BLOCKL_MAX]; | |
| 324 float lsfdeq[LPC_FILTERORDER * LPC_N_MAX]; | |
| 325 float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1]; | |
| 326 float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1]; | |
| 327 int k, i, start, idxForMax, pos, lastpart, ulp; | |
| 328 int lag, ilag; | |
| 329 float cc, maxcc; | |
| 330 int idxVec[STATE_LEN]; | |
| 331 int check; | |
| 332 int gain_index[NASUB_MAX * CB_NSTAGES], extra_gain_index[CB_NSTAGES]; | |
| 333 int cb_index[CB_NSTAGES * NASUB_MAX], extra_cb_index[CB_NSTAGES]; | |
| 334 int lsf_i[LSF_NSPLIT * LPC_N_MAX]; | |
| 335 int state_first; | |
| 336 int last_bit; | |
| 337 unsigned char *pbytes; | |
| 338 float weightdenum[(LPC_FILTERORDER + 1) * NSUB_MAX]; | |
| 339 int order_plus_one; | |
| 340 float syntdenum[NSUB_MAX * (LPC_FILTERORDER + 1)]; | |
| 341 float decresidual[BLOCKL_MAX]; | |
| 342 | |
| 343 if (mode > 0) { /* the data are good */ | |
| 344 | |
| 345 /* decode data */ | |
| 346 | |
| 347 pbytes = bytes; | |
| 348 pos = 0; | |
| 349 | |
| 350 | |
| 351 | |
| 352 | |
| 353 | |
| 354 | |
| 355 /* Set everything to zero before decoding */ | |
| 356 | |
| 357 for (k = 0; k < LSF_NSPLIT * LPC_N_MAX; k++) { | |
| 358 lsf_i[k] = 0; | |
| 359 } | |
| 360 start = 0; | |
| 361 state_first = 0; | |
| 362 idxForMax = 0; | |
| 363 for (k = 0; k < iLBCdec_inst->state_short_len; k++) { | |
| 364 idxVec[k] = 0; | |
| 365 } | |
| 366 for (k = 0; k < CB_NSTAGES; k++) { | |
| 367 extra_cb_index[k] = 0; | |
| 368 } | |
| 369 for (k = 0; k < CB_NSTAGES; k++) { | |
| 370 extra_gain_index[k] = 0; | |
| 371 } | |
| 372 for (i = 0; i < iLBCdec_inst->nasub; i++) { | |
| 373 for (k = 0; k < CB_NSTAGES; k++) { | |
| 374 cb_index[i * CB_NSTAGES + k] = 0; | |
| 375 } | |
| 376 } | |
| 377 for (i = 0; i < iLBCdec_inst->nasub; i++) { | |
| 378 for (k = 0; k < CB_NSTAGES; k++) { | |
| 379 gain_index[i * CB_NSTAGES + k] = 0; | |
| 380 } | |
| 381 } | |
| 382 | |
| 383 /* loop over ULP classes */ | |
| 384 | |
| 385 for (ulp = 0; ulp < 3; ulp++) { | |
| 386 | |
| 387 /* LSF */ | |
| 388 for (k = 0; k < LSF_NSPLIT * iLBCdec_inst->lpc_n; k++) { | |
| 389 unpack(&pbytes, &lastpart, | |
| 390 iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos); | |
| 391 packcombine(&lsf_i[k], lastpart, | |
| 392 iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]); | |
| 393 } | |
| 394 | |
| 395 /* Start block info */ | |
| 396 | |
| 397 unpack(&pbytes, &lastpart, | |
| 398 iLBCdec_inst->ULP_inst->start_bits[ulp], &pos); | |
| 399 packcombine(&start, lastpart, | |
| 400 iLBCdec_inst->ULP_inst->start_bits[ulp]); | |
| 401 | |
| 402 unpack(&pbytes, &lastpart, | |
| 403 iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos); | |
| 404 packcombine(&state_first, lastpart, | |
| 405 iLBCdec_inst->ULP_inst->startfirst_bits[ulp]); | |
| 406 | |
| 407 unpack(&pbytes, &lastpart, | |
| 408 iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos); | |
| 409 packcombine(&idxForMax, lastpart, | |
| 410 iLBCdec_inst->ULP_inst->scale_bits[ulp]); | |
| 411 | |
| 412 for (k = 0; k < iLBCdec_inst->state_short_len; k++) { | |
| 413 unpack(&pbytes, &lastpart, | |
| 414 iLBCdec_inst->ULP_inst->state_bits[ulp], &pos); | |
| 415 packcombine(idxVec + k, lastpart, | |
| 416 iLBCdec_inst->ULP_inst->state_bits[ulp]); | |
| 417 } | |
| 418 | |
| 419 /* 23/22 (20ms/30ms) sample block */ | |
| 420 | |
| 421 for (k = 0; k < CB_NSTAGES; k++) { | |
| 422 unpack(&pbytes, &lastpart, | |
| 423 iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp], &pos); | |
| 424 packcombine(extra_cb_index + k, lastpart, | |
| 425 iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]); | |
| 426 } | |
| 427 for (k = 0; k < CB_NSTAGES; k++) { | |
| 428 unpack(&pbytes, &lastpart, | |
| 429 iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp], &pos); | |
| 430 packcombine(extra_gain_index + k, lastpart, | |
| 431 iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]); | |
| 432 } | |
| 433 | |
| 434 /* The two/four (20ms/30ms) 40 sample sub-blocks */ | |
| 435 | |
| 436 for (i = 0; i < iLBCdec_inst->nasub; i++) { | |
| 437 for (k = 0; k < CB_NSTAGES; k++) { | |
| 438 unpack(&pbytes, &lastpart, | |
| 439 iLBCdec_inst->ULP_inst->cb_index[i][k][ulp], &pos); | |
| 440 packcombine(cb_index + i * CB_NSTAGES + k, lastpart, | |
| 441 iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]); | |
| 442 } | |
| 443 } | |
| 444 | |
| 445 for (i = 0; i < iLBCdec_inst->nasub; i++) { | |
| 446 for (k = 0; k < CB_NSTAGES; k++) { | |
| 447 unpack(&pbytes, &lastpart, | |
| 448 iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp], &pos); | |
| 449 packcombine(gain_index + i * CB_NSTAGES + k, lastpart, | |
| 450 iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]); | |
| 451 } | |
| 452 } | |
| 453 } | |
| 454 /* Extract last bit. If it is 1 this indicates an | |
| 455 empty/lost frame */ | |
| 456 unpack(&pbytes, &last_bit, 1, &pos); | |
| 457 | |
| 458 /* Check for bit errors or empty/lost frames */ | |
| 459 if (start < 1) | |
| 460 mode = 0; | |
| 461 if (iLBCdec_inst->mode == 20 && start > 3) | |
| 462 mode = 0; | |
| 463 if (iLBCdec_inst->mode == 30 && start > 5) | |
| 464 mode = 0; | |
| 465 if (last_bit == 1) | |
| 466 mode = 0; | |
| 467 | |
| 468 if (mode == 1) { /* No bit errors was detected, | |
| 469 continue decoding */ | |
| 470 | |
| 471 /* adjust index */ | |
| 472 index_conv_dec(cb_index); | |
| 473 | |
| 474 /* decode the lsf */ | |
| 475 | |
| 476 SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n); | |
| 477 check = LSF_check(lsfdeq, LPC_FILTERORDER, iLBCdec_inst->lpc_n); | |
| 478 DecoderInterpolateLSF(syntdenum, weightdenum, | |
| 479 lsfdeq, LPC_FILTERORDER, iLBCdec_inst); | |
| 480 | |
| 481 Decode(iLBCdec_inst, decresidual, start, idxForMax, | |
| 482 idxVec, syntdenum, cb_index, gain_index, | |
| 483 extra_cb_index, extra_gain_index, state_first); | |
| 484 | |
| 485 /* preparing the plc for a future loss! */ | |
| 486 | |
| 487 doThePLC(PLCresidual, PLClpc, 0, decresidual, | |
| 488 syntdenum + | |
| 489 (LPC_FILTERORDER + 1) * (iLBCdec_inst->nsub - 1), | |
| 490 (*iLBCdec_inst).last_lag, iLBCdec_inst); | |
| 491 | |
| 492 | |
| 493 | |
| 494 | |
| 495 | |
| 496 | |
| 497 | |
| 498 memcpy(decresidual, PLCresidual, | |
| 499 iLBCdec_inst->blockl * sizeof(float)); | |
| 500 } | |
| 501 | |
| 502 } | |
| 503 | |
| 504 if (mode == 0) { | |
| 505 /* the data is bad (either a PLC call | |
| 506 * was made or a severe bit error was detected) | |
| 507 */ | |
| 508 | |
| 509 /* packet loss conceal */ | |
| 510 | |
| 511 memset(zeros, 0, BLOCKL_MAX * sizeof(float)); | |
| 512 | |
| 513 one[0] = 1; | |
| 514 memset(one + 1, 0, LPC_FILTERORDER * sizeof(float)); | |
| 515 | |
| 516 start = 0; | |
| 517 | |
| 518 doThePLC(PLCresidual, PLClpc, 1, zeros, one, | |
| 519 (*iLBCdec_inst).last_lag, iLBCdec_inst); | |
| 520 memcpy(decresidual, PLCresidual, | |
| 521 iLBCdec_inst->blockl * sizeof(float)); | |
| 522 | |
| 523 order_plus_one = LPC_FILTERORDER + 1; | |
| 524 for (i = 0; i < iLBCdec_inst->nsub; i++) { | |
| 525 memcpy(syntdenum + (i * order_plus_one), PLClpc, | |
| 526 order_plus_one * sizeof(float)); | |
| 527 } | |
| 528 } | |
| 529 | |
| 530 if (iLBCdec_inst->use_enhancer == 1) { | |
| 531 | |
| 532 /* post filtering */ | |
| 533 | |
| 534 iLBCdec_inst->last_lag = | |
| 535 enhancerInterface(data, decresidual, iLBCdec_inst); | |
| 536 | |
| 537 /* synthesis filtering */ | |
| 538 | |
| 539 if (iLBCdec_inst->mode == 20) { | |
| 540 /* Enhancer has 40 samples delay */ | |
| 541 i = 0; | |
| 542 syntFilter(data + i * SUBL, | |
| 543 iLBCdec_inst->old_syntdenum + | |
| 544 (i + iLBCdec_inst->nsub - 1) * (LPC_FILTERORDER + 1), | |
| 545 SUBL, iLBCdec_inst->syntMem); | |
| 546 | |
| 547 | |
| 548 | |
| 549 | |
| 550 | |
| 551 for (i = 1; i < iLBCdec_inst->nsub; i++) { | |
| 552 syntFilter(data + i * SUBL, | |
| 553 syntdenum + (i - 1) * (LPC_FILTERORDER + 1), | |
| 554 SUBL, iLBCdec_inst->syntMem); | |
| 555 } | |
| 556 } else if (iLBCdec_inst->mode == 30) { | |
| 557 /* Enhancer has 80 samples delay */ | |
| 558 for (i = 0; i < 2; i++) { | |
| 559 syntFilter(data + i * SUBL, | |
| 560 iLBCdec_inst->old_syntdenum + | |
| 561 (i + iLBCdec_inst->nsub - 2) * (LPC_FILTERORDER + 1), | |
| 562 SUBL, iLBCdec_inst->syntMem); | |
| 563 } | |
| 564 for (i = 2; i < iLBCdec_inst->nsub; i++) { | |
| 565 syntFilter(data + i * SUBL, | |
| 566 syntdenum + (i - 2) * (LPC_FILTERORDER + 1), SUBL, | |
| 567 iLBCdec_inst->syntMem); | |
| 568 } | |
| 569 } | |
| 570 | |
| 571 } else { | |
| 572 | |
| 573 /* Find last lag */ | |
| 574 lag = 20; | |
| 575 maxcc = xCorrCoef(&decresidual[BLOCKL_MAX - ENH_BLOCKL], | |
| 576 &decresidual[BLOCKL_MAX - ENH_BLOCKL - lag], ENH_BLOCKL); | |
| 577 | |
| 578 for (ilag = 21; ilag < 120; ilag++) { | |
| 579 cc = xCorrCoef(&decresidual[BLOCKL_MAX - ENH_BLOCKL], | |
| 580 &decresidual[BLOCKL_MAX - ENH_BLOCKL - ilag], ENH_BLOCKL); | |
| 581 | |
| 582 if (cc > maxcc) { | |
| 583 maxcc = cc; | |
| 584 lag = ilag; | |
| 585 } | |
| 586 } | |
| 587 iLBCdec_inst->last_lag = lag; | |
| 588 | |
| 589 /* copy data and run synthesis filter */ | |
| 590 | |
| 591 memcpy(data, decresidual, iLBCdec_inst->blockl * sizeof(float)); | |
| 592 for (i = 0; i < iLBCdec_inst->nsub; i++) { | |
| 593 syntFilter(data + i * SUBL, | |
| 594 syntdenum + i * (LPC_FILTERORDER + 1), SUBL, | |
| 595 iLBCdec_inst->syntMem); | |
| 596 } | |
| 597 | |
| 598 | |
| 599 | |
| 600 | |
| 601 | |
| 602 } | |
| 603 | |
| 604 /* high pass filtering on output if desired, otherwise | |
| 605 copy to out */ | |
| 606 | |
| 607 hpOutput(data, iLBCdec_inst->blockl, decblock, iLBCdec_inst->hpomem); | |
| 608 | |
| 609 /* memcpy(decblock,data,iLBCdec_inst->blockl*sizeof(float)); */ | |
| 610 | |
| 611 memcpy(iLBCdec_inst->old_syntdenum, syntdenum, | |
| 612 iLBCdec_inst->nsub * (LPC_FILTERORDER + 1) * sizeof(float)); | |
| 613 | |
| 614 iLBCdec_inst->prev_enh_pl = 0; | |
| 615 | |
| 616 if (mode == 0) { /* PLC was used */ | |
| 617 iLBCdec_inst->prev_enh_pl = 1; | |
| 618 } | |
| 619 } |
