Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xiph/speex.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>2003-11-11 10:33:03 +0300
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>2003-11-11 10:33:03 +0300
commit0d1de6f81bd01bf0c56c7b5697a616642fd67905 (patch)
treeae27fdde53692817e62ad4dbaae9d35861948137
parenta9531fbd8ada915cf479861b931d9e67e5ea7d98 (diff)
fixed-point: increased precision of the cos approximation, fixed someSpeex-1.1.2
floating-point/fixed-point mismatch git-svn-id: http://svn.xiph.org/trunk/speex@5560 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r--libspeex/lsp.c23
-rw-r--r--libspeex/nb_celp.c18
-rw-r--r--libspeex/sb_celp.c15
3 files changed, 42 insertions, 14 deletions
diff --git a/libspeex/lsp.c b/libspeex/lsp.c
index 3597ec5..71ebff0 100644
--- a/libspeex/lsp.c
+++ b/libspeex/lsp.c
@@ -58,26 +58,31 @@ Modified by Jean-Marc Valin
#ifdef FIXED_POINT
-#define C1 8187
-#define C2 -4058
-#define C3 301
-static spx_word16_t cos_32(spx_word16_t x)
+#define C1 8192
+#define C2 -4096
+#define C3 340
+#define C4 -10
+
+static spx_word16_t spx_cos(spx_word16_t x)
{
spx_word16_t x2;
if (x<12868)
{
- x2 = MULT16_16_Q13(x,x);
- return ADD32(C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
+ x2 = MULT16_16_P13(x,x);
+ return ADD32(C1, MULT16_16_P13(x2, ADD32(C2, MULT16_16_P13(x2, ADD32(C3, MULT16_16_P13(C4, x2))))));
} else {
x = 25736-x;
- x2 = MULT16_16_Q13(x,x);
- return SUB32(-C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
+ x2 = MULT16_16_P13(x,x);
+ return SUB32(-C1, MULT16_16_P13(x2, ADD32(C2, MULT16_16_P13(x2, ADD32(C3, MULT16_16_P13(C4, x2))))));
+ //return SUB32(-C1, MULT16_16_Q13(x2, ADD32(C2, MULT16_16_Q13(C3, x2))));
}
}
+
#define FREQ_SCALE 16384
-#define ANGLE2X(a) (SHL(cos_32(a),2))
+//#define ANGLE2X(a) (32768*cos(((a)/8192.)))
+#define ANGLE2X(a) (SHL(spx_cos(a),2))
//#define X2ANGLE(x) (acos(.00006103515625*(x))*LSP_SCALING)
#define X2ANGLE(x) (spx_acos(x))
/* maybe we could approximate acos as
diff --git a/libspeex/nb_celp.c b/libspeex/nb_celp.c
index 39dadea..0b09f65 100644
--- a/libspeex/nb_celp.c
+++ b/libspeex/nb_celp.c
@@ -788,8 +788,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
/*printf ("%f %f\n", ener, ol_gain);*/
/* Normalize innovation */
+#ifdef FIXED_POINT
signal_div(target, target, .5+ener, st->subframeSize);
-
+#else
+ signal_div(target, target, ener, st->subframeSize);
+#endif
/* Quantize innovation */
if (SUBMODE(innovation_quant))
{
@@ -799,7 +802,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
innov, syn_resp, bits, stack, st->complexity);
/* De-normalize innovation and update excitation */
+#ifdef FIXED_POINT
signal_mul(innov, innov, .5+ener, st->subframeSize);
+#else
+ signal_mul(innov, innov, ener, st->subframeSize);
+#endif
for (i=0;i<st->subframeSize;i++)
exc[i] += innov[i];
@@ -824,7 +831,11 @@ int nb_encode(void *state, short *in, SpeexBits *bits)
exc[i] += innov2[i];
}
+#ifdef FIXED_POINT
signal_mul(target, target, .5+ener, st->subframeSize);
+#else
+ signal_mul(target, target, ener, st->subframeSize);
+#endif
}
/*Keep the previous memory*/
@@ -1523,8 +1534,11 @@ int nb_decode(void *state, SpeexBits *bits, short *out)
}
/* De-normalize innovation and update excitation */
+#ifdef FIXED_POINT
signal_mul(innov, innov, .5+ener, st->subframeSize);
-
+#else
+ signal_mul(innov, innov, ener, st->subframeSize);
+#endif
/*Vocoder mode*/
if (st->submodeID==1)
{
diff --git a/libspeex/sb_celp.c b/libspeex/sb_celp.c
index 3a0c62b..b9dbf0e 100644
--- a/libspeex/sb_celp.c
+++ b/libspeex/sb_celp.c
@@ -618,9 +618,11 @@ 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
/* Reset excitation */
for (i=0;i<st->subframeSize;i++)
innov[i]=0;
@@ -631,8 +633,11 @@ 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
for (i=0;i<st->subframeSize;i++)
exc[i] += innov[i];
@@ -1043,7 +1048,11 @@ 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
if (SUBMODE(double_codebook)) {
char *tmp_stack=stack;