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
43 static const char cnorm_tr[] = "$Id: cnorm_tr.c,v 1.4.10.6 2007/10/15 18:06:24 dahan Exp $";
44
create_channel_normalization()45 norm_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
destroy_channel_normalization(norm_info * channorm)53 void destroy_channel_normalization(norm_info *channorm)
54 {
55 ASSERT(channorm);
56 FREE((char *)channorm);
57 return;
58 }
59
apply_channel_normalization_in_imelda(norm_info * channorm,imeldata * outframe,imeldata * frame,int dimen)60 void 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
estimate_normalization_parameters(norm_info * channorm,spect_dist_info ** chandata,int dimen)75 void 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
setup_channel_normalization(norm_info * channorm,spect_dist_info ** chandata,int dimen,int forget_factor)123 void 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
clear_channel_normalization(spect_dist_info ** chandata,int dimen)151 void 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
setup_ambient_estimation(spect_dist_info ** backchan,int dimen,int forget_factor)165 void 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
clear_ambient_estimation(spect_dist_info ** backchan,int dimen)178 void 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