Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2016-07-25 17:23:07 +0300
committerJean-Marc Valin <jmvalin@jmvalin.ca>2016-07-25 17:23:07 +0300
commitee44ff86c6ae55eb5c4b568b3822c9b280514c53 (patch)
tree5992f29d91e50865ff2606a0bad7f950d2dc1678
parent76596ad93a7869e6b877dc44cefda45cde1b3e8b (diff)
Move PLC LPC bandwidth expansion before the FIR to avoid overflows in celt_fir()
-rw-r--r--celt/celt_decoder.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/celt/celt_decoder.c b/celt/celt_decoder.c
index 20ededff..90fee158 100644
--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -567,6 +567,23 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
#endif
}
_celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER);
+#ifdef FIXED_POINT
+ /* For fixed-point, apply bandwidth expansion until we can guarantee that
+ no overflow can happen in the IIR filter. This means:
+ 32768*sum(abs(filter)) < 2^31 */
+ while (1) {
+ opus_val16 tmp=Q15ONE;
+ opus_val32 sum=QCONST16(1., SIG_SHIFT);
+ for (i=0;i<LPC_ORDER;i++)
+ sum += ABS16(lpc[c*LPC_ORDER+i]);
+ if (sum < 65535) break;
+ for (i=0;i<LPC_ORDER;i++)
+ {
+ tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
+ lpc[c*LPC_ORDER+i] = MULT16_16_Q15(lpc[c*LPC_ORDER+i], tmp);
+ }
+ }
+#endif
}
/* We want the excitation for 2 pitch periods in order to look for a
decaying signal, but we can't get more than MAX_PERIOD. */
@@ -638,23 +655,6 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
SIG_SHIFT);
S1 += SHR32(MULT16_16(tmp, tmp), 10);
}
-#ifdef FIXED_POINT
- /* For fixed-point, apply bandwidth expansion until we can guarantee that
- no overflow can happen in the IIR filter. This means:
- 32768*sum(abs(filter)) < 2^31 */
- while (1) {
- opus_val16 tmp=Q15ONE;
- opus_val32 sum=QCONST16(1., SIG_SHIFT);
- for (i=0;i<LPC_ORDER;i++)
- sum += ABS16(lpc[c*LPC_ORDER+i]);
- if (sum < 65535) break;
- for (i=0;i<LPC_ORDER;i++)
- {
- tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
- lpc[c*LPC_ORDER+i] = MULT16_16_Q15(lpc[c*LPC_ORDER+i], tmp);
- }
- }
-#endif
{
opus_val16 lpc_mem[LPC_ORDER];
/* Copy the last decoded samples (prior to the overlap region) to