diff options
author | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2003-11-11 10:33:03 +0300 |
---|---|---|
committer | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2003-11-11 10:33:03 +0300 |
commit | 0d1de6f81bd01bf0c56c7b5697a616642fd67905 (patch) | |
tree | ae27fdde53692817e62ad4dbaae9d35861948137 | |
parent | a9531fbd8ada915cf479861b931d9e67e5ea7d98 (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.c | 23 | ||||
-rw-r--r-- | libspeex/nb_celp.c | 18 | ||||
-rw-r--r-- | libspeex/sb_celp.c | 15 |
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; |