fixed-point: converted lsp_enforce_margin, some assembly ARM optimizations
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 10 Nov 2003 08:57:27 +0000 (08:57 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Mon, 10 Nov 2003 08:57:27 +0000 (08:57 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5548 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/filters.c
libspeex/lsp.c
libspeex/misc.h
libspeex/nb_celp.c

index 4e7131a..d85b4ee 100644 (file)
@@ -181,9 +181,9 @@ void filter_mem2(spx_sig_t *x, spx_coef_t *num, spx_coef_t *den, spx_sig_t *y, i
       xh = xi>>15; xl=xi&0x00007fff; yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = SUB32(ADD32(mem[j+1],  MUL_16_32_R15(num[j+1],xh,xl)), MUL_16_32_R15(den[j+1],yh,yl));
+         mem[j] = SUB32(ADD32(mem[j+1],  MULT16_32_Q15(num[j+1],xi)), MULT16_32_Q15(den[j+1],yi));
       }
-      mem[ord-1] = SUB32(MUL_16_32_R15(num[ord],xh,xl), MUL_16_32_R15(den[ord],yh,yl));
+      mem[ord-1] = SUB32(MULT16_32_Q15(num[ord],xi), MULT16_32_Q15(den[ord],yi));
       y[i] = yi;
    }
 }
@@ -201,9 +201,9 @@ void iir_mem2(spx_sig_t *x, spx_coef_t *den, spx_sig_t *y, int N, int ord, spx_m
       yh = yi>>15; yl=yi&0x00007fff; 
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = SUB32(mem[j+1], MUL_16_32_R15(den[j+1],yh,yl));
+         mem[j] = SUB32(mem[j+1], MULT16_32_Q15(den[j+1],yi));
       }
-      mem[ord-1] = - MUL_16_32_R15(den[ord],yh,yl);
+      mem[ord-1] = - MULT16_32_Q15(den[ord],yi);
       y[i] = yi;
    }
 }
@@ -222,9 +222,9 @@ void fir_mem2(spx_sig_t *x, spx_coef_t *num, spx_sig_t *y, int N, int ord, spx_m
       xh = xi>>15; xl=xi&0x00007fff;
       for (j=0;j<ord-1;j++)
       {
-         mem[j] = ADD32(mem[j+1], MUL_16_32_R15(num[j+1],xh,xl));
+         mem[j] = ADD32(mem[j+1], MULT16_32_Q15(num[j+1],xi));
       }
-      mem[ord-1] = MUL_16_32_R15(num[ord],xh,xl);
+      mem[ord-1] = MULT16_32_Q15(num[ord],xi);
       y[i] = yi;
    }
 
index a909efd..3597ec5 100644 (file)
@@ -506,27 +506,30 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
 }
 #endif
 
-/*Added by JMV
-  Makes sure the LSPs are stable*/
+
+#ifdef FIXED_POINT
+
+/*Makes sure the LSPs are stable*/
 void lsp_enforce_margin(spx_lsp_t *lsp, int len, float margin)
 {
    int i;
-   if (lsp[0]<LSP_SCALING*margin)
-      lsp[0]=LSP_SCALING*margin;
-   if (lsp[len-1]>LSP_SCALING*(M_PI-margin))
-      lsp[len-1]=LSP_SCALING*(M_PI-margin);
+   spx_word16_t m = LSP_SCALING*margin;
+   spx_word16_t m2 = (LSP_SCALING*M_PI)-LSP_SCALING*margin;
+  
+   if (lsp[0]<m)
+      lsp[0]=m;
+   if (lsp[len-1]>m2)
+      lsp[len-1]=m2;
    for (i=1;i<len-1;i++)
    {
-      if (lsp[i]<lsp[i-1]+LSP_SCALING*margin)
-         lsp[i]=lsp[i-1]+LSP_SCALING*margin;
+      if (lsp[i]<lsp[i-1]+m)
+         lsp[i]=lsp[i-1]+m;
 
-      if (lsp[i]>lsp[i+1]-LSP_SCALING*margin)
-         lsp[i]= .5* (lsp[i] + lsp[i+1]-LSP_SCALING*margin);
+      if (lsp[i]>lsp[i+1]-m)
+         lsp[i]= SHR(lsp[i],1) + SHR(lsp[i+1]-m,1);
    }
 }
 
-#ifdef FIXED_POINT
-
 
 void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_lsp, int len, int subframe, int nb_subframes)
 {
@@ -541,6 +544,25 @@ void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_l
 
 #else
 
+/*Makes sure the LSPs are stable*/
+void lsp_enforce_margin(spx_lsp_t *lsp, int len, float margin)
+{
+   int i;
+   if (lsp[0]<LSP_SCALING*margin)
+      lsp[0]=LSP_SCALING*margin;
+   if (lsp[len-1]>LSP_SCALING*(M_PI-margin))
+      lsp[len-1]=LSP_SCALING*(M_PI-margin);
+   for (i=1;i<len-1;i++)
+   {
+      if (lsp[i]<lsp[i-1]+LSP_SCALING*margin)
+         lsp[i]=lsp[i-1]+LSP_SCALING*margin;
+
+      if (lsp[i]>lsp[i+1]-LSP_SCALING*margin)
+         lsp[i]= .5* (lsp[i] + lsp[i+1]-LSP_SCALING*margin);
+   }
+}
+
+
 void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_lsp, int len, int subframe, int nb_subframes)
 {
    int i;
index 24d2b2b..20d06d5 100644 (file)
@@ -48,7 +48,7 @@ typedef spx_word16_t spx_coef_t;
 typedef spx_word16_t spx_lsp_t;
 typedef spx_word32_t spx_sig_t;
 
-#define LPC_SCALING  8192.
+#define LPC_SCALING  8192
 #define SIG_SCALING  16384
 #define LSP_SCALING  8192.
 
@@ -109,9 +109,22 @@ static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
 #endif
 
 #define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
+#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),11))
 #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13))
 #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+
+#ifdef ARM_ASM
+static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
+  int res;
+  asm volatile("smulwb  %0,%1,%2;\n"
+              : "=&r"(res)
+               : "%r"(y<<1),"r"(x));
+  return(res);
+}
+
+#else
 #define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
+#endif
 
 #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
 #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
index b666f91..d0033ab 100644 (file)
@@ -194,7 +194,7 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
    int i, sub, roots;
    int ol_pitch;
    float ol_pitch_coef;
-   float ol_gain;
+   spx_word32_t ol_gain;
    spx_sig_t *res, *target;
    spx_mem_t *mem;
    char *stack;
@@ -270,8 +270,7 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
          for (i=0;i<st->lpcSize;i++)
             st->interp_lsp[i] = st->lsp[i];
       else
-         for (i=0;i<st->lpcSize;i++)
-            st->interp_lsp[i] = .375*st->old_lsp[i] + .625*st->lsp[i];
+         lsp_interpolate(st->old_lsp, st->lsp, st->interp_lsp, st->lpcSize, st->nbSubframes, st->nbSubframes<<1);
 
       lsp_enforce_margin(st->interp_lsp, st->lpcSize, .002);