14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  swicms.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#include <string.h>
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"swicms.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"srec_sizes.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"prelib.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_SessionType.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "IntArrayList.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
31b3adea6f471d03c5bd728725adc7ca1cea89edfdMarcus Oakland#define printf_vector(HEAD, FMT, PTR, NN) { int i; LCHAR buffer[256]; sprintf(buffer, HEAD); sprintf(buffer + LSTRLEN(buffer), " %p", (void *)PTR); for (i=0; i<(NN); ++i) sprintf(buffer + LSTRLEN(buffer), FMT, PTR[i]); PLogMessage(buffer); }
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Cross-utterance CMN calculation:
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   We try to normalize the speech frames before they get to the recognizer.
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   The speech frames are LDA-processed mfcc-with-dynamic feature vectors.
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   We collect these speech frames during recognition. At the end of
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   recognition we exclude the silence frames from the collected data, and
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   generate a new channel average based on the previous average and the new
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   data, using an exponential decay formula.
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   In-utterance CMN calculation:
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   A new short-term average mechanism was introduced, with faster update,
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   to improve recognition on the very first recognition after init or reset.
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   We wait for a minimum number of new data frames to apply this. We also
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   disable the fast updater after some frames, because we assume the
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   cross-utterance estimator to be more reliable, particularly in its
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   ability to exclude silence frames from the calculation.
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* default settings for cross-utterance cms */
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_FORGET_FACTOR_DEFAULT        400 /* effective frms of history */
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_SBINDEX_DEFAULT              100 /* use speech frames only */
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* #define SWICMS_CACHE_RESOLUTION_DEFAULT  see swicms.h */
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* #define SWICMS_CACHE_SIZE_DEFAULT        see swicms.h */
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* default settings for in-utterance cms */
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_FORGET_FACTOR2_DISABLE 65535 /* any large number */
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_FORGET_FACTOR2_DEFAULT SWICMS_INUTT_FORGET_FACTOR2_DISABLE
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* disable this when cross-utt become more reliable */
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_DISABLE_AFTER_FRAMES   200
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* wait while the estimate is poor */
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_INUTT_ENABLE_AFTER_FRAMES    10
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Logging Stuff
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOG_LEVEL 2
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MODULE_NAME L("swicms.c")
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static const char* MTAG = MODULE_NAME;
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char *rcsid = 0 ? (const char *) &rcsid :
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           "$Id: swicms.c,v 1.21.6.16 2008/06/05 19:00:55 stever Exp $";
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_BOOL SWICMS_DEBUG = ESR_FALSE;
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* these are good values from cmn/tmn files */
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_cmn1_8 [MAX_CHAN_DIM] =
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    158, 141,  99, 125, 101, 162, 113, 138, 128, 143, 123, 141,
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  };
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_cmn1_11 [MAX_CHAN_DIM] =
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    163, 121, 120, 114, 124, 139, 144, 108, 150, 119, 146, 124,
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  };
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_tmn1_8 [MAX_CHAN_DIM] =
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  };
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const imeldata gswicms_tmn1_11 [MAX_CHAN_DIM] =
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    108, 138, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  };
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode GetSomeIntsIfAny( const LCHAR* parname, imeldata* parvalue, size_t reqSize)
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, size;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL exists;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  IntArrayList* intList = 0;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionContains(parname, &exists));
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists) {
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_SessionGetProperty(parname, (void**)&intList, TYPES_INTARRAYLIST);
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) {
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* no match will revert to default data already in static array */
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("Error reading %s from session: %s"), parname, ESR_rc2str(rc));
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_FATAL_ERROR;
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (rc == ESR_SUCCESS) {
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, IntArrayListGetSize(intList, &size));
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(size != reqSize) {
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	PLogError(L("Error reading %s from session, expected len %d: %s"), parname, reqSize, ESR_rc2str(rc));
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	return ESR_FATAL_ERROR;
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(reqSize == 1)
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	CHKLOG(rc, IntArrayListGet(intList, 0, parvalue));
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (i=0; i<size; ++i)
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  CHKLOG(rc, IntArrayListGet(intList, i, &parvalue[i]));
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP:
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_init(swicms_norm_info* swicms)
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode    rc = ESR_SUCCESS;
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t            i;
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL          exists, sessionExists;
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t 	    sample_rate;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* defaults */
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->sbindex          = SWICMS_SBINDEX_DEFAULT;
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->cached_num_frames = 0;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->forget_factor    = SWICMS_FORGET_FACTOR_DEFAULT;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->cache_resolution = SWICMS_CACHE_RESOLUTION_DEFAULT;
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->num_frames_in_cmn = 0;
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionExists(&sessionExists));
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (sessionExists)
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {  /* We'll assume this rate is valid or someone else will be complaining.   SteveR */
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_SessionGetSize_t ( L ( "CREC.Frontend.samplerate" ), &sample_rate );
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( rc != ESR_SUCCESS )
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ( rc );
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    sample_rate = 11025;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* init the data structures by copying the static data so that we can have a copy if we need to reset */
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( sample_rate == 8000 )
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for ( i = 0; i < MAX_CHAN_DIM; i++ )
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->cmn [i] = gswicms_cmn1_8 [i];
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->tmn [i] = gswicms_tmn1_8 [i];
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// _lda_*mn below are OK, but are recalculated in swicms_lda_process()
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for ( i = 0; i < MAX_CHAN_DIM; i++ )
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->cmn [i] = gswicms_cmn1_11 [i];
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->tmn [i] = gswicms_tmn1_11 [i];
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// _lda_*mn below are OK, but are recalculated in swicms_lda_process()
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->lda_cmn [i] = 0; /* calculated by swicms_lda_process() */
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->lda_tmn [i] = 0; /* calculated by swicms_lda_process() */
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionExists(&sessionExists));
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (sessionExists)
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const LCHAR* parname = L("CREC.Frontend.swicms.debug");
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, ESR_SessionContains(parname, &exists));
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (exists) {
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_SessionGetBool(parname, &SWICMS_DEBUG);
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (rc != ESR_SUCCESS && rc != ESR_NO_MATCH_ERROR) {
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLOG_DBG_ERROR((L("Error reading %s from session: %s"), parname, ESR_rc2str(rc)));
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.forget_factor"),
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			   &swicms->forget_factor, 1);
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.sbindex"),
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			   &swicms->sbindex, 1);
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn"),
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			   &swicms->cmn[0], MAX_CHAN_DIM);
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( sample_rate == 8000 )
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn8"), &swicms->cmn[0], MAX_CHAN_DIM);
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(rc != ESR_SUCCESS)
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.cmn11"), &swicms->cmn[0], MAX_CHAN_DIM);
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(rc != ESR_SUCCESS)
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny( L("CREC.Frontend.swicms.tmn"),
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			   &swicms->tmn[0], MAX_CHAN_DIM);
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->is_valid = 0;
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MAX_CHAN_DIM; i++)
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    swicms->adjust[i] = 255;
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage("swicms->forget_factor    = %d\n", swicms->forget_factor);
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage("swicms->cache_resolution = %d\n", swicms->cache_resolution);
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage("swicms->sbindex          = %d\n", swicms->sbindex);
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* in-utt cms parameters */
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.forget_factor2 = SWICMS_INUTT_FORGET_FACTOR2_DEFAULT;
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.disable_after  = 200;
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.enable_after   = 10;    /* in-utt is less reliable       */
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.num_bou_frames_to_skip = 20; /* silence frames! see windback */
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.num_frames_since_bou = 0;
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.num_frames_in_accum = 0;
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<MAX_CHAN_DIM; i++) swicms->inutt.accum[i] = 0;
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (sessionExists) {
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.forget_factor2"),
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			  &swicms->inutt.forget_factor2, 1);
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.disable_after"),
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			  &swicms->inutt.disable_after, 1);
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = GetSomeIntsIfAny(L("CREC.Frontend.swicms.inutt.enable_after"),
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			  &swicms->inutt.enable_after, 1);
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) return rc;
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* we need to estimate the in-utt cmn from speech frames only! so let's
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       make sure to skip some frames before collecting data, */
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_SessionContains(L("CREC.Frontend.start_windback"), &exists);
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (exists) {
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ESR_BOOL do_skip_even_frames = ESR_TRUE;
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ESR_SessionGetBool(L("CREC.Frontend.do_skip_even_frames"), &do_skip_even_frames);
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ESR_SessionGetInt(L("CREC.Frontend.start_windback"), &swicms->inutt.num_bou_frames_to_skip);
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if( do_skip_even_frames)
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	swicms->inutt.num_bou_frames_to_skip /= 2;
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->inutt.num_bou_frames_to_skip -= 5; /* ensure spch frames only */
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP:
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_get_cmn ( swicms_norm_info* swicms, LCHAR *cmn_params, size_t* len )
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int dim_count;
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata temp[MAX_CHAN_DIM];
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const size_t INT_LENGTH = 12;
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (  swicms->_prep != NULL )	/* lda exists give them transformed lda. */
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      temp [dim_count] = swicms->lda_cmn [dim_count];
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else	/* lda does not exist give them raw cmn values */
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      temp [dim_count] = swicms->cmn [dim_count];
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for ( dim_count = 0, i = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    i += sprintf( cmn_params + i, dim_count==0 ? "%d" : ",%d", temp [dim_count] );
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (i + INT_LENGTH >= *len) {
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        *len = MAX_CHAN_DIM * (INT_LENGTH + 2) * sizeof(LCHAR);
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return ESR_BUFFER_OVERFLOW;
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_set_cmn ( swicms_norm_info* swicms, const char *cmn_params )
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode    set_status;
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int               length_of_params;
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int               dim_count;
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int               got_word;
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int               current_position;
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              *copy_of_params;
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              *parsed_strings [MAX_CHAN_DIM];
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int               temp_cmn [MAX_CHAN_DIM];
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  length_of_params = strlen ( cmn_params ) + 1;
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  copy_of_params = (char*)MALLOC ( length_of_params, NULL );
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( copy_of_params != NULL )
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    set_status = ESR_SUCCESS;
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    memcpy ( copy_of_params, cmn_params, length_of_params );
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    dim_count = 0;
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    current_position = 0;
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    got_word = 0;
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    parsed_strings [dim_count] = copy_of_params + current_position;
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while ( ( dim_count < MAX_CHAN_DIM ) && ( set_status == ESR_SUCCESS ) )
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      switch ( *( copy_of_params + current_position ) )
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '\0':
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( got_word == 1 )
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( dim_count == ( MAX_CHAN_DIM - 1 ) )
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              dim_count++;
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              PLogError ( "Channel Normalization : Missing Params Must Contain %d Params\n", MAX_CHAN_DIM );
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              set_status = ESR_INVALID_ARGUMENT;
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError ( "Channel Normalization : Missing Params Mus Contain %d Params\n", MAX_CHAN_DIM );
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            set_status = ESR_INVALID_ARGUMENT;
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case ',':
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( got_word == 1 )
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if ( dim_count < ( MAX_CHAN_DIM - 1 ) )
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              dim_count++;
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              *( copy_of_params + current_position) = '\0';
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              current_position++;
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              if ( current_position == length_of_params )
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              {
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                PLogError ( "Channel Normalization : Delimiter At End Of Param String\n" );
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                set_status = ESR_INVALID_ARGUMENT;
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              }
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              parsed_strings [dim_count] = copy_of_params + current_position;
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              got_word = 0;
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            else
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            {
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              set_status = ESR_INVALID_ARGUMENT;
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          else
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            set_status = ESR_INVALID_ARGUMENT;
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '0':
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '1':
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '2':
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '3':
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '4':
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '5':
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '6':
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '7':
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '8':
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case '9':
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          got_word = 1;
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          current_position++;
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if ( current_position == length_of_params )
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          {
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError ( "Channel Normalization : Too Many Params Must Contain %d Params\n", MAX_CHAN_DIM );
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            set_status = ESR_INVALID_ARGUMENT;
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        default:
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          PLogError ( "Channel Normalization : Invalid Param : %c : Params Must Contain Only Digits\n" );
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          set_status = ESR_INVALID_ARGUMENT;
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( set_status == ESR_SUCCESS )
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      dim_count = 0;
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      while ( ( dim_count < MAX_CHAN_DIM ) && (  set_status == ESR_SUCCESS ) )
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        temp_cmn [dim_count] = atoi ( parsed_strings [dim_count] );
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( ( temp_cmn [dim_count] < 0 ) || ( temp_cmn [dim_count] > 255 ) )
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          set_status = ESR_INVALID_ARGUMENT;
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
430451b70dd901181b96a027b1d44e4764a156c0330Christer Fletcher
431451b70dd901181b96a027b1d44e4764a156c0330Christer Fletcher        dim_count++;
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ( set_status == ESR_SUCCESS )
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        for ( dim_count = 0; dim_count < MAX_CHAN_DIM; dim_count++ )
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          swicms->cmn [dim_count] = temp_cmn [dim_count];
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( swicms->_prep != NULL )	/* Set now if NULL it will automatically be set on first utterance */
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          linear_transform_frame(swicms->_prep, swicms->lda_cmn, 1 /*do_shift*/);
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE ( copy_of_params );
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "Channel Normalization Out Of Memory Error\n" );
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    set_status = ESR_OUT_OF_MEMORY;
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->num_frames_in_cmn = 0;
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ( set_status );
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_cache_frame(swicms_norm_info* swicms, imeldata* frame, int dimen)
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata *pcache, *pframe;
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(dimen == MAX_CHAN_DIM);
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  i = swicms->cached_num_frames / swicms->cache_resolution;
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (i < SWICMS_CACHE_SIZE_DEFAULT)
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pcache = swicms->cached_sections[ i];
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (swicms->cached_num_frames % swicms->cache_resolution == 0)
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ = 0;
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pcache -= MAX_CHAN_DIM;
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pframe = frame;
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < MAX_CHAN_DIM; i++) *pcache++ += *pframe++;
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    swicms->cached_num_frames++;
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint apply_channel_normalization_in_swicms(swicms_norm_info *swicms,
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata* oframe,
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata* iframe, int dimen)
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ii;
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(dimen == MAX_CHAN_DIM);
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* IF inutt is activated at all */
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(swicms->inutt.forget_factor2 != SWICMS_INUTT_FORGET_FACTOR2_DISABLE) {
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* AND IF we have not disabled it (due to x-utt more reliable) */
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(swicms->inutt.num_frames_in_accum < swicms->inutt.disable_after) {
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* AND IF we have skipped past the silence frames */
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if( swicms->inutt.num_frames_since_bou >= swicms->inutt.num_bou_frames_to_skip){
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	swicms->inutt.num_frames_in_accum++;
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for(ii=0;ii<dimen;ii++) swicms->inutt.accum[ii] += iframe[ii];
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	/* AND IF we've already seen at least 10 frames (presumably) of speech */
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(swicms->inutt.num_frames_in_accum>swicms->inutt.enable_after) {
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  /* THEN we update the adjustment in-line with the current utterance! */
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  for(ii=0;ii<dimen;ii++) {
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    imeldata denom = ( swicms->inutt.forget_factor2
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			       + swicms->inutt.num_frames_in_accum );
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    /* tmp: weighted average of the old lda_cmn and the new accum */
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    imeldata tmp=(swicms->lda_cmn[ii]*swicms->inutt.forget_factor2
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			  + swicms->inutt.accum[ii] + denom/2) / denom;
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    swicms->adjust[ii] = swicms->lda_tmn[ii] - tmp;
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  }
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  //printf_vector("swicms->adjust2 "," %d",swicms->adjust, dimen);
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    swicms->inutt.num_frames_since_bou++;
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (ii = 0; ii < dimen; ii++)
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    oframe[ii] = MAKEBYTE(iframe[ii] + swicms->adjust[ii]);
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_update(swicms_norm_info* swicms, int speech_start, int speech_end)
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, j;
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int32_t speech_avg[MAX_CHAN_DIM], backgr_avg[MAX_CHAN_DIM], avg[MAX_CHAN_DIM];
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ff;
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int nn, speech_nn, backgr_nn;
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_frames = swicms->cached_num_frames;
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int cache_start, cache_end, backgr_cache_end;
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int sbindex = swicms->sbindex;
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* init for utterance */
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->inutt.num_frames_since_bou = 0;
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->cached_num_frames = 0;
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cache_start = speech_start;
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cache_start -= (cache_start % swicms->cache_resolution);
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cache_start /= swicms->cache_resolution;
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (speech_end == MAXframeID)
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cache_end = SWICMS_CACHE_SIZE_DEFAULT;
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (speech_end < num_frames)
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      cache_end = speech_end;
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      cache_end = num_frames;
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cache_end -= (cache_end % swicms->cache_resolution);
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cache_end /= swicms->cache_resolution;
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (num_frames == 0 || speech_end == 0 || speech_start == speech_end || speech_end == MAXframeID)
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (speech_end != 0 || speech_start != 0)
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError("Warning: speech_bounds (%d,%d) swicms->cached_num_frames (%d)\n",
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                speech_start, speech_end, num_frames);
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (SWICMS_DEBUG) {
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM);
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  backgr_cache_end = (num_frames - num_frames % swicms->cache_resolution) / swicms->cache_resolution;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  speech_nn = (cache_end - cache_start) * swicms->cache_resolution;
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  backgr_nn = backgr_cache_end * swicms->cache_resolution - speech_nn;
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MAX_CHAN_DIM; i++)
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    speech_avg[i] = 0;
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    backgr_avg[i] = 0;
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = cache_start; j < cache_end; j++)
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      speech_avg[i] += swicms->cached_sections[j][i];
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = 0; j < cache_start; j++)
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_avg[i] += swicms->cached_sections[j][i];
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = cache_end; j < backgr_cache_end; j++)
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_avg[i] += swicms->cached_sections[j][i];
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (speech_nn == 0 && backgr_nn > 0)
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_avg[i] /= backgr_nn;
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      speech_avg[i] = backgr_avg[i];
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      speech_nn = backgr_nn;
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (speech_nn > 0 && backgr_nn == 0)
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      speech_avg[i] /= speech_nn;
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_avg[i] = speech_avg[i];
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_nn = speech_nn;
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (speech_nn > 0 && backgr_nn > 0)
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      speech_avg[i] /= speech_nn;
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      backgr_avg[i] /= backgr_nn;
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return 0;
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    avg[i] = (sbindex * speech_avg[i] + (100 - sbindex) * backgr_avg[i] + 50) / 100;
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nn = (sbindex * speech_nn + (100 - sbindex) * backgr_nn + 50) / 100;
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0, ff = 0; i < MAX_CHAN_DIM; i++)
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ff += (swicms->lda_tmn[i] - avg[i]);
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ff /= MAX_CHAN_DIM; /* sum is now the average offset from TMN */
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (ff > 5)
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("Warning: bad utt mean during swicms_update() (moffs=%d)\n", ff);
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //printf_vector("swicms->adjust.rep", " %d", swicms->adjust, MAX_CHAN_DIM);
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ff = swicms->forget_factor;
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (ff < 9999)
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < MAX_CHAN_DIM; i++)
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->lda_cmn[i] = (swicms->lda_cmn[i] * ff + avg[i] * nn + (ff + nn) / 2)  / (ff + nn);
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i];
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (SWICMS_DEBUG)
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      imeldata temp[MAX_CHAN_DIM];
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogMessage("swicms_update() used %d frames (%d-%d)", nn, speech_start, speech_end);
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i];
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* use this dump, to put back into CREC.Frontend.swicms.cmn */
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      printf_vector("swicms.cmn(r)  ", " %d", temp, MAX_CHAN_DIM);
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("swicms.lda_cmn   ", " %d", &swicms.lda_cmn [0], MAX_CHAN_DIM);
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("swicms.lda_tmn   ", " %d", &swicms.lda_tmn [0], MAX_CHAN_DIM);
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("avg.speech    ", " %d", avg, MAX_CHAN_DIM);
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NDEBUG
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->num_frames_in_cmn += nn;
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_lda_process(swicms_norm_info* swicms, preprocessed* prep)
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_tmn[i] = swicms->tmn[i];
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MAX_CHAN_DIM; i++) swicms->lda_cmn[i] = swicms->cmn[i];
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  linear_transform_frame(prep, swicms->lda_tmn, 1 /*do_shift*/);
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  linear_transform_frame(prep, swicms->lda_cmn, 1 /*do_shift*/);
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MAX_CHAN_DIM; i++)
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    swicms->adjust[i] = swicms->lda_tmn[i] - swicms->lda_cmn[i];
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NDEBUG
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //printf_vector("swicms->adjust", " %d", swicms->adjust, MAX_CHAN_DIM);
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->is_valid = 1;
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  swicms->_prep = prep;
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(SWICMS_DEBUG) {
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata temp[MAX_CHAN_DIM];
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf_vector("swicms->cmn     ", " %d", swicms->cmn,     MAX_CHAN_DIM);
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf_vector("swicms->lda_cmn ", " %d", swicms->lda_cmn, MAX_CHAN_DIM);
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //printf_vector("swicms->tmn     ", " %d", swicms->tmn,     MAX_CHAN_DIM);
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //printf_vector("swicms->lda_tmn ", " %d", swicms->lda_tmn, MAX_CHAN_DIM);
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //printf_vector("swicms->adjust  ", " %d", swicms->adjust,  MAX_CHAN_DIM);
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_tmn[i];
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //printf_vector("swicms->tmn(r)  ", " %d", temp, MAX_CHAN_DIM);
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0;i<MAX_CHAN_DIM;i++) temp[i]=swicms->lda_cmn[i];
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    inverse_transform_frame( swicms->_prep, temp, 1 /*do_shift*/);
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf_vector("swicms->cmn(r)  ", " %d", temp, MAX_CHAN_DIM);
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
685