FLOAT_DIVU for computing leak estimate
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 17 Dec 2005 12:54:33 +0000 (12:54 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 17 Dec 2005 12:54:33 +0000 (12:54 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@10621 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/mdf.c
libspeex/pseudofloat.h

index e0c3126..c08b73e 100644 (file)
@@ -437,7 +437,7 @@ void speex_echo_cancel(SpeexEchoState *st, short *ref, short *echo, short *out,
       st->Pey = FLOAT_MULT(MIN_LEAK,st->Pyy);
    if (FLOAT_GT(st->Pey, st->Pyy))
       st->Pey = st->Pyy;
-   leak_estimate = REALFLOAT(st->Pey) / (1+REALFLOAT(st->Pyy));
+   leak_estimate = REALFLOAT(FLOAT_DIVU(st->Pey, st->Pyy));
 #else
    alpha = .05*Syy / (SHR(10000,6)+See);
    if (alpha > .008)
index 5ae8117..0379cf4 100644 (file)
@@ -139,9 +139,7 @@ static inline int FLOAT_LT(spx_float_t a, spx_float_t b)
    if (a.m==0)
       return b.m<0;
    else if (b.m==0)
-      return a.m>0;
-   spx_float_t r = (a).e > (b).e ? (spx_float_t) {((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)),(a).e+1} : (spx_float_t) {((b).m>>1) - ((a).m>>MIN(15,(b).e-(a).e+1)),(b).e+1};
-   
+      return a.m>0;   
    if ((a).e > (b).e)
       return ((a).m>>1) < ((b).m>>MIN(15,(a).e-(b).e+1));
    else 
@@ -282,6 +280,20 @@ static inline spx_float_t FLOAT_DIV32(spx_word32_t a, spx_word32_t b)
    return (spx_float_t) {DIV32_16(a,b),e};
 }
 
+static inline spx_float_t FLOAT_DIVU(spx_float_t a, spx_float_t b)
+{
+   int e=0;
+   spx_int32_t num;
+   num = a.m;
+   while (a.m >= b.m)
+   {
+      e++;
+      a.m >>= 1;
+   }
+   num = num << (15-e);
+   return (spx_float_t) {DIV32_16(num,b.m),a.e-b.e-15+e};
+}
+
 #else
 
 #define spx_float_t float