Converted leak spectral estimation array to int32.
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 19 Dec 2005 10:28:57 +0000 (10:28 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 19 Dec 2005 10:28:57 +0000 (10:28 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@10649 0101bb08-14d6-0310-b084-bc0e0c8e3800

include/speex/speex_echo.h
include/speex/speex_preprocess.h
libspeex/mdf.c
libspeex/preprocess.c
libspeex/pseudofloat.h

index 6d6c882..9a13d75 100644 (file)
@@ -34,6 +34,8 @@
 #ifndef SPEEX_ECHO_H
 #define SPEEX_ECHO_H
 
+#include "misc.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -50,7 +52,7 @@ SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length);
 void speex_echo_state_destroy(SpeexEchoState *st);
 
 /** Performs echo cancellation a frame */
-void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out, float *Y);
+void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out, spx_int32_t *Y);
 
 /** Reset the echo canceller state */
 void speex_echo_state_reset(SpeexEchoState *st);
index 0d20a4d..5bb3a2c 100644 (file)
@@ -113,10 +113,10 @@ SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_r
 void speex_preprocess_state_destroy(SpeexPreprocessState *st);
 
 /** Preprocess a frame */
-int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, float *echo);
+int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo);
 
 /** Preprocess a frame */
-void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x, float *echo);
+void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo);
 
 /** Used like the ioctl function to control the preprocessor parameters */
 int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr);
index dc6e44c..5563ccc 100644 (file)
@@ -312,7 +312,7 @@ void speex_echo_state_destroy(SpeexEchoState *st)
 
 extern int fixed_point;
 /** Performs echo cancellation on a frame */
-void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out, float *Yout)
+void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out, spx_int32_t *Yout)
 {
    int i,j;
    int N,M;
@@ -573,6 +573,7 @@ void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out,
    /* Compute spectrum of estimated echo for use in an echo post-filter (if necessary)*/
    if (Yout)
    {
+      spx_word16_t leak2;
       if (st->adapted)
       {
          /* If the filter is adapted, take the filtered echo */
@@ -594,9 +595,20 @@ void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out,
       spx_fft(st->fft_table, st->y, st->Y);
       power_spectrum(st->Y, st->Yps, N);
       
+#ifdef FIXED_POINT
+      if (leak_estimate > 16383)
+         leak2 = 32767;
+      else
+         leak2 = SHL16(leak_estimate, 1);
+#else
+      if (leak_estimate>.5)
+         leak2 = 1;
+      else
+         leak2 = 2*leak_estimate;
+#endif
       /* Estimate residual echo */
       for (i=0;i<=st->frame_size;i++)
-         Yout[i] = N*N*max(.2,3.f*leak_estimate)*st->Yps[i];
+         Yout[i] = MULT16_32_Q15(leak2,st->Yps[i]);
    }
 }
 
index bf402ed..826a676 100644 (file)
@@ -280,7 +280,7 @@ void speex_preprocess_state_destroy(SpeexPreprocessState *st)
    speex_free(st);
 }
 
-static void update_noise(SpeexPreprocessState *st, float *ps, float *echo)
+static void update_noise(SpeexPreprocessState *st, float *ps, spx_int32_t *echo)
 {
    int i;
    float beta;
@@ -295,7 +295,7 @@ static void update_noise(SpeexPreprocessState *st, float *ps, float *echo)
          st->noise[i] = (1.f-beta)*st->noise[i] + beta*ps[i];
    } else {
       for (i=0;i<st->ps_size;i++)
-         st->noise[i] = (1.f-beta)*st->noise[i] + beta*max(1.f,ps[i]-echo[i]); 
+         st->noise[i] = (1.f-beta)*st->noise[i] + beta*max(1.f,ps[i]-st->frame_size*st->frame_size*4.0*echo[i]); 
 #if 0
       for (i=0;i<st->ps_size;i++)
          st->noise[i] = 0;
@@ -632,7 +632,7 @@ static void update_noise_prob(SpeexPreprocessState *st)
 
 #define NOISE_OVERCOMPENS 1.4
 
-int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, float *echo)
+int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo)
 {
    int i;
    int is_speech=1;
@@ -660,7 +660,7 @@ int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, float *echo)
    /* Deal with residual echo if provided */
    if (echo)
       for (i=1;i<N;i++)
-         st->echo_noise[i] = (.3f*st->echo_noise[i] + echo[i]);
+         st->echo_noise[i] = (.3f*st->echo_noise[i] + st->frame_size*st->frame_size*4.0*echo[i]);
 
    /* Compute a posteriori SNR */
    for (i=1;i<N;i++)
@@ -747,7 +747,7 @@ int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, float *echo)
          if (st->update_prob[i]<.5f/* || st->ps[i] < st->noise[i]*/)
          {
             if (echo)
-               st->noise[i] = .95f*st->noise[i] + .05f*max(1.0f,st->ps[i]-echo[i]);
+               st->noise[i] = .95f*st->noise[i] + .05f*max(1.0f,st->ps[i]-st->frame_size*st->frame_size*4.0*echo[i]);
             else
                st->noise[i] = .95f*st->noise[i] + .05f*st->ps[i];
          }
@@ -901,7 +901,7 @@ int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, float *echo)
    return is_speech;
 }
 
-void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x, float *echo)
+void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo)
 {
    int i;
    int N = st->ps_size;
@@ -920,7 +920,7 @@ void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x,
       if (st->update_prob[i]<.5f || st->ps[i] < st->noise[i])
       {
          if (echo)
-            st->noise[i] = .95f*st->noise[i] + .1f*max(1.0f,st->ps[i]-echo[i]);
+            st->noise[i] = .95f*st->noise[i] + .1f*max(1.0f,st->ps[i]-st->frame_size*st->frame_size*4.0*echo[i]);
          else
             st->noise[i] = .95f*st->noise[i] + .1f*st->ps[i];
       }
index 4a665a7..b86d892 100644 (file)
@@ -50,7 +50,7 @@ typedef struct {
 #define FLOAT_HALF ((spx_float_t){16384,-15})
 
 #define MIN(a,b) ((a)<(b)?(a):(b))
-static inline spx_float_t PSEUDOFLOAT(float x)
+static inline spx_float_t PSEUDOFLOAT(spx_int32_t x)
 {
    int e=0;
    int sign=0;
@@ -63,14 +63,14 @@ static inline spx_float_t PSEUDOFLOAT(float x)
       return (spx_float_t) {0,0};
    while (x>32767)
    {
-      /*x >>= 1;*/
-      x *= .5;
+      x >>= 1;
+      /*x *= .5;*/
       e++;
    }
    while (x<16383)
    {
-      /*x <<= 1;*/
-      x *= 2;
+      x <<= 1;
+      /*x *= 2;*/
       e--;
    }
    if (sign)