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