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