diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-16 18:59:50 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2002-12-16 18:59:50 +0000 |
commit | 94ef6649dd5f4e95337af00dcede2337ea7cfb49 (patch) | |
tree | 07d679ce92b4e4517815abc42394480eebf44904 /src/libfaad/ic_predict.c | |
parent | 48f4c5809db11a6df4a5e7285d5e60a2ed924e2a (diff) | |
download | xine-lib-94ef6649dd5f4e95337af00dcede2337ea7cfb49.tar.gz xine-lib-94ef6649dd5f4e95337af00dcede2337ea7cfb49.tar.bz2 |
updated libfaad
CVS patchset: 3560
CVS date: 2002/12/16 18:59:50
Diffstat (limited to 'src/libfaad/ic_predict.c')
-rw-r--r-- | src/libfaad/ic_predict.c | 54 |
1 files changed, 19 insertions, 35 deletions
diff --git a/src/libfaad/ic_predict.c b/src/libfaad/ic_predict.c index 28f5a2d0a..997b2c654 100644 --- a/src/libfaad/ic_predict.c +++ b/src/libfaad/ic_predict.c @@ -16,10 +16,11 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** -** $Id: ic_predict.c,v 1.1 2002/07/14 23:43:01 miguelfreitas Exp $ +** $Id: ic_predict.c,v 1.2 2002/12/16 19:00:14 miguelfreitas Exp $ **/ #include "common.h" +#include "structs.h" #ifdef MAIN_DEC @@ -27,28 +28,6 @@ #include "ic_predict.h" #include "pns.h" -static void flt_round_inf(real_t *pf) -{ - int32_t flg; - uint32_t tmp; - real_t *pt = (real_t *)&tmp; - - *pt = *pf; - flg = tmp & (uint32_t)0x00008000; - tmp &= (uint32_t)0xffff0000; - *pf = *pt; - - /* round 1/2 lsb toward infinity */ - if (flg) - { - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - tmp |= (uint32_t)0x00010000; /* insert 1 lsb */ - *pf += *pt; /* add 1 lsb and elided one */ - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - *pf -= *pt; /* subtract elided one */ - } -} - static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) { real_t dr1, predictedvalue; @@ -63,15 +42,20 @@ static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t KOR = state->KOR; /* correlations */ VAR = state->VAR; /* variances */ - k1 = KOR[0]/VAR[0]*B; + if (VAR[0] == 0) + k1 = 0; + else + k1 = KOR[0]/VAR[0]*B; if (pred) { /* only needed for the actual predicted value, k1 is always needed */ - k2 = KOR[1]/VAR[1]*B; + if (VAR[1] == 0) + k2 = 0; + else + k2 = KOR[1]/VAR[1]*B; predictedvalue = MUL(k1, r[0]) + MUL(k2, r[1]); - flt_round_inf(&predictedvalue); *output = input + predictedvalue; } else { @@ -82,11 +66,11 @@ static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t e0 = *output; e1 = e0 - MUL(k1, r[0]); - dr1 = k1 * e0; + dr1 = MUL(k1, e0); - VAR[0] = MUL(ALPHA, VAR[0]) + (0.5f) * (MUL(r[0], r[0]) + MUL(e0, e0)); + VAR[0] = MUL(ALPHA, VAR[0]) + MUL(REAL_CONST(0.5), (MUL(r[0], r[0]) + MUL(e0, e0))); KOR[0] = MUL(ALPHA, KOR[0]) + MUL(r[0], e0); - VAR[1] = MUL(ALPHA, VAR[1]) + (0.5f) * (MUL(r[1], r[1]) + MUL(e1, e1)); + VAR[1] = MUL(ALPHA, VAR[1]) + MUL(REAL_CONST(0.5), (MUL(r[1], r[1]) + MUL(e1, e1))); KOR[1] = MUL(ALPHA, KOR[1]) + MUL(r[1], e1); r[1] = MUL(A, (r[0]-dr1)); @@ -95,12 +79,12 @@ static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t static void reset_pred_state(pred_state *state) { - state->r[0] = 0.0f; - state->r[1] = 0.0f; - state->KOR[0] = 0.0f; - state->KOR[1] = 0.0f; - state->VAR[0] = 1.0f; - state->VAR[1] = 1.0f; + state->r[0] = 0; + state->r[1] = 0; + state->KOR[0] = 0; + state->KOR[1] = 0; + state->VAR[0] = REAL_CONST(1.0); + state->VAR[1] = REAL_CONST(1.0); } void pns_reset_pred_state(ic_stream *ics, pred_state *state) |