shithub: opus

Download patch

ref: 3ca9b1d29539bf7f79f07c975e5d60ee42883580
parent: a847b775c948a80da60c6193ce8e99275d6e9c2a
author: Jean-Marc Valin <[email protected]>
date: Wed Feb 27 18:50:31 EST 2008

fixed-point: Moved sqrt and cos approximations to mathops.h

--- a/libcelt/Makefile.am
+++ b/libcelt/Makefile.am
@@ -24,8 +24,9 @@
 libcelt_la_LDFLAGS = -version-info @CELT_LT_CURRENT@:@CELT_LT_REVISION@:@CELT_LT_AGE@
 
 noinst_HEADERS = _kiss_fft_guts.h arch.h bands.h bitrdec.h bitree.h bitrenc.h \
-	cwrs.h ecintrin.h entcode.h entdec.h entenc.h kiss_fft.h kiss_fftr.h laplace.h \
-	mdct.h mfrngcod.h modes.h os_support.h pgain_table.h pitch.h psy.h \
+	cwrs.h ecintrin.h entcode.h entdec.h entenc.h fixed_generic.h 
+	kiss_fft.h kiss_fftr.h laplace.h mdct.h mfrngcod.h mathops.h modes.h \
+	os_support.h pgain_table.h pitch.h psy.h \
 	quant_bands.h quant_pitch.h rate.h stack_alloc.h vq.h
 
 noinst_PROGRAMS = testcelt
--- a/libcelt/_kiss_fft_guts.h
+++ b/libcelt/_kiss_fft_guts.h
@@ -143,43 +143,6 @@
 #endif /* !MIXED_PRECISION */
 
 
-               
-#define L1 32767
-#define L2 -7651
-#define L3 8277
-#define L4 -626
-
-static inline celt_word16_t _celt_cos_pi_2(celt_word16_t x)
-{
-   celt_word16_t x2;
-   
-   x2 = MULT16_16_P15(x,x);
-   return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2
-                                                                                ))))))));
-}
-
-static inline celt_word16_t celt_cos_norm(celt_word32_t x)
-{
-   x = x&0x0001ffff;
-   if (x>SHL32(EXTEND32(1), 16))
-      x = SUB32(SHL32(EXTEND32(1), 17),x);
-   if (x&0x00007fff)
-   {
-      if (x<SHL32(EXTEND32(1), 15))
-      {
-         return _celt_cos_pi_2(EXTRACT16(x));
-      } else {
-         return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x)));
-      }
-   } else {
-      if (x&0x0000ffff)
-         return 0;
-      else if (x&0x0001ffff)
-         return -32767;
-      else
-         return 32767;
-   }
-}
 
 #else  /* not FIXED_POINT*/
 
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -161,7 +161,6 @@
 void compute_pitch_gain(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, celt_pgain_t *gains, celt_ener_t *bank)
 {
    int i, B;
-   const int *eBands = m->eBands;
    const int *pBands = m->pBands;
    B = m->nbMdctBlocks*m->nbChannels;
    
--- /dev/null
+++ b/libcelt/mathops.h
@@ -1,0 +1,123 @@
+/* Copyright (C) 2002-2008 Jean-Marc Valin */
+/**
+   @file mathops.h
+   @brief Various math functions
+*/
+/*
+   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 MATHOPS_H
+#define MATHOPS_H
+
+#include "arch.h"
+
+#ifndef FIXED_POINT
+
+#define celt_sqrt sqrt
+#define celt_acos acos
+#define celt_exp exp
+#define celt_cos_norm(x) (cos((.5f*M_PI)*(x)))
+#define celt_atan atan
+
+
+#endif
+
+
+
+#ifdef FIXED_POINT
+
+#include "entcode.h"
+
+#define C0 3634
+#define C1 21173
+#define C2 -12627
+#define C3 4204
+
+static inline celt_word32_t celt_sqrt(celt_word32_t x)
+{
+   int k;
+   //printf ("%d ", x);
+   celt_word32_t rt;
+   /* ((EC_ILOG(x)-1)>>1) is just the int log4(x) (EC_ILOG returns log2 + 1) */
+   k = ((EC_ILOG(x)-1)>>1)-6;
+   x = VSHR32(x, (k<<1));
+   rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3)))))));
+   rt = VSHR32(rt,7-k);
+   //printf ("%d\n", rt);
+   return rt;
+}
+
+
+#define L1 32767
+#define L2 -7651
+#define L3 8277
+#define L4 -626
+
+static inline celt_word16_t _celt_cos_pi_2(celt_word16_t x)
+{
+   celt_word16_t x2;
+   
+   x2 = MULT16_16_P15(x,x);
+   return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2
+                                                                                ))))))));
+}
+
+#undef L1
+#undef L2
+#undef L3
+#undef L4
+
+static inline celt_word16_t celt_cos_norm(celt_word32_t x)
+{
+   x = x&0x0001ffff;
+   if (x>SHL32(EXTEND32(1), 16))
+      x = SUB32(SHL32(EXTEND32(1), 17),x);
+   if (x&0x00007fff)
+   {
+      if (x<SHL32(EXTEND32(1), 15))
+      {
+         return _celt_cos_pi_2(EXTRACT16(x));
+      } else {
+         return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x)));
+      }
+   } else {
+      if (x&0x0000ffff)
+         return 0;
+      else if (x&0x0001ffff)
+         return -32767;
+      else
+         return 32767;
+   }
+}
+
+
+#endif
+
+
+#endif
--- a/libcelt/vq.c
+++ b/libcelt/vq.c
@@ -35,6 +35,7 @@
 
 #include <math.h>
 #include <stdlib.h>
+#include "mathops.h"
 #include "cwrs.h"
 #include "vq.h"
 #include "arch.h"
@@ -60,24 +61,6 @@
 #endif
 
 #ifdef FIXED_POINT
-#define C0 3634
-#define C1 21173
-#define C2 -12627
-#define C3 4204
-
-static inline celt_word32_t celt_sqrt(celt_word32_t x)
-{
-   int k;
-   //printf ("%d ", x);
-   celt_word32_t rt;
-   /* ((EC_ILOG(x)-1)>>1) is just the int log4(x) (EC_ILOG returns log2 + 1) */
-   k = ((EC_ILOG(x)-1)>>1)-6;
-   x = VSHR32(x, (k<<1));
-   rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3)))))));
-   rt = VSHR32(rt,7-k);
-   //printf ("%d\n", rt);
-   return rt;
-}
 #else
 #define celt_sqrt sqrt
 #endif