@@ -23,15 +23,14 @@ void quant_mbest(float vec_out[],
2323 int indexes [],
2424 float vec_in [],
2525 int num_stages ,
26- float vq [], float vqsq [],
26+ float vq [],
2727 int m [], int k ,
2828 int mbest_survivors , int st , int en );
2929
3030int verbose = 0 ;
3131
3232int main (int argc , char * argv []) {
3333 float vq [MAX_STAGES * MAX_K * MAX_ENTRIES ];
34- float vqsq [MAX_STAGES * MAX_ENTRIES ];
3534 int m [MAX_STAGES ];
3635 int k = 0 , mbest_survivors = 1 , num_stages = 0 ;
3736 char fnames [256 ], fn [256 ], * comma , * p ;
@@ -144,15 +143,25 @@ int main(int argc, char *argv[]) {
144143 if (st == -1 ) st = 0 ;
145144 if (en == -1 ) en = k - 1 ;
146145
147- /* precompute vqsq table for efficient search */
146+ float w [k ];
147+ for (int i = 0 ; i < st ; i ++ )
148+ w [i ] = 0.0 ;
149+ for (int i = st ; i <=en ; i ++ )
150+ w [i ] = 1.0 ;
151+ for (int i = en + 1 ; i < k ; i ++ )
152+ w [i ] = 0.0 ;
153+
154+ /* apply weighting to codebook (rather than in search) */
148155 for (int s = 0 ; s < num_stages ; s ++ )
149- mbest_precompute_cbsq ( & vqsq [ s * MAX_ENTRIES ], & vq [s * k * MAX_ENTRIES ], k , m [s ]);
156+ mbest_precompute_weight ( & vq [s * k * MAX_ENTRIES ], w , k , m [s ]);
150157
151- int indexes [num_stages ], nvecs = 0 ; int vec_usage [m [0 ]];
158+ int indexes [num_stages ], nvecs = 0 ; int vec_usage [m [0 ]];
152159 for (int i = 0 ; i < m [0 ]; i ++ ) vec_usage [i ] = 0 ;
153160 float target [k ], quantised [k ];
154161 float sqe = 0.0 ;
155162 while (fread (& target , sizeof (float ), k , stdin ) && (nvecs < num )) {
163+ for (int i = 0 ; i < k ; i ++ )
164+ target [i ] *= w [i ];
156165 int dont_count = 0 ;
157166 /* optional clamping to lower limit or mean */
158167 float mean = 0.0 ;
@@ -166,7 +175,7 @@ int main(int argc, char *argv[]) {
166175 target [i ] += - difference ;
167176 dont_count = 1 ;
168177 }
169- quant_mbest (quantised , indexes , target , num_stages , vq , vqsq , m , k , mbest_survivors , st , en );
178+ quant_mbest (quantised , indexes , target , num_stages , vq , m , k , mbest_survivors , st , en );
170179 if (dont_count == 0 ) {
171180 for (int i = st ; i <=en ; i ++ )
172181 sqe += pow (target [i ]- quantised [i ], 2.0 );
@@ -206,11 +215,10 @@ void quant_mbest(float vec_out[],
206215 float vec_in [],
207216 int num_stages ,
208217 float vq [],
209- float vqsq [],
210218 int m [], int k ,
211219 int mbest_survivors , int st , int en )
212220{
213- float err [k ], w [ k ], se1 ;
221+ float err [k ], se1 ;
214222 int i ,j ,s ,s1 ,ind ;
215223
216224 struct MBEST * mbest_stage [num_stages ];
@@ -222,23 +230,17 @@ void quant_mbest(float vec_out[],
222230 index [i ] = 0 ;
223231 }
224232
225- for (i = 0 ; i < st ; i ++ )
226- w [i ] = 0.0 ;
227- for (i = st ; i <=en ; i ++ )
228- w [i ] = 1.0 ;
229- for (i = en + 1 ; i < k ; i ++ )
230- w [i ] = 0.0 ;
231233 se1 = 0.0 ;
232234 for (i = 0 ; i < k ; i ++ ) {
233235 err [i ] = vec_in [i ];
234- se1 += err [i ]* err [i ]* w [ i ] * w [ i ] ;
236+ se1 += err [i ]* err [i ];
235237 }
236238 se1 /= k ;
237239
238240 /* now quantise err[] using multi-stage mbest search, preserving
239241 mbest_survivors at each stage */
240242
241- mbest_search (vq , vqsq , err , w , k , m [0 ], mbest_stage [0 ], index );
243+ mbest_search (vq , err , k , m [0 ], mbest_stage [0 ], index );
242244 if (verbose ) mbest_print ("Stage 1:" , mbest_stage [0 ]);
243245
244246 for (s = 1 ; s < num_stages ; s ++ ) {
@@ -260,7 +262,7 @@ void quant_mbest(float vec_out[],
260262 }
261263 }
262264 pv (" target: " , target , k );
263- mbest_search (& vq [s * k * MAX_ENTRIES ], & vqsq [ s * MAX_ENTRIES ], target , w , k , m [s ], mbest_stage [s ], index );
265+ mbest_search (& vq [s * k * MAX_ENTRIES ], target , k , m [s ], mbest_stage [s ], index );
264266 }
265267 char str [80 ]; sprintf (str ,"Stage %d:" , s + 1 );
266268 if (verbose ) mbest_print (str , mbest_stage [s ]);
@@ -279,7 +281,7 @@ void quant_mbest(float vec_out[],
279281 for (i = 0 ; i < k ; i ++ ) {
280282 err [i ] -= vq [s * k * MAX_ENTRIES + ind * k + i ];
281283 vec_out [i ] += vq [s * k * MAX_ENTRIES + ind * k + i ];
282- se2 += err [i ]* err [i ]* w [ i ] * w [ i ] ;
284+ se2 += err [i ]* err [i ];
283285 }
284286 se2 /= k ;
285287 pv (" err: " , err , k );
0 commit comments