fixed-point: added code to count MIPS
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 07:44:35 +0000 (07:44 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sun, 2 Nov 2003 07:44:35 +0000 (07:44 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@5534 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/lsp.c
libspeex/misc.c
libspeex/misc.h
libspeex/testenc.c

index d95aa1f..f27f911 100644 (file)
@@ -68,11 +68,11 @@ static spx_word16_t cos_32(spx_word16_t x)
    if (x<12868)
    {
       x2 = MULT16_16_Q13(x,x);
-      return C1 + MULT16_16_Q13(x2, C2 + MULT16_16_Q13(C3, x2));
+      return ADD32(C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
    } else {
       x = 25736-x;
       x2 = MULT16_16_Q13(x,x);
-      return -C1 - MULT16_16_Q13(x2, C2 + MULT16_16_Q13(C3, x2));
+      return SUB32(-C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
    }
 }
 
@@ -137,12 +137,12 @@ static spx_word32_t cheb_poly_eva(spx_word32_t *coef,spx_word16_t x,int m,char *
 
     /* Evaluate Chebyshev series formulation using iterative approach  */
     /* Evaluate polynomial and return value also free memory space */
-    sum = coefn[m2] + MULT16_16_P14(coefn[m2-1],x);
+    sum = ADD32(coefn[m2], MULT16_16_P14(coefn[m2-1],x));
     /*x *= 2;*/
     for(i=2;i<=m2;i++)
     {
        T[i] = MULT16_16_Q13(x,T[i-1]) - T[i-2];
-       sum += MULT16_16_P14(coefn[m2-i],T[i]);
+       sum = ADD32(sum, MULT16_16_P14(coefn[m2-i],T[i]));
        /*printf ("%f ", sum);*/
     }
     
@@ -385,7 +385,7 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
     spx_word32_t *Wp;
     spx_word32_t *pw,*n1,*n2,*n3,*n4=NULL;
     spx_word16_t *freqn;
-    int m = lpcrdr/2;
+    int m = lpcrdr>>1;
     
     freqn = PUSH(stack, lpcrdr, spx_word16_t);
     for (i=0;i<lpcrdr;i++)
@@ -418,8 +418,8 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
            n2 = n1 + 1;
            n3 = n2 + 1;
            n4 = n3 + 1;
-           xout1 = xin1 - MULT16_32_Q14(freqn[i2],*n1) + *n2;
-            xout2 = xin2 - MULT16_32_Q14(freqn[i2+1],*n3) + *n4;
+           xout1 = ADD32(SUB32(xin1, MULT16_32_Q14(freqn[i2],*n1)), *n2);
+            xout2 = ADD32(SUB32(xin2, MULT16_32_Q14(freqn[i2+1],*n3)), *n4);
            *n2 = *n1;
            *n4 = *n3;
            *n1 = xin1;
@@ -435,7 +435,7 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack)
         else if (xout1 + xout2 < -256*32767)
            ak[j] = -32768;
         else
-           ak[j] = ((128+xout1 + xout2)>>8);
+           ak[j] = PSHR(ADD32(xout1,xout2),8);
        *(n4+1) = xin1;
        *(n4+2) = xin2;
 
index 5572809..cf8d16c 100644 (file)
@@ -46,6 +46,11 @@ void print_vec(float *vec, int len, char *name)
 }
 #endif
 
+#ifdef COUNT_MIPS
+long long spx_mips=0;
+#endif
+
+
 unsigned int be_int(unsigned int i)
 {
    unsigned int ret=i;
index c260e1e..5a35c70 100644 (file)
@@ -55,10 +55,25 @@ typedef spx_word32_t spx_sig_t;
 #define LPC_SHIFT    13
 #define SIG_SHIFT    14
 
+#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 SUB32(a,b) (spx_mips++,(a)-(b))
+#define MULT16_16_16(a,b)     (spx_mips++,((short)(a))*((short)(b)))
+#define MULT16_16(a,b)     (spx_mips++,((int)(a))*((short)(b)))
+
+#else
+
 #define ADD16(a,b) ((a)+(b))
 #define SUB16(a,b) ((a)-(b))
 #define ADD32(a,b) ((a)+(b))
@@ -66,10 +81,11 @@ typedef spx_word32_t spx_sig_t;
 
 /* result fits in 16 bits */
 #define MULT16_16_16(a,b)     (((short)(a))*((short)(b)))
-
 /* Kludge: just making sure results are on 32 bits */
 #define MULT16_16(a,b)     (((int)(a))*((short)(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_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))
index 86dbc22..ba1df27 100644 (file)
@@ -3,6 +3,10 @@
 #include <stdlib.h>
 #include "speex_callbacks.h"
 
+#ifdef COUNT_MIPS
+extern long long spx_mips;
+#endif
+
 #define FRAME_SIZE 160
 #include <math.h>
 int main(int argc, char **argv)
@@ -119,6 +123,10 @@ int main(int argc, char **argv)
    snr = 10 * log10( sigpow / errpow );
    seg_snr /= snr_frames;
    fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr);
+
+#ifdef COUNT_MIPS
+   printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames));
+#endif
    
    return 1;
 }