1 /*---------------------------------------------------------------------------* 2 * imeld_tr.c * 3 * * 4 * Copyright 2007, 2008 Nuance Communciations, Inc. * 5 * * 6 * Licensed under the Apache License, Version 2.0 (the 'License'); * 7 * you may not use this file except in compliance with the License. * 8 * * 9 * You may obtain a copy of the License at * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, software * 13 * distributed under the License is distributed on an 'AS IS' BASIS, * 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 15 * See the License for the specific language governing permissions and * 16 * limitations under the License. * 17 * * 18 *---------------------------------------------------------------------------*/ 19 20 21 #ifndef _RTT 22 #include <stdio.h> 23 #endif 24 #include <stdlib.h> 25 #include <math.h> 26 #include <string.h> 27 #ifdef unix 28 #include <limits.h> 29 #endif 30 #include <assert.h> 31 32 #include "prelib.h" 33 #include "portable.h" 34 35 #include "../cfront/sh_down.h" 36 37 38 static const char imeld_tr[] = "$Id: imeld_tr.c,v 1.2.10.10 2008/04/01 18:23:20 dahan Exp $"; 39 40 void linear_transform_frame(preprocessed *prep, imeldata *fram, int do_shift) 41 /* 42 ** Note the matrix is the transpose of the transformation 43 ** To transform a single frame in place */ 44 { 45 int ii, jj; 46 imeldata vec[MAX_DIMEN]; 47 int dim = prep->dim; 48 49 ASSERT(prep); 50 ASSERT(prep->dim < MAX_DIMEN); 51 ASSERT(fram); 52 for (ii = 0; ii < dim; ii++) 53 { 54 vec[ii] = 0; 55 for (jj = 0; jj < prep->dim; jj++) 56 vec[ii] += prep->matrix[ii][jj] * fram[jj]; 57 ASSERT(prep->imel_shift > 0); 58 vec[ii] = (imeldata) SHIFT_DOWN((int)vec[ii], 59 (unsigned int)prep->imel_shift); 60 } 61 62 if (do_shift) 63 { 64 if (prep->offset) 65 for (ii = 0; ii < dim; ii++) 66 fram[ii] = RANGE(vec[ii] + prep->offset[ii], 0, 255); 67 else 68 for (ii = 0; ii < dim; ii++) 69 fram[ii] = RANGE(vec[ii], 0, 255); 70 } 71 else 72 { 73 for (ii = 0; ii < dim; ii++) 74 fram[ii] = vec[ii]; 75 } 76 return; 77 } 78 79 void inverse_transform_frame (preprocessed *prep, imeldata *fram, int do_shift) 80 /* 81 ** Note the matrix is the transpose of the transformation 82 ** To transform a single frame in place */ 83 { 84 int ii, jj; 85 imeldata vec[MAX_DIMEN]; 86 87 ASSERT (prep); 88 ASSERT (prep->dim < MAX_DIMEN); 89 ASSERT (fram); 90 91 if (prep->offset && do_shift) 92 for (ii= 0; ii < prep->dim; ii++) 93 fram[ii] -= prep->offset[ii]; 94 95 for (ii= 0; ii < prep->dim; ii++) { 96 vec[ii]= 0; 97 for (jj= 0; jj < prep->dim; jj++) 98 vec[ii] += prep->invmat[ii][jj] * fram[jj]; 99 vec[ii]= SHIFT_DOWN (vec[ii], prep->inv_shift); 100 //floating pt // for (jj= 0; jj < prep->dim; jj++) 101 //floating pt // vec[ii] += (imeldata)(prep->inverse[ii][jj] * fram[jj]); 102 } 103 if (do_shift) 104 for (ii= 0; ii < prep->dim; ii++) 105 fram[ii]= RANGE (vec[ii], 0, 255); 106 else 107 for (ii= 0; ii < prep->dim; ii++) 108 fram[ii]= vec[ii]; 109 return; 110 } 111 112 113