14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * cnorm_tr.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h> 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h> 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h> 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "channorm.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "prelib.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "duk_io.h" 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG 0 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define ESTIMATE_PERIOD -1 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define BACK_ESTIMATE_PERIOD 1000 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define ESTIMATE_PERCENTILE 50 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char cnorm_tr[] = "$Id: cnorm_tr.c,v 1.4.10.6 2007/10/15 18:06:24 dahan Exp $"; 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnorm_info *create_channel_normalization() 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project norm_info *channorm; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm = (norm_info *) CALLOC_CLR(1, sizeof(norm_info), "clib.channorm"); 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (channorm); 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid destroy_channel_normalization(norm_info *channorm) 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(channorm); 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE((char *)channorm); 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid apply_channel_normalization_in_imelda(norm_info *channorm, 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project imeldata *outframe, imeldata *frame, 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int dimen) 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(channorm); 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(frame); 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(outframe); 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(dimen <= channorm->dim); 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project outframe[ii] = MAKEBYTE(frame[ii] + channorm->imelda_adjust[ii]); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid estimate_normalization_parameters(norm_info *channorm, 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project spect_dist_info **chandata, int dimen) 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii, adjust; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(channorm); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(chandata); 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(dimen <= channorm->dim); 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (chandata[ii]) 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project evaluate_parameters(chandata[ii]); 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* The additive expression is due to 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** the normalization taking place before the 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ** utterance object is created 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project adjust = mean_normalize_data(chandata[ii], 0); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* channorm->adjust[ii]= adjust; */ 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if USE_MEDIAN 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project shift_distribution_counts(chandata[ii], adjust); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project shift_parameters(chandata[ii], adjust); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->imelda_adjust[ii] += adjust; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->adjust[ii] += adjust; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if NORM_IN_IMELDA 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->adj_valid = True; 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("NORM IML: "); 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < channorm->dim; ii++) 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("%d ", channorm->imelda_adjust[ii]); 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("\n"); 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->adj_valid = False; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("NORM ADJ: "); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < channorm->dim; ii++) 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("%d ", channorm->adjust[ii]); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project log_report("\n"); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid setup_channel_normalization(norm_info *channorm, 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project spect_dist_info **chandata, int dimen, 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int forget_factor) 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(channorm); 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(chandata); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if MODEL_BASED || 1 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project chandata[ii] = create_spectrum_distribution( 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 128, 128, 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 0, 255, forget_factor, ESTIMATE_PERIOD, 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESTIMATE_PERCENTILE, 10); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project chandata[ii] = create_spectrum_distribution( 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->chan_tgt[ii], channorm->chan_init[ii], 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 0, 511, forget_factor, ESTIMATE_PERIOD, 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESTIMATE_PERCENTILE, 10); 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->adjust[ii] = channorm->target[ii] 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project - channorm->init[ii]; 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project channorm->adj_valid = False; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid clear_channel_normalization(spect_dist_info **chandata, int dimen) 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(chandata); 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (chandata[ii]) 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project destroy_spectrum_distribution(chandata[ii]); 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project chandata[ii] = NULL; 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid setup_ambient_estimation(spect_dist_info **backchan, int dimen, 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int forget_factor) 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(backchan); 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backchan[ii] = create_spectrum_distribution( 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 0, 0, 0, 255, forget_factor, BACK_ESTIMATE_PERIOD, 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESTIMATE_PERCENTILE, 10); 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid clear_ambient_estimation(spect_dist_info **backchan, int dimen) 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(backchan); 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii = 0; ii < dimen; ii++) 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (backchan[ii]) 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project destroy_spectrum_distribution(backchan[ii]); 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project backchan[ii] = NULL; 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 193