14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  swicms.h                                                                 *
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#ifndef __SWICMS_H__
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define __SWICMS_H__
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"all_defs.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"sizes.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"fronttyp.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"pre_desc.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG_SWICMS        0
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_CACHED_FRAMES 800
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_CACHE_RESOLUTION_DEFAULT   8
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SWICMS_CACHE_SIZE_DEFAULT         100 /* equals #frames/resolution */
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * This is used for casting in debugger, just type (imelvec*)tmn.
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata vec[MAX_CHAN_DIM];
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectimelvec;
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Does channel normalization without using fine recognition segmenation.  It remembers the
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * frames of speech and uses that as a channel mean for the next utterance.  A forget_factor
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * is used to weigh the new speech mean estimate with an older one.
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata tmn [MAX_CHAN_DIM];                 /* target mean */
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata cmn [MAX_CHAN_DIM];                 /* channel mean */
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata lda_tmn [MAX_CHAN_DIM];                 /* target mean */
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata lda_cmn [MAX_CHAN_DIM];                 /* channel mean */
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata adjust[MAX_CHAN_DIM]; /* target less channel */
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int is_valid;
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int forget_factor;           /* in frames, mass of cmn average */
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int sbindex;                 /* speech to background index
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        100 -> use only speech to calculate CMN
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        000 -> use only background to calculate CMN
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        050 -> use half/half ..
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        all numbers in between are acceptable */
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_frames_in_cmn; /* num frames used to estimate cmn (or lda_cmn) */
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* for in-utterance channel normalization */
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  struct {
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int forget_factor2;     /* cmn is given this weight to start off */
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int disable_after;      /* we disable in-utt cms after this many fr*/
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int enable_after;       /* we enable in-utt cms after this many fr*/
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int num_bou_frames_to_skip;   /* don't start accum 'til this many frames */
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int num_frames_since_bou;     /* counter for above, bou=begin-of-utt     */
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int num_frames_in_accum;      /* number of frames in accum */
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata accum[MAX_CHAN_DIM]; /* accumulates frames of the current utt */
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } inutt;
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int cached_num_frames;       /* we cache frames, until recognition is done
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        and can calculate speech mean from these */
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int cache_resolution;        /* we'll avg this many frames per section */
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  imeldata cached_sections[SWICMS_CACHE_SIZE_DEFAULT][MAX_CHAN_DIM];
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*const*/ preprocessed* _prep;
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectswicms_norm_info;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_init(swicms_norm_info* swicms);
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_cache_frame(swicms_norm_info* swicms, imeldata* frame, int dimen);
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint apply_channel_normalization_in_swicms(swicms_norm_info *swicms,
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    imeldata* oframe, imeldata* iframe,
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int dimen);
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_lda_process(swicms_norm_info* swicms, preprocessed* prep);
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_update(swicms_norm_info* swicms, int speech_start_frame, int speech_end_frame);
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_set_cmn(swicms_norm_info *swicms, const LCHAR *new_cmn_params );
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode swicms_get_cmn(swicms_norm_info *swicms, LCHAR *cmn_params, size_t* len );
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG_SWICMS
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_compare(swicms_norm_info* swicms, imeldata* imelda_adjust);
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint swicms_dump_stats(swicms_norm_info* swicms);
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define swicms_compare(swicms,ia)
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define swicms_dump_stats(swicms)
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
108