a few checks just to be on the same (>0) side.
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 11 Nov 2006 03:48:23 +0000 (03:48 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 11 Nov 2006 03:48:23 +0000 (03:48 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@12083 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/mdf.c
libspeex/preprocess.c

index a9e2ee8..8d16f76 100644 (file)
@@ -666,10 +666,23 @@ void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *in, const sp
    /* Compute a bunch of correlations */
    Sey = mdf_inner_prod(st->e+st->frame_size, st->y+st->frame_size, st->frame_size);
    See = mdf_inner_prod(st->e+st->frame_size, st->e+st->frame_size, st->frame_size);
-   See = ADD32(See, SHR32(MULT16_16(N, 100),6));
+   See = MAX32(See, SHR32(MULT16_16(N, 100),6));
    Syy = mdf_inner_prod(st->y+st->frame_size, st->y+st->frame_size, st->frame_size);
    Sxx = mdf_inner_prod(st->x+st->frame_size, st->x+st->frame_size, st->frame_size);
 
+   /* Just in case something went really wrong */
+#ifdef FIXED_POINT
+   if (Syy<0)
+   {
+      speex_warning_int ("Syy is negative: ", Syy);
+      Syy = 0;
+   }
+   if (Sxx<0)
+   {
+      speex_warning_int ("Sxx is negative: ", Sxx);
+      Sxx = 0;
+   }
+#endif
    /* Convert error to frequency domain */
    spx_fft(st->fft_table, st->e, st->E);
    for (i=0;i<st->frame_size;i++)
index 143aa50..bddfd57 100644 (file)
@@ -760,7 +760,7 @@ int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x)
    for (i=0;i<N;i++)
    {
       if (!st->update_prob[i] || st->ps[i] < PSHR32(st->noise[i], NOISE_SHIFT))
-         st->noise[i] = MULT16_32_Q15(beta_1,st->noise[i]) + MULT16_32_Q15(beta,SHL32(st->ps[i],NOISE_SHIFT));
+         st->noise[i] = MAX32(EXTEND32(0),MULT16_32_Q15(beta_1,st->noise[i]) + MULT16_32_Q15(beta,SHL32(st->ps[i],NOISE_SHIFT)));
    }
    filterbank_compute_bank32(st->bank, st->noise, st->noise+N);