1/*---------------------------------------------------------------------------* 2 * cnorm_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#include <assert.h> 28 29#include "channorm.h" 30#include "prelib.h" 31#ifndef _RTT 32#include "duk_io.h" 33#endif 34#include "portable.h" 35 36#define DEBUG 0 37 38#define ESTIMATE_PERIOD -1 39#define BACK_ESTIMATE_PERIOD 1000 40#define ESTIMATE_PERCENTILE 50 41 42 43static const char cnorm_tr[] = "$Id: cnorm_tr.c,v 1.4.10.6 2007/10/15 18:06:24 dahan Exp $"; 44 45norm_info *create_channel_normalization() 46{ 47 norm_info *channorm; 48 49 channorm = (norm_info *) CALLOC_CLR(1, sizeof(norm_info), "clib.channorm"); 50 return (channorm); 51} 52 53void destroy_channel_normalization(norm_info *channorm) 54{ 55 ASSERT(channorm); 56 FREE((char *)channorm); 57 return; 58} 59 60void apply_channel_normalization_in_imelda(norm_info *channorm, 61 imeldata *outframe, imeldata *frame, 62 int dimen) 63{ 64 int ii; 65 66 ASSERT(channorm); 67 ASSERT(frame); 68 ASSERT(outframe); 69 ASSERT(dimen <= channorm->dim); 70 for (ii = 0; ii < dimen; ii++) 71 outframe[ii] = MAKEBYTE(frame[ii] + channorm->imelda_adjust[ii]); 72 return; 73} 74 75void estimate_normalization_parameters(norm_info *channorm, 76 spect_dist_info **chandata, int dimen) 77{ 78 int ii, adjust; 79 80 ASSERT(channorm); 81 ASSERT(chandata); 82 ASSERT(dimen <= channorm->dim); 83 for (ii = 0; ii < dimen; ii++) 84 if (chandata[ii]) 85 { 86 evaluate_parameters(chandata[ii]); 87 /* The additive expression is due to 88 ** the normalization taking place before the 89 ** utterance object is created 90 */ 91 adjust = mean_normalize_data(chandata[ii], 0); 92 /* channorm->adjust[ii]= adjust; */ 93#if USE_MEDIAN 94 shift_distribution_counts(chandata[ii], adjust); 95#endif 96 shift_parameters(chandata[ii], adjust); 97#if NORM_IN_IMELDA 98 channorm->imelda_adjust[ii] += adjust; 99#else 100 channorm->adjust[ii] += adjust; 101#endif 102 } 103#if NORM_IN_IMELDA 104 channorm->adj_valid = True; 105#if DEBUG 106 log_report("NORM IML: "); 107 for (ii = 0; ii < channorm->dim; ii++) 108 log_report("%d ", channorm->imelda_adjust[ii]); 109 log_report("\n"); 110#endif 111#else 112 channorm->adj_valid = False; 113#if DEBUG 114 log_report("NORM ADJ: "); 115 for (ii = 0; ii < channorm->dim; ii++) 116 log_report("%d ", channorm->adjust[ii]); 117 log_report("\n"); 118#endif 119#endif 120 return; 121} 122 123void setup_channel_normalization(norm_info *channorm, 124 spect_dist_info **chandata, int dimen, 125 int forget_factor) 126{ 127 int ii; 128 129 ASSERT(channorm); 130 ASSERT(chandata); 131 for (ii = 0; ii < dimen; ii++) 132 { 133#if MODEL_BASED || 1 134 chandata[ii] = create_spectrum_distribution( 135 128, 128, 136 0, 255, forget_factor, ESTIMATE_PERIOD, 137 ESTIMATE_PERCENTILE, 10); 138#else 139 chandata[ii] = create_spectrum_distribution( 140 channorm->chan_tgt[ii], channorm->chan_init[ii], 141 0, 511, forget_factor, ESTIMATE_PERIOD, 142 ESTIMATE_PERCENTILE, 10); 143#endif 144 channorm->adjust[ii] = channorm->target[ii] 145 - channorm->init[ii]; 146 } 147 channorm->adj_valid = False; 148 return; 149} 150 151void clear_channel_normalization(spect_dist_info **chandata, int dimen) 152{ 153 int ii; 154 155 ASSERT(chandata); 156 for (ii = 0; ii < dimen; ii++) 157 if (chandata[ii]) 158 { 159 destroy_spectrum_distribution(chandata[ii]); 160 chandata[ii] = NULL; 161 } 162 return; 163} 164 165void setup_ambient_estimation(spect_dist_info **backchan, int dimen, 166 int forget_factor) 167{ 168 int ii; 169 170 ASSERT(backchan); 171 for (ii = 0; ii < dimen; ii++) 172 backchan[ii] = create_spectrum_distribution( 173 0, 0, 0, 255, forget_factor, BACK_ESTIMATE_PERIOD, 174 ESTIMATE_PERCENTILE, 10); 175 return; 176} 177 178void clear_ambient_estimation(spect_dist_info **backchan, int dimen) 179{ 180 int ii; 181 182 ASSERT(backchan); 183 184 for (ii = 0; ii < dimen; ii++) 185 if (backchan[ii]) 186 { 187 destroy_spectrum_distribution(backchan[ii]); 188 backchan[ii] = NULL; 189 } 190 return; 191} 192 193