Fixes a denorm problem when the input goes silent after active audio
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 12 Jul 2013 05:22:09 +0000 (01:22 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Fri, 12 Jul 2013 05:22:09 +0000 (01:22 -0400)
celt/arch.h
celt/celt_decoder.c
src/opus_encoder.c

index feab0fa..e497a4d 100644 (file)
@@ -100,6 +100,7 @@ typedef opus_val32 celt_ener;
 #define DB_SHIFT 10
 
 #define EPSILON 1
+#define VERY_SMALL 0
 #define VERY_LARGE16 ((opus_val16)32767)
 #define Q15_ONE ((opus_val16)32767)
 
@@ -140,6 +141,7 @@ typedef float celt_ener;
 #define NORM_SCALING 1.f
 
 #define EPSILON 1e-15f
+#define VERY_SMALL 1e-30f
 #define VERY_LARGE16 1e15f
 #define Q15_ONE ((opus_val16)1.f)
 
index 01f2868..4424b97 100644 (file)
@@ -236,7 +236,7 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
          /* Shortcut for the standard (non-custom modes) case */
          for (j=0;j<N;j++)
          {
-            celt_sig tmp = x[j] + m;
+            celt_sig tmp = x[j] + m + VERY_SMALL;
             m = MULT16_32_Q15(coef0, tmp);
             y[j*C] = SCALEOUT(SIG2WORD16(tmp));
          }
index cb7159c..5c74535 100644 (file)
@@ -429,10 +429,10 @@ static void dc_reject(const opus_val16 *in, opus_int32 cutoff_Hz, opus_val16 *ou
          x = in[channels*i+c];
          /* First stage */
          tmp = x-hp_mem[2*c];
-         hp_mem[2*c] = hp_mem[2*c] + coef*(x - hp_mem[2*c]);
+         hp_mem[2*c] = hp_mem[2*c] + coef*(x - hp_mem[2*c]) + VERY_SMALL;
          /* Second stage */
          y = tmp - hp_mem[2*c+1];
-         hp_mem[2*c+1] = hp_mem[2*c+1] + coef*(tmp - hp_mem[2*c+1]);
+         hp_mem[2*c+1] = hp_mem[2*c+1] + coef*(tmp - hp_mem[2*c+1]) + VERY_SMALL;
          out[channels*i+c] = y;
       }
    }