1/*---------------------------------------------------------------------------* 2 * catrans.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 21static const char pat_tran[] = "$Id: catrans.c,v 1.3.10.2 2007/08/31 17:44:51 dahan Exp $"; 22 23#include <stdlib.h> 24#include <string.h> 25#include <stdio.h> 26 27#ifdef unix 28#include <unistd.h> 29#endif 30#include <assert.h> 31 32#include"simapi.h" 33 34CA_Transform *CA_AllocateTransform(void) 35{ 36 CA_Transform *hTransform = NULL; 37 TRY_CA_EXCEPT 38 39 40 hTransform = (CA_Transform *) VAR_ALLOCATE_CLR(1, sizeof(CA_Transform), "ca.hTransform"); 41 hTransform->is_loaded = False; 42 hTransform->is_setup = False; 43 44 return (hTransform); 45 46 BEG_CATCH_CA_EXCEPT 47 END_CATCH_CA_EXCEPT(hTransform) 48} 49 50 51void CA_FreeTransform(CA_Transform *hTransform) 52{ 53 TRY_CA_EXCEPT 54 55 ASSERT(hTransform); 56 VAR_FREE((char *) hTransform, "hTransform"); 57 return; 58 59 BEG_CATCH_CA_EXCEPT 60 END_CATCH_CA_EXCEPT(hTransform) 61} 62 63 64int CA_LoadTransform(CA_Transform *hTransform, int dimen) 65{ 66 TRY_CA_EXCEPT 67 68 ASSERT(hTransform); 69 ASSERT(dimen > 0); 70 71 if (hTransform->is_loaded == True) 72 SERVICE_ERROR(PATTERN_ALREADY_LOADED); 73 74 hTransform->dim = dimen; 75 76 hTransform->imelda_acc.between = create_accumulate_matrix(hTransform->dim); 77 hTransform->imelda_acc.bmean = (accdata *) VAR_ALLOCATE(hTransform->dim, 78 sizeof(accdata), "ca.hTransform->imelda_acc.bmean"); 79 hTransform->imelda_acc.within = create_accumulate_matrix(dimen); 80 hTransform->imelda_acc.wmean = (accdata *) VAR_ALLOCATE(hTransform->dim, 81 sizeof(accdata), "ca.hTransform->imelda_acc.wmean"); 82 hTransform->mllr_acc.between = create_accumulate_matrix(hTransform->dim + 1); 83 hTransform->mllr_acc.within = create_accumulate_matrix(hTransform->dim + 1); 84 85 hTransform->is_loaded = True; 86 87 return (True); 88 89 BEG_CATCH_CA_EXCEPT 90 END_CATCH_CA_EXCEPT(hTransform) 91} 92 93 94void CA_ConfigureTransform(CA_Transform *hTransform, int do_mllr, int do_imelda) 95{ 96 TRY_CA_EXCEPT 97 98 ASSERT(hTransform); 99 100 hTransform->do_mllr = do_mllr; 101 hTransform->do_imelda = do_imelda; 102 103 return; 104 105 BEG_CATCH_CA_EXCEPT 106 END_CATCH_CA_EXCEPT(hTransform) 107} 108 109 110void CA_UnloadTransform(CA_Transform *hTransform) 111{ 112 TRY_CA_EXCEPT 113 ASSERT(hTransform); 114 if (hTransform->is_loaded == False) 115 SERVICE_ERROR(PATTERN_NOT_LOADED); 116 117 delete_accumulate_matrix(hTransform->imelda_acc.between, hTransform->dim); 118 delete_accumulate_matrix(hTransform->imelda_acc.within, hTransform->dim); 119 delete_accumulate_matrix(hTransform->mllr_acc.between, hTransform->dim + 1); 120 delete_accumulate_matrix(hTransform->mllr_acc.within, hTransform->dim + 1); 121 VAR_FREE(hTransform->imelda_acc.bmean, "hTransform->imelda_acc.bmean"); 122 VAR_FREE(hTransform->imelda_acc.wmean, "hTransform->imelda_acc.wmean"); 123 124 hTransform->is_loaded = False; 125 126 return; 127 128 BEG_CATCH_CA_EXCEPT 129 END_CATCH_CA_EXCEPT(hTransform) 130} 131 132 133void CA_ClearTransform(CA_Transform *hTransform) 134{ 135 TRY_CA_EXCEPT 136 int ii, jj; 137 138 if (hTransform->is_loaded == False) 139 SERVICE_ERROR(PATTERN_NOT_LOADED); 140 141 ASSERT(hTransform->imelda_acc.within); 142 ASSERT(hTransform->imelda_acc.between); 143 ASSERT(hTransform->imelda_acc.wmean); 144 ASSERT(hTransform->imelda_acc.bmean); 145 ASSERT(hTransform->mllr_acc.within); 146 ASSERT(hTransform->mllr_acc.between); 147 148 for (ii = 0; ii <= hTransform->dim; ii++) 149 { 150 for (jj = 0; jj <= hTransform->dim; jj++) 151 { 152 hTransform->mllr_acc.between[ii][jj] = 0; 153 hTransform->mllr_acc.within[ii][jj] = 0; 154 } 155 } 156 157 for (ii = 0; ii < hTransform->dim; ii++) 158 { 159 hTransform->imelda_acc.wmean[ii] = 0; 160 hTransform->imelda_acc.bmean[ii] = 0; 161 for (jj = 0; jj < hTransform->dim; jj++) 162 { 163 hTransform->imelda_acc.between[ii][jj] = 0; 164 hTransform->imelda_acc.within[ii][jj] = 0; 165 } 166 } 167 hTransform->imelda_acc.num = 0; 168 return; 169 170 BEG_CATCH_CA_EXCEPT 171 END_CATCH_CA_EXCEPT(hTransform) 172} 173 174 175void CA_InheritAccumulates(CA_Transform *hTransform, CA_Pattern *hPattern) 176{ 177 TRY_CA_EXCEPT 178 int ii, jj; 179 180 ASSERT(hPattern); 181 if (hPattern->is_loaded == False) 182 SERVICE_ERROR(PATTERN_NOT_LOADED); 183 ASSERT(hTransform); 184 if (hTransform->is_loaded == False) 185 SERVICE_ERROR(PATTERN_NOT_LOADED); 186 187 ASSERT(hTransform->dim == hPattern->data.dim); 188 189 if (hTransform->do_mllr) 190 { 191 192 ASSERT(hPattern->true_accumulates); 193 ASSERT(hPattern->data.do_mllr); 194 ASSERT(hPattern->data.mllr_acc.between); 195 ASSERT(hTransform->mllr_acc.between); 196 197 for (ii = 0; ii <= hTransform->dim; ii++) 198 for (jj = 0; jj <= hTransform->dim; jj++) 199 { 200 201 hTransform->mllr_acc.between[ii][jj] += 202 hPattern->data.mllr_acc.between[ii][jj]; 203 hTransform->mllr_acc.within[ii][jj] += 204 hPattern->data.mllr_acc.within[ii][jj]; 205 206 } 207 208 log_report("\nCA_InheritAccumulates MLLR inheriting %f frames (total now %f)\n\n", hPattern->data.mllr_acc.within[hTransform->dim][hTransform->dim], hTransform->mllr_acc.within[hTransform->dim][hTransform->dim]); 209 } 210 211 if (hTransform->do_imelda) 212 { 213 214 ASSERT(hPattern->data.do_imelda); 215 ASSERT(hPattern->data.mllr_acc.between); 216 ASSERT(hTransform->mllr_acc.between); 217 218 for (ii = 0; ii < hTransform->dim; ii++) 219 for (jj = 0; jj < hTransform->dim; jj++) 220 { 221 222 hTransform->imelda_acc.between[ii][jj] += 223 hPattern->data.imelda_acc.between[ii][jj]; 224 hTransform->imelda_acc.within[ii][jj] += 225 hPattern->data.imelda_acc.within[ii][jj]; 226 } 227 228 for (ii = 0; ii < hTransform->dim; ii++) 229 { 230 231 hTransform->imelda_acc.bmean[ii] += 232 hPattern->data.imelda_acc.bmean[ii]; 233 hTransform->imelda_acc.wmean[ii] += 234 hPattern->data.imelda_acc.wmean[ii]; 235 } 236 237 hTransform->imelda_acc.num += hPattern->data.imelda_acc.num; 238 239 log_report("\nCA_InheritAccumulates Imelda inheriting %d frames (total now %d)\n\n", hPattern->data.imelda_acc.num, hTransform->imelda_acc.num); 240 } 241 242 return; 243 244 BEG_CATCH_CA_EXCEPT 245 END_CATCH_CA_EXCEPT(hPattern) 246} 247 248 249void CA_LoadTransformAccumulates(CA_Pattern *hPattern, 250 CA_Transform *hTransform) 251{ 252 TRY_CA_EXCEPT 253 int ii, jj; 254 255 ASSERT(hPattern); 256 if (hPattern->is_loaded == False) 257 SERVICE_ERROR(PATTERN_NOT_LOADED); 258 ASSERT(hTransform); 259 if (hTransform->is_loaded == False) 260 SERVICE_ERROR(PATTERN_NOT_LOADED); 261 262 ASSERT(hTransform->dim == hPattern->data.dim); 263 264 if (hTransform->do_mllr) 265 { 266 267 ASSERT(hPattern->data.do_mllr); 268 ASSERT(hPattern->data.mllr_acc.between); 269 ASSERT(hTransform->mllr_acc.between); 270 271 for (ii = 0; ii <= hTransform->dim; ii++) 272 for (jj = 0; jj <= hTransform->dim; jj++) 273 { 274 275 hPattern->data.mllr_acc.between[ii][jj] = 276 hTransform->mllr_acc.between[ii][jj]; 277 hPattern->data.mllr_acc.within[ii][jj] = 278 hTransform->mllr_acc.within[ii][jj]; 279 } 280 } 281 282 if (hTransform->do_imelda) 283 { 284 285 ASSERT(hPattern->data.do_imelda); 286 ASSERT(hPattern->data.mllr_acc.between); 287 ASSERT(hTransform->mllr_acc.between); 288 289 for (ii = 0; ii < hTransform->dim; ii++) 290 for (jj = 0; jj < hTransform->dim; jj++) 291 { 292 293 hPattern->data.imelda_acc.between[ii][jj] = 294 hTransform->imelda_acc.between[ii][jj]; 295 hPattern->data.imelda_acc.within[ii][jj] = 296 hTransform->imelda_acc.within[ii][jj]; 297 } 298 299 for (ii = 0; ii < hTransform->dim; ii++) 300 { 301 302 hPattern->data.imelda_acc.bmean[ii] = 303 hTransform->imelda_acc.bmean[ii]; 304 hPattern->data.imelda_acc.wmean[ii] = 305 hTransform->imelda_acc.wmean[ii]; 306 } 307 308 hPattern->data.imelda_acc.num = hTransform->imelda_acc.num; 309 310 } 311 312 return; 313 314 BEG_CATCH_CA_EXCEPT 315 END_CATCH_CA_EXCEPT(hPattern) 316} 317 318 319