fixed-point: Think I got rid of all overflows I could find
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 30 Nov 2003 07:11:36 +0000 (07:11 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 30 Nov 2003 07:11:36 +0000 (07:11 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5655 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters.c
libspeex/sb_celp.c

index 8bdd057..dbcd943 100644 (file)
@@ -365,22 +365,22 @@ void qmf_decomp(short *xx, spx_word16_t *aa, spx_sig_t *y1, spx_sig_t *y2, int N
    for (i=0;i<M-1;i++)
       x[i]=mem[M-i-2];
    for (i=0;i<N;i++)
-      x[i+M-1]=PSHR(xx[i],1);
+      x[i+M-1]=SATURATE(PSHR(xx[i],1),16383);
    for (i=0,k=0;i<N;i+=2,k++)
    {
       y1[k]=0;
       y2[k]=0;
       for (j=0;j<M2;j++)
       {
-         y1[k]+=SHR(MULT16_16(a[j],(x[i+j]+x2[i-j])),1);
-         y2[k]-=SHR(MULT16_16(a[j],(x[i+j]-x2[i-j])),1);
+         y1[k]+=SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1);
+         y2[k]-=SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1);
          j++;
-         y1[k]+=SHR(MULT16_16(a[j],(x[i+j]+x2[i-j])),1);
-         y2[k]+=SHR(MULT16_16(a[j],(x[i+j]-x2[i-j])),1);
+         y1[k]+=SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1);
+         y2[k]+=SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1);
       }
    }
    for (i=0;i<M-1;i++)
-     mem[i]=PSHR(xx[N-i-1],1);
+     mem[i]=SATURATE(PSHR(xx[N-i-1],1),16383);
 }
 
 
index 6bd0d45..01c263c 100644 (file)
@@ -307,12 +307,11 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
       for (i=0;i<st->frame_size;i++)
          st->x0d[i] = SHL(low[i],SIG_SHIFT);
    }
-
    /* High-band buffering / sync with low band */
    for (i=0;i<st->windowSize-st->frame_size;i++)
       st->high[i] = st->high[st->frame_size+i];
    for (i=0;i<st->frame_size;i++)
-      st->high[st->windowSize-st->frame_size+i]=st->x1d[i];
+      st->high[st->windowSize-st->frame_size+i]=SATURATE(st->x1d[i],536854528);
 
    speex_move(st->excBuf, st->excBuf+st->frame_size, (st->bufSize-st->frame_size)*sizeof(spx_sig_t));
 
@@ -343,6 +342,7 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
    }
 
    st->autocorr[0] = (spx_word16_t)(st->autocorr[0]*st->lpc_floor); /* Noise floor in auto-correlation domain */
+
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
       st->autocorr[i] = MULT16_16_Q14(st->autocorr[i],st->lagWindow[i]);