blob: 0ef71c1fcbcee5bb57ae4906e41bba64dcfe3d30 [file] [log] [blame]
/*---------------------------------------------------------------------------*
* imeld_tr.c *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#ifndef _RTT
#include <stdio.h>
#endif
#include <stdlib.h>
#include <math.h>
#include <string.h>
#ifdef unix
#include <limits.h>
#endif
#include <assert.h>
#include "prelib.h"
#include "portable.h"
#include "../cfront/sh_down.h"
static const char imeld_tr[] = "$Id: imeld_tr.c,v 1.2.10.10 2008/04/01 18:23:20 dahan Exp $";
void linear_transform_frame(preprocessed *prep, imeldata *fram, int do_shift)
/*
** Note the matrix is the transpose of the transformation
** To transform a single frame in place */
{
int ii, jj;
imeldata vec[MAX_DIMEN];
int dim = prep->dim;
ASSERT(prep);
ASSERT(prep->dim < MAX_DIMEN);
ASSERT(fram);
for (ii = 0; ii < dim; ii++)
{
vec[ii] = 0;
for (jj = 0; jj < prep->dim; jj++)
vec[ii] += prep->matrix[ii][jj] * fram[jj];
ASSERT(prep->imel_shift > 0);
vec[ii] = (imeldata) SHIFT_DOWN((int)vec[ii],
(unsigned int)prep->imel_shift);
}
if (do_shift)
{
if (prep->offset)
for (ii = 0; ii < dim; ii++)
fram[ii] = RANGE(vec[ii] + prep->offset[ii], 0, 255);
else
for (ii = 0; ii < dim; ii++)
fram[ii] = RANGE(vec[ii], 0, 255);
}
else
{
for (ii = 0; ii < dim; ii++)
fram[ii] = vec[ii];
}
return;
}
void inverse_transform_frame (preprocessed *prep, imeldata *fram, int do_shift)
/*
** Note the matrix is the transpose of the transformation
** To transform a single frame in place */
{
int ii, jj;
imeldata vec[MAX_DIMEN];
ASSERT (prep);
ASSERT (prep->dim < MAX_DIMEN);
ASSERT (fram);
if (prep->offset && do_shift)
for (ii= 0; ii < prep->dim; ii++)
fram[ii] -= prep->offset[ii];
for (ii= 0; ii < prep->dim; ii++) {
vec[ii]= 0;
for (jj= 0; jj < prep->dim; jj++)
vec[ii] += prep->invmat[ii][jj] * fram[jj];
vec[ii]= SHIFT_DOWN (vec[ii], prep->inv_shift);
//floating pt // for (jj= 0; jj < prep->dim; jj++)
//floating pt // vec[ii] += (imeldata)(prep->inverse[ii][jj] * fram[jj]);
}
if (do_shift)
for (ii= 0; ii < prep->dim; ii++)
fram[ii]= RANGE (vec[ii], 0, 255);
else
for (ii= 0; ii < prep->dim; ii++)
fram[ii]= vec[ii];
return;
}