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
linear_transform_frame(preprocessed * prep,imeldata * fram,int do_shift)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
inverse_transform_frame(preprocessed * prep,imeldata * fram,int do_shift)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