put all fixed-point macros in a separate file (arch.h), some cleanup with
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Nov 2003 17:16:38 +0000 (17:16 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 12 Nov 2003 17:16:38 +0000 (17:16 +0000)
wideband excitation gain

git-svn-id: http://svn.xiph.org/trunk/speex@5568 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/Makefile.am
libspeex/arch.h [new file with mode: 0644]
libspeex/cb_search.c
libspeex/lsp.c
libspeex/misc.h
libspeex/sb_celp.c

index 7f30091..aabb1a9 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in. -*-Makefile-*-
 
-# $Id: Makefile.am,v 1.54 2003/09/16 17:50:45 jm Exp $
+# $Id: Makefile.am,v 1.55 2003/11/12 17:16:38 jm Exp $
 
 # Disable automatic dependency tracking if using other tools than gcc and gmake
 #AUTOMAKE_OPTIONS = no-dependencies
@@ -69,7 +69,8 @@ noinst_HEADERS = lsp.h \
        ltp_sse.h \
        filters_sse.h \
        math_approx.h \
-       smallft.h
+       smallft.h \
+       arch.h
        
        
 libspeex_la_LDFLAGS = -version-info @SPEEX_LT_CURRENT@:@SPEEX_LT_REVISION@:@SPEEX_LT_AGE@
diff --git a/libspeex/arch.h b/libspeex/arch.h
new file mode 100644 (file)
index 0000000..fcd106a
--- /dev/null
@@ -0,0 +1,217 @@
+/* Copyright (C) 2003 Jean-Marc Valin */
+/**
+   @file arch.h
+   @brief Various architecture definitions Speex
+*/
+/*
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef ARCH_H
+#define ARCH_H
+
+#ifdef FIXED_POINT
+
+typedef signed short spx_word16_t;
+typedef signed int   spx_word32_t;
+typedef long long    spx_word64_t;
+typedef spx_word32_t spx_mem_t;
+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 SIG_SCALING  16384
+#define LSP_SCALING  8192.
+
+#define LPC_SHIFT    13
+#define SIG_SHIFT    14
+
+#define VERY_SMALL 0
+
+#ifdef COUNT_MIPS
+extern long long spx_mips;
+#define MIPS_INC spx_mips++,
+#else
+#define MIPS_INC
+#endif
+
+#define SHR(a,shift) ((a) >> (shift))
+#define SHL(a,shift) ((a) << (shift))
+
+
+#define ADD16(a,b) (MIPS_INC(short)((short)(a)+(short)(b)))
+#define SUB16(a,b) (MIPS_INC(a)-(b))
+#define ADD32(a,b) (MIPS_INC(a)+(b))
+#define SUB32(a,b) (MIPS_INC(a)-(b))
+#define ADD64(a,b) (MIPS_INC(a)+(b))
+
+#define PSHR(a,shift) (SHR((a)+(1<<((shift)-1)),shift))
+
+/* result fits in 16 bits */
+#define MULT16_16_16(a,b)     (MIPS_INC(short)(((short)(a))*((short)(b))))
+/* Kludge: just making sure results are on 32 bits */
+#ifdef ARM_ASM
+static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
+  int res;
+  asm volatile("smulbb  %0,%1,%2;\n"
+              : "=&r"(res)
+              : "%r"(x),"r"(y));
+  return(MIPS_INC res);
+}
+#else
+#define MULT16_16(a,b)     (MIPS_INC((short)(a))*((short)(b)))
+#endif
+
+
+
+#ifdef ARM_ASM
+
+static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+  int res;
+  asm volatile("smlabb  %0,%1,%2,%3;\n"
+              : "=&r"(res)
+               : "%r"(x),"r"(y),"r"(a));
+  return(MIPS_INC res);
+}
+
+#else
+
+#define MAC16_16(c,a,b)     (ADD32((c),MULT16_16((a),(b))))
+
+#endif
+
+#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12))
+#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(MIPS_INC res);
+}
+static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+  int res;
+  asm volatile("smlawb  %0,%1,%2,%3;\n"
+              : "=&r"(res)
+               : "%r"(y<<1),"r"(x),"r"(a));
+  return(MIPS_INC res);
+}
+static inline spx_word32_t MULT16_32_Q11(spx_word16_t x, spx_word32_t y) {
+  int res;
+  asm volatile("smulwb  %0,%1,%2;\n"
+              : "=&r"(res)
+               : "%r"(y<<5),"r"(x));
+  return(MIPS_INC res);
+}
+static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
+  int res;
+  asm volatile("smlawb  %0,%1,%2,%3;\n"
+              : "=&r"(res)
+               : "%r"(y<<5),"r"(x),"r"(a));
+  return(MIPS_INC res);
+}
+
+#else
+#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
+#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)))
+
+#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
+#define MAC16_32_Q15(c,a,b) ADD32(c,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))
+#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
+
+#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13))
+#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14))
+#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
+
+#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
+
+
+
+#define DIV32_16(a,b) ((short)(((signed int)(a))/((short)(b))))
+#define DIV32(a,b) (((signed int)(a))/((signed int)(b)))
+
+#else
+
+typedef float spx_mem_t;
+typedef float spx_coef_t;
+typedef float spx_lsp_t;
+typedef float spx_sig_t;
+typedef float spx_word16_t;
+typedef float spx_word32_t;
+typedef float spx_word64_t;
+
+#define LPC_SCALING  1.
+#define SIG_SCALING  1.
+#define LSP_SCALING  1.
+
+#define LPC_SHIFT    0
+#define SIG_SHIFT    0
+
+#define VERY_SMALL 1e-30
+
+#define PSHR(a,shift)       (a)
+#define SHR(a,shift)       (a)
+#define SHL(a,shift)       (a)
+#define ADD16(a,b) ((a)+(b))
+#define SUB16(a,b) ((a)-(b))
+#define ADD32(a,b) ((a)+(b))
+#define SUB32(a,b) ((a)-(b))
+#define ADD64(a,b) ((a)+(b))
+#define MULT16_16_16(a,b)     ((a)*(b))
+#define MULT16_16(a,b)     ((a)*(b))
+#define MAC16_16(c,a,b)     ((c)+(a)*(b))
+
+#define MULT16_32_Q11(a,b)     ((a)*(b))
+#define MULT16_32_Q13(a,b)     ((a)*(b))
+#define MULT16_32_Q14(a,b)     ((a)*(b))
+#define MULT16_32_Q15(a,b)     ((a)*(b))
+
+#define MAC16_32_Q15(c,a,b)     ((c)+(a)*(b))
+
+#define MULT16_16_Q13(a,b)     ((a)*(b))
+#define MULT16_16_Q14(a,b)     ((a)*(b))
+#define MULT16_16_Q15(a,b)     ((a)*(b))
+
+#define DIV32_16(a,b)     ((a)/(b))
+#define DIV32(a,b)     ((a)/(b))
+
+
+#endif
+
+
+
+#endif
index cfb6075..63b062f 100644 (file)
@@ -143,7 +143,7 @@ int   complexity
       {
          spx_word32_t resj=0;
          for (k=0;k<=j;k++)
-            resj = ADD32(resj,MULT16_32_Q11(shape[k],r[j-k]));
+            resj = MAC16_32_Q11(resj,shape[k],r[j-k]);
 #ifndef FIXED_POINT
          resj *= 0.03125;
 #endif
index 71ebff0..6b8c4b6 100644 (file)
@@ -333,7 +333,7 @@ int lpc_to_lsp (spx_coef_t *a,int lpcrdr,spx_lsp_t *freq,int nb,float delta, cha
                psumm=psuml;
                for(k=0;k<=nb;k++){
 #ifdef FIXED_POINT
-                   xm = PSHR(ADD16(xl,xr),1);          /* bisect the interval  */
+                   xm = ADD16(PSHR(xl,1),PSHR(xr,1));          /* bisect the interval  */
 #else
                     xm = .5*(xl+xr);           /* bisect the interval  */
 #endif
index d9b430f..7850f85 100644 (file)
 #define VERSION "speex-1.1"
 #endif
 
-#ifdef FIXED_POINT
-
-typedef signed short spx_word16_t;
-typedef signed int   spx_word32_t;
-typedef long long    spx_word64_t;
-typedef spx_word32_t spx_mem_t;
-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 SIG_SCALING  16384
-#define LSP_SCALING  8192.
-
-#define LPC_SHIFT    13
-#define SIG_SHIFT    14
-
-#define VERY_SMALL 0
-
-#ifdef COUNT_MIPS
-extern long long spx_mips;
-#endif
-
-#define PSHR(a,shift) (((a)+(1<<((shift)-1))) >> (shift))
-#define SHR(a,shift) ((a) >> (shift))
-#define SHL(a,shift) ((a) << (shift))
-
-#ifdef COUNT_MIPS
-/*Modified to count operations*/
-#define ADD16(a,b) (spx_mips++,(a)+(b))
-#define SUB16(a,b) (spx_mips++,(a)-(b))
-#define ADD32(a,b) (spx_mips++,(a)+(b))
-#define ADD64(a,b) (spx_mips++,(a)+(b))
-#define SUB32(a,b) (spx_mips++,(a)-(b))
-#define MULT16_16_16(a,b)     (spx_mips++,((short)(a))*((short)(b)))
-
-#ifdef ARM_ASM
-static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
-  int res;
-  spx_mips++;
-  asm volatile("smulbb  %0,%1,%2;\n"
-               : "=&r"(res)
-               : "%r"(x),"r"(y));
-  return(res);
-}
-#else
-#define MULT16_16(a,b)     (spx_mips++,((short)(a))*((short)(b)))
-#endif
-
-#else
-
-#define ADD16(a,b) ((a)+(b))
-#define SUB16(a,b) ((a)-(b))
-#define ADD32(a,b) ((a)+(b))
-#define SUB32(a,b) ((a)-(b))
-#define ADD64(a,b) ((a)+(b))
-
-/* result fits in 16 bits */
-#define MULT16_16_16(a,b)     (((short)(a))*((short)(b)))
-/* Kludge: just making sure results are on 32 bits */
-#ifdef ARM_ASM
-static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
-  int res;
-  asm volatile("smulbb  %0,%1,%2;\n"
-              : "=&r"(res)
-              : "%r"(x),"r"(y));
-  return(res);
-}
-#else
-#define MULT16_16(a,b)     (((short)(a))*((short)(b)))
-#endif
-
-#endif
-
-#ifdef ARM_ASM
-
-static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
-  int res;
-  asm volatile("smlabb  %0,%1,%2,%3;\n"
-              : "=&r"(res)
-               : "%r"(x),"r"(y),"r"(a));
-  return(res);
-}
-
-#else
-
-#define MAC16_16(c,a,b)     (ADD32((c),MULT16_16((a),(b))))
-
-#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);
-}
-static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
-  int res;
-  asm volatile("smlawb  %0,%1,%2,%3;\n"
-              : "=&r"(res)
-               : "%r"(y<<1),"r"(x),"r"(a));
-  return(res);
-}
-
-#else
-#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
-#define MAC16_32_Q15(c,a,b) ADD32(c,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))
-#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
-
-#define MULT16_16_P13(a,b) (SHR(ADD16(4096,MULT16_16((a),(b))),13))
-#define MULT16_16_P14(a,b) (SHR(ADD16(8192,MULT16_16((a),(b))),14))
-#define MULT16_16_P15(a,b) (SHR(ADD16(16384,MULT16_16((a),(b))),15))
-
-#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
-
-
-
-#define DIV32_16(a,b) (((signed int)(a))/((short)(b)))
-
-#else
-
-typedef float spx_mem_t;
-typedef float spx_coef_t;
-typedef float spx_lsp_t;
-typedef float spx_sig_t;
-typedef float spx_word16_t;
-typedef float spx_word32_t;
-typedef float spx_word64_t;
-
-#define LPC_SCALING  1.
-#define SIG_SCALING  1.
-#define LSP_SCALING  1.
-
-#define LPC_SHIFT    0
-#define SIG_SHIFT    0
-
-#define VERY_SMALL 1e-30
-
-#define PSHR(a,shift)       (a)
-#define SHR(a,shift)       (a)
-#define SHL(a,shift)       (a)
-#define ADD16(a,b) ((a)+(b))
-#define SUB16(a,b) ((a)-(b))
-#define ADD32(a,b) ((a)+(b))
-#define SUB32(a,b) ((a)-(b))
-#define ADD64(a,b) ((a)+(b))
-#define MULT16_16_16(a,b)     ((a)*(b))
-#define MULT16_16(a,b)     ((a)*(b))
-#define MAC16_16(c,a,b)     ((c)+(a)*(b))
-
-#define MULT16_32_Q11(a,b)     ((a)*(b))
-#define MULT16_32_Q13(a,b)     ((a)*(b))
-#define MULT16_32_Q14(a,b)     ((a)*(b))
-#define MULT16_32_Q15(a,b)     ((a)*(b))
-
-#define MAC16_32_Q15(c,a,b)     ((c)+(a)*(b))
-
-#define MULT16_16_Q13(a,b)     ((a)*(b))
-#define MULT16_16_Q14(a,b)     ((a)*(b))
-#define MULT16_16_Q15(a,b)     ((a)*(b))
-
-#define DIV32_16(a,b)     ((a)/(b))
-
-
-#endif
+#include "arch.h"
 
 #ifndef RELEASE
 void print_vec(float *vec, int len, char *name);
index bfcd65c..fbdb167 100644 (file)
@@ -563,10 +563,7 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
             if (quant>31)
                quant=31;
             speex_bits_pack(bits, quant, 5);
-            g= .1*exp(quant/9.4);
          }
-         /*printf ("folding gain: %f\n", g);*/
-         g /= filter_ratio;
 
       } else {
          float gc, scale, scale_1;
@@ -618,11 +615,8 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
          for (i=0;i<st->subframeSize;i++)
            exc[i]=0;
 
-#ifdef FIXED_POINT
-         signal_div(target, target, .5+scale, st->subframeSize);
-#else
-         signal_div(target, target, scale, st->subframeSize);
-#endif
+         signal_div(target, target, SIG_SCALING*scale, st->subframeSize);
+
          /* Reset excitation */
          for (i=0;i<st->subframeSize;i++)
             innov[i]=0;
@@ -633,11 +627,8 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
                                    innov, syn_resp, bits, stack, (st->complexity+1)>>1);
          /*print_vec(target, st->subframeSize, "after");*/
 
-#ifdef FIXED_POINT
-         signal_mul(innov, innov, .5+scale, st->subframeSize);
-#else
-         signal_mul(innov, innov, scale, st->subframeSize);
-#endif
+         signal_mul(innov, innov, SIG_SCALING*scale, st->subframeSize);
+
          for (i=0;i<st->subframeSize;i++)
             exc[i] += innov[i];
 
@@ -659,14 +650,14 @@ int sb_encode(void *state, short *in, SpeexBits *bits)
 
       }
 
-         /*Keep the previous memory*/
-         for (i=0;i<st->lpcSize;i++)
-            mem[i]=st->mem_sp[i];
-         /* Final signal synthesis from excitation */
-         iir_mem2(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
-         
-         /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
-         filter_mem2(sp, st->bw_lpc1, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw);
+      /*Keep the previous memory*/
+      for (i=0;i<st->lpcSize;i++)
+         mem[i]=st->mem_sp[i];
+      /* Final signal synthesis from excitation */
+      iir_mem2(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
+      
+      /* Compute weighted signal again, from synthesized speech (not sure it's the right thing) */
+      filter_mem2(sp, st->bw_lpc1, st->bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw);
    }
 
 
@@ -1048,11 +1039,7 @@ int sb_decode(void *state, SpeexBits *bits, short *out)
          SUBMODE(innovation_unquant)(exc, SUBMODE(innovation_params), st->subframeSize, 
                                 bits, stack);
 
-#ifdef FIXED_POINT
-         signal_mul(exc,exc,.5+scale,st->subframeSize);
-#else
-         signal_mul(exc,exc,scale,st->subframeSize);
-#endif
+         signal_mul(exc,exc,SIG_SCALING*scale,st->subframeSize);
 
          if (SUBMODE(double_codebook)) {
             char *tmp_stack=stack;