summaryrefslogtreecommitdiff
path: root/src/libfaad/ic_predict.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-12-16 18:59:50 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-12-16 18:59:50 +0000
commit94ef6649dd5f4e95337af00dcede2337ea7cfb49 (patch)
tree07d679ce92b4e4517815abc42394480eebf44904 /src/libfaad/ic_predict.c
parent48f4c5809db11a6df4a5e7285d5e60a2ed924e2a (diff)
downloadxine-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.c54
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)