Analysis scaling fixes
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 9 Sep 2013 20:39:19 +0000 (16:39 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 9 Sep 2013 20:39:19 +0000 (16:39 -0400)
This should make the scaling the same for fixed and float. It changes the float
scaling too by normalizing by the number of channels, which matters for
bandwidth detection.

celt/celt_encoder.c
src/analysis.c
src/opus_encoder.c

index a63e961..308f29f 100644 (file)
@@ -822,7 +822,7 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
 #ifndef DISABLE_FLOAT_API
    if (analysis->valid)
    {
-      trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), 2*(analysis->tonality_slope+.05f)));
+      trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)));
    }
 #endif
 
index 6a1840b..b79e869 100644 (file)
@@ -347,7 +347,7 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
           tonal->highE[b]+=.5f;
           tonal->lowE[b]-=.5f;
        }
-       relativeE += (logE[b]-tonal->lowE[b])/(EPSILON+tonal->highE[b]-tonal->lowE[b]);
+       relativeE += (logE[b]-tonal->lowE[b])/(1e-15+tonal->highE[b]-tonal->lowE[b]);
 
        L1=L2=0;
        for (i=0;i<NB_FRAMES;i++)
@@ -356,12 +356,12 @@ void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, con
           L2 += tonal->E[i][b];
        }
 
-       stationarity = MIN16(0.99f,L1/sqrt(EPSILON+NB_FRAMES*L2));
+       stationarity = MIN16(0.99f,L1/sqrt(1e-15+NB_FRAMES*L2));
        stationarity *= stationarity;
        stationarity *= stationarity;
        frame_stationarity += stationarity;
        /*band_tonality[b] = tE/(1e-15+E)*/;
-       band_tonality[b] = MAX16(tE/(EPSILON+E), stationarity*tonal->prev_band_tonality[b]);
+       band_tonality[b] = MAX16(tE/(1e-15+E), stationarity*tonal->prev_band_tonality[b]);
 #if 0
        if (b>=NB_TONAL_SKIP_BANDS)
        {
index 27b7143..1dfd9be 100644 (file)
@@ -762,6 +762,7 @@ int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
 void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C)
 {
    const float *x;
+   opus_val32 scale;
    int j;
    x = (const float *)_x;
    for (j=0;j<subframe;j++)
@@ -780,22 +781,23 @@ void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, in
       }
    }
 #ifdef FIXED_POINT
-   {
-      opus_val32 scale =(1<<SIG_SHIFT);
-      if (C==-2)
-         scale /= C;
-      else
-         scale /= 2;
-      for (j=0;j<subframe;j++)
-         sub[j] *= scale;
-   }
+   scale = (1<<SIG_SHIFT);
+#else
+   scale = 1.f;
 #endif
+   if (C==-2)
+      scale /= C;
+   else
+      scale /= 2;
+   for (j=0;j<subframe;j++)
+      sub[j] *= scale;
 }
 #endif
 
 void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C)
 {
    const opus_int16 *x;
+   opus_val32 scale;
    int j;
    x = (const opus_int16 *)_x;
    for (j=0;j<subframe;j++)
@@ -814,19 +816,16 @@ void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int
       }
    }
 #ifdef FIXED_POINT
-   {
-      opus_val32 scale =(1<<SIG_SHIFT);
-      if (C==-2)
-         scale /= C;
-      else
-         scale /= 2;
-      for (j=0;j<subframe;j++)
-         sub[j] *= scale;
-   }
+   scale = (1<<SIG_SHIFT);
 #else
-   for (j=0;j<subframe;j++)
-      sub[j] *= (1.f/32768);
+   scale = 1.f/32768;
 #endif
+   if (C==-2)
+      scale /= C;
+   else
+      scale /= 2;
+   for (j=0;j<subframe;j++)
+      sub[j] *= scale;
 }
 
 opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs)