From b0a15a0c9eb795c19a8606ef9aa10db0eafec120 Mon Sep 17 00:00:00 2001 From: Ostroukhov Zamir Date: Tue, 16 Feb 2016 17:31:44 +0300 Subject: [PATCH 1/5] added: new algo for cmn --- include/sphinxbase/cmn.h | 16 +++++- include/sphinxbase/feat.h | 6 +-- src/libsphinxbase/feat/Makefile.am | 1 + src/libsphinxbase/feat/cmn.c | 8 ++- src/libsphinxbase/feat/cmn_adapt.c | 58 +++++++++++++++++++++ src/libsphinxbase/feat/feat.c | 4 +- win32/sphinxbase/sphinxbase.vcxproj | 8 ++- win32/sphinxbase/sphinxbase.vcxproj.filters | 12 +++++ 8 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 src/libsphinxbase/feat/cmn_adapt.c diff --git a/include/sphinxbase/cmn.h b/include/sphinxbase/cmn.h index d91555e5..f87a94de 100644 --- a/include/sphinxbase/cmn.h +++ b/include/sphinxbase/cmn.h @@ -110,7 +110,8 @@ extern "C" { typedef enum cmn_type_e { CMN_NONE = 0, CMN_CURRENT, - CMN_PRIOR + CMN_PRIOR, + CMN_ADAPT } cmn_type_t; /** String representations of cmn_type_t values. */ @@ -127,6 +128,7 @@ cmn_type_t cmn_type_from_str(const char *str); typedef struct { mfcc_t *cmn_mean; /**< Temporary variable: current means */ + mfcc_t *max; /**< Temporary variable: current maximums */ mfcc_t *cmn_var; /**< Temporary variables: stored the cmn variance */ mfcc_t *sum; /**< The sum of the cmn frames */ int32 nframe; /**< Number of frames */ @@ -184,6 +186,18 @@ void cmn_prior_get(cmn_t *cmn, mfcc_t *vec); SPHINXBASE_EXPORT void cmn_free (cmn_t *cmn); +/** + * CMN for one block of data, using adapted mean + */ +SPHINXBASE_EXPORT +void cmn_adapt(cmn_t *cmn, /**< In/Out: cmn normalization, which contains + the cmn_mean and cmn_var) */ + mfcc_t **incep, /**< In/Out: mfc[f] = mfc vector in frame f*/ + int32 varnorm, /**< varnorm is supported */ + int32 nfr /**< Number of incoming frames */ + ); + + #ifdef __cplusplus } #endif diff --git a/include/sphinxbase/feat.h b/include/sphinxbase/feat.h index 5f16a646..c7deef09 100644 --- a/include/sphinxbase/feat.h +++ b/include/sphinxbase/feat.h @@ -77,15 +77,15 @@ extern "C" { { "-cmn", \ ARG_STRING, \ "current", \ - "Cepstral mean normalization scheme ('current', 'prior', or 'none')" }, \ + "Cepstral mean normalization scheme ('current', 'prior', 'adapt' or 'none')" }, \ { "-cmninit", \ ARG_STRING, \ "8.0", \ - "Initial values (comma-separated) for cepstral mean when 'prior' is used" }, \ + "Initial values (comma-separated) for cepstral mean when 'prior' or 'adapt' is used" }, \ { "-varnorm", \ ARG_BOOLEAN, \ "no", \ - "Variance normalize each utterance (only if CMN == current)" }, \ + "Variance normalize each utterance (only if CMN == 'current' or 'adapt')" }, \ { "-agc", \ ARG_STRING, \ "none", \ diff --git a/src/libsphinxbase/feat/Makefile.am b/src/libsphinxbase/feat/Makefile.am index a2ad62d5..42893f3d 100644 --- a/src/libsphinxbase/feat/Makefile.am +++ b/src/libsphinxbase/feat/Makefile.am @@ -4,6 +4,7 @@ libsphinxfeat_la_SOURCES = \ agc.c \ cmn.c \ cmn_prior.c \ + cmn_adapt.c \ lda.c \ feat.c diff --git a/src/libsphinxbase/feat/cmn.c b/src/libsphinxbase/feat/cmn.c index c133c19a..8bd19f65 100644 --- a/src/libsphinxbase/feat/cmn.c +++ b/src/libsphinxbase/feat/cmn.c @@ -110,7 +110,8 @@ const char *cmn_type_str[] = { "none", "current", - "prior" + "prior", + "adapt" }; static const int n_cmn_type_str = sizeof(cmn_type_str)/sizeof(cmn_type_str[0]); @@ -136,8 +137,10 @@ cmn_init(int32 veclen) cmn->cmn_mean = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); cmn->cmn_var = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); cmn->sum = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->max = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); /* A front-end dependent magic number */ cmn->cmn_mean[0] = FLOAT2MFCC(12.0); + cmn->max[0] = FLOAT2MFCC(24.0); cmn->nframe = 0; E_INFO("mean[0]= %.2f, mean[1..%d]= 0.0\n", MFCC2FLOAT(cmn->cmn_mean[0]), veclen - 1); @@ -233,6 +236,9 @@ cmn_free(cmn_t * cmn) if (cmn->sum) ckd_free((void *) cmn->sum); + if (cmn->max) + ckd_free((void *) cmn->max); + ckd_free((void *) cmn); } } diff --git a/src/libsphinxbase/feat/cmn_adapt.c b/src/libsphinxbase/feat/cmn_adapt.c new file mode 100644 index 00000000..bf43053c --- /dev/null +++ b/src/libsphinxbase/feat/cmn_adapt.c @@ -0,0 +1,58 @@ +/* + * 26-Feb-2016 Zamir Ostroukhov (zamiron@gmail.com) + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4244) +#endif + +#include "sphinxbase/ckd_alloc.h" +#include "sphinxbase/cmn.h" + +void +cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) +{ + int32 i, j; + mfcc_t cep_cur[cmn->veclen]; // is it correctly? + + if (nfr <= 0) + return; + + for (j = 0; j < cmn->veclen; j++) + { + cep_cur[j] = 0.0f; + for (i = 0; i < nfr; i++) + if ( abs(incep[i][j]) > cep_cur[j] ) { cep_cur[j] = abs(incep[i][j]); } + + mfcc_t u_prob = ( cep_cur[j] / cmn->max[j] ) * 0.1f; + if ( u_prob < 0.0f ) { u_prob = 0.0f; } + if ( u_prob > 0.1f ) { u_prob = 0.1f; } + + cmn->max[j] = cep_cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); + } + + mfcc_t prob0 = ( cep_cur[0] / cmn->max[0] ) * 0.01f; + if ( prob0 > 0.01 ) { prob0 = 0.01f; } + + for (i = 0; i < nfr; i++) { + + if ( cep_cur[0] > cmn->max[0] ) + cmn->max[0] = cep_cur[0] * prob0 + cmn->max[0] * (1.0f-prob0); + + mfcc_t e_prob = incep[i][0] / cmn->max[0] * 0.001f; + + for (j = 0; j < cmn->veclen; j++) { + cmn->sum[j] += incep[i][j]; // save compatibility with prior method + cmn->cmn_mean[j] = ( incep[i][j] * e_prob ) + ( cmn->cmn_mean[j] * (1.0f-e_prob) ); + incep[i][j] -= cmn->cmn_mean[j]; + if (varnorm) + incep[i][j] /= cmn->max[j]; + } + + ++cmn->nframe; // save compatibility with prior method + } +} diff --git a/src/libsphinxbase/feat/feat.c b/src/libsphinxbase/feat/feat.c index d2252fd8..57be1cc7 100644 --- a/src/libsphinxbase/feat/feat.c +++ b/src/libsphinxbase/feat/feat.c @@ -918,7 +918,7 @@ feat_cmn(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) cmn_type_t cmn_type = fcb->cmn; if (!(beginutt && endutt) - && cmn_type != CMN_NONE) /* Only cmn_prior in block computation mode. */ + && cmn_type != CMN_NONE && cmn_type != CMN_ADAPT ) /* Only cmn_prior in block computation mode. */ fcb->cmn = cmn_type = CMN_PRIOR; switch (cmn_type) { @@ -929,6 +929,8 @@ feat_cmn(feat_t *fcb, mfcc_t **mfc, int32 nfr, int32 beginutt, int32 endutt) cmn_prior(fcb->cmn_struct, mfc, fcb->varnorm, nfr); if (endutt) cmn_prior_update(fcb->cmn_struct); + case CMN_ADAPT: + cmn_adapt(fcb->cmn_struct, mfc, fcb->varnorm, nfr); break; default: ; diff --git a/win32/sphinxbase/sphinxbase.vcxproj b/win32/sphinxbase/sphinxbase.vcxproj index 7a97cdf8..68c40d1b 100755 --- a/win32/sphinxbase/sphinxbase.vcxproj +++ b/win32/sphinxbase/sphinxbase.vcxproj @@ -62,7 +62,7 @@ MaxSpeed AnySuitable ../../include/win32;../../include;%(AdditionalIncludeDirectories) - NDEBUG;_USRDLL;SPHINX_DLL;SPHINXBASE_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + NDEBUG;_USRDLL;SPHINXBASE_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) MultiThreadedDLL true .\$(Configuration)\$(Platform)/sphinxbase.pch @@ -102,7 +102,7 @@ Disabled ../../include/win32;../../include;%(AdditionalIncludeDirectories) - _DEBUG;_USRDLL;SPHINX_DLL;SPHINXBASE_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + _DEBUG;_USRDLL;SPHINXBASE_EXPORTS;HAVE_CONFIG_H;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -137,6 +137,7 @@ + @@ -174,6 +175,7 @@ + @@ -209,11 +211,13 @@ + + diff --git a/win32/sphinxbase/sphinxbase.vcxproj.filters b/win32/sphinxbase/sphinxbase.vcxproj.filters index a80d32e2..25989464 100755 --- a/win32/sphinxbase/sphinxbase.vcxproj.filters +++ b/win32/sphinxbase/sphinxbase.vcxproj.filters @@ -35,6 +35,9 @@ Source Files + + Source Files + Source Files @@ -86,6 +89,9 @@ Source Files + + Source Files + Source Files @@ -247,6 +253,9 @@ Header Files + + Header Files + Header Files @@ -271,6 +280,9 @@ Header Files + + Header Files + Header Files From 5047a5e85d3ee89682e354ed39674ccf80d7ed08 Mon Sep 17 00:00:00 2001 From: Ostroukhov Zamir Date: Tue, 16 Feb 2016 21:34:42 +0300 Subject: [PATCH 2/5] requirement of stylistics --- src/libsphinxbase/feat/cmn_adapt.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/libsphinxbase/feat/cmn_adapt.c b/src/libsphinxbase/feat/cmn_adapt.c index bf43053c..034f07c6 100644 --- a/src/libsphinxbase/feat/cmn_adapt.c +++ b/src/libsphinxbase/feat/cmn_adapt.c @@ -1,5 +1,5 @@ /* - * 26-Feb-2016 Zamir Ostroukhov (zamiron@gmail.com) + * 16-Feb-2016 Zamir Ostroukhov */ #ifdef HAVE_CONFIG_H @@ -14,29 +14,32 @@ #include "sphinxbase/cmn.h" void -cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) -{ +cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) { + int32 i, j; - mfcc_t cep_cur[cmn->veclen]; // is it correctly? + mfcc_t cep_cur[cmn->veclen]; // check it please, is it correctly? if (nfr <= 0) return; - for (j = 0; j < cmn->veclen; j++) - { + for (j = 0; j < cmn->veclen; j++) { cep_cur[j] = 0.0f; for (i = 0; i < nfr; i++) - if ( abs(incep[i][j]) > cep_cur[j] ) { cep_cur[j] = abs(incep[i][j]); } + if ( abs(incep[i][j]) > cep_cur[j] ) + cep_cur[j] = abs(incep[i][j]); mfcc_t u_prob = ( cep_cur[j] / cmn->max[j] ) * 0.1f; - if ( u_prob < 0.0f ) { u_prob = 0.0f; } - if ( u_prob > 0.1f ) { u_prob = 0.1f; } + if ( u_prob < 0.0f ) + u_prob = 0.0f; + if ( u_prob > 0.1f ) + u_prob = 0.1f; cmn->max[j] = cep_cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); } mfcc_t prob0 = ( cep_cur[0] / cmn->max[0] ) * 0.01f; - if ( prob0 > 0.01 ) { prob0 = 0.01f; } + if ( prob0 > 0.01 ) + prob0 = 0.01f; for (i = 0; i < nfr; i++) { @@ -46,13 +49,13 @@ cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) mfcc_t e_prob = incep[i][0] / cmn->max[0] * 0.001f; for (j = 0; j < cmn->veclen; j++) { - cmn->sum[j] += incep[i][j]; // save compatibility with prior method + cmn->sum[j] += incep[i][j]; // save compatibility with prior method, you can to remove it cmn->cmn_mean[j] = ( incep[i][j] * e_prob ) + ( cmn->cmn_mean[j] * (1.0f-e_prob) ); incep[i][j] -= cmn->cmn_mean[j]; if (varnorm) incep[i][j] /= cmn->max[j]; } - ++cmn->nframe; // save compatibility with prior method + ++cmn->nframe; // save compatibility with prior method, you can to remove it } } From 560167fbbea443158aa58c07437d6c99ff73c2b8 Mon Sep 17 00:00:00 2001 From: Ostroukhov Zamir Date: Tue, 16 Feb 2016 22:41:31 +0300 Subject: [PATCH 3/5] fixed some predicted errors --- src/libsphinxbase/feat/cmn_adapt.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/libsphinxbase/feat/cmn_adapt.c b/src/libsphinxbase/feat/cmn_adapt.c index 034f07c6..f64ccc97 100644 --- a/src/libsphinxbase/feat/cmn_adapt.c +++ b/src/libsphinxbase/feat/cmn_adapt.c @@ -28,16 +28,30 @@ cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) { if ( abs(incep[i][j]) > cep_cur[j] ) cep_cur[j] = abs(incep[i][j]); - mfcc_t u_prob = ( cep_cur[j] / cmn->max[j] ) * 0.1f; - if ( u_prob < 0.0f ) - u_prob = 0.0f; - if ( u_prob > 0.1f ) - u_prob = 0.1f; + if ( cep_cur[j] == 0.0f ) + cep_cur[j] = 0.0001f; + + if ( cmn->max[j] == 0.0f ) + cmn->max[j] = cep_cur[j] * 1.1f; + + if ( cep_cur[j] > cmn->max[j] * 2.0f ) { + + cmn->max[j] = cep_cur[j] * 1.1f; + + } else { + + mfcc_t u_prob = ( cep_cur[j] / cmn->max[j] ) * 0.1f; + + if ( u_prob > 0.1f ) + u_prob = 0.1f; + + cmn->max[j] = cep_cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); + } - cmn->max[j] = cep_cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); } mfcc_t prob0 = ( cep_cur[0] / cmn->max[0] ) * 0.01f; + if ( prob0 > 0.01 ) prob0 = 0.01f; From ef1fef528956d07e0479aa6a1d3236508b6c7275 Mon Sep 17 00:00:00 2001 From: Ostroukhov Zamir Date: Tue, 16 Feb 2016 22:53:33 +0300 Subject: [PATCH 4/5] fix predicted error --- src/libsphinxbase/feat/cmn_adapt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libsphinxbase/feat/cmn_adapt.c b/src/libsphinxbase/feat/cmn_adapt.c index f64ccc97..9381c63c 100644 --- a/src/libsphinxbase/feat/cmn_adapt.c +++ b/src/libsphinxbase/feat/cmn_adapt.c @@ -60,7 +60,13 @@ cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) { if ( cep_cur[0] > cmn->max[0] ) cmn->max[0] = cep_cur[0] * prob0 + cmn->max[0] * (1.0f-prob0); - mfcc_t e_prob = incep[i][0] / cmn->max[0] * 0.001f; + mfcc_t e_prob; + + if ( incep[i][0] <= 0.0f ) { + e_prob = 0.0f; + } else { + e_prob = incep[i][0] / cmn->max[0] * 0.001f; + } for (j = 0; j < cmn->veclen; j++) { cmn->sum[j] += incep[i][j]; // save compatibility with prior method, you can to remove it From f4c72d9e0520a965fe6c70fa50c99806865c9f56 Mon Sep 17 00:00:00 2001 From: Ostroukhov Zamir Date: Wed, 17 Feb 2016 11:59:11 +0300 Subject: [PATCH 5/5] fixed comments written by Nikolay --- include/sphinxbase/cmn.h | 1 + src/libsphinxbase/feat/cmn.c | 4 +++ src/libsphinxbase/feat/cmn_adapt.c | 49 ++++++++++++++++++------------ 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/include/sphinxbase/cmn.h b/include/sphinxbase/cmn.h index f87a94de..9a9f22c9 100644 --- a/include/sphinxbase/cmn.h +++ b/include/sphinxbase/cmn.h @@ -129,6 +129,7 @@ cmn_type_t cmn_type_from_str(const char *str); typedef struct { mfcc_t *cmn_mean; /**< Temporary variable: current means */ mfcc_t *max; /**< Temporary variable: current maximums */ + mfcc_t *cur; /**< Temporary variable: local maximums */ mfcc_t *cmn_var; /**< Temporary variables: stored the cmn variance */ mfcc_t *sum; /**< The sum of the cmn frames */ int32 nframe; /**< Number of frames */ diff --git a/src/libsphinxbase/feat/cmn.c b/src/libsphinxbase/feat/cmn.c index 8bd19f65..51e7e295 100644 --- a/src/libsphinxbase/feat/cmn.c +++ b/src/libsphinxbase/feat/cmn.c @@ -138,6 +138,7 @@ cmn_init(int32 veclen) cmn->cmn_var = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); cmn->sum = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); cmn->max = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); + cmn->cur = (mfcc_t *) ckd_calloc(veclen, sizeof(mfcc_t)); /* A front-end dependent magic number */ cmn->cmn_mean[0] = FLOAT2MFCC(12.0); cmn->max[0] = FLOAT2MFCC(24.0); @@ -239,6 +240,9 @@ cmn_free(cmn_t * cmn) if (cmn->max) ckd_free((void *) cmn->max); + if (cmn->cur) + ckd_free((void *) cmn->cur); + ckd_free((void *) cmn); } } diff --git a/src/libsphinxbase/feat/cmn_adapt.c b/src/libsphinxbase/feat/cmn_adapt.c index 9381c63c..fff461ff 100644 --- a/src/libsphinxbase/feat/cmn_adapt.c +++ b/src/libsphinxbase/feat/cmn_adapt.c @@ -1,4 +1,6 @@ /* + * Warning: supporting only floating point operations + * * 16-Feb-2016 Zamir Ostroukhov */ @@ -13,64 +15,71 @@ #include "sphinxbase/ckd_alloc.h" #include "sphinxbase/cmn.h" +/* You can change it for best result */ +#define ZERO_SUBSTITUTION 0.0000001f +#define COEF_MEAN_PER_FRAME 0.001f /* speed ratio adaptation for mean (per frame) */ +#define COEF_POWER_PER_FRAME 0.01f /* speed ratio adaptation for max power (per frame) */ +#define COEF_MAX_PER_CALL 0.1f /* speed ratio adaptation for maximums (per function call) */ +#define COEF_MAX_PER_ERROR 1.1f /* speed ratio adaptation for maximums, when an error is detected (per function call) */ +#define THRESHOLD_MAX_ERROR 2.0f /* threshold for error detector */ + void cmn_adapt(cmn_t *cmn, mfcc_t **incep, int32 varnorm, int32 nfr) { int32 i, j; - mfcc_t cep_cur[cmn->veclen]; // check it please, is it correctly? if (nfr <= 0) return; for (j = 0; j < cmn->veclen; j++) { - cep_cur[j] = 0.0f; + cmn->cur[j] = 0.0f; for (i = 0; i < nfr; i++) - if ( abs(incep[i][j]) > cep_cur[j] ) - cep_cur[j] = abs(incep[i][j]); + if ( abs(incep[i][j]) > cmn->cur[j] ) + cmn->cur[j] = abs(incep[i][j]); - if ( cep_cur[j] == 0.0f ) - cep_cur[j] = 0.0001f; + if ( cmn->cur[j] == 0.0f ) + cmn->cur[j] = ZERO_SUBSTITUTION; if ( cmn->max[j] == 0.0f ) - cmn->max[j] = cep_cur[j] * 1.1f; + cmn->max[j] = cmn->cur[j] * COEF_MAX_PER_ERROR; - if ( cep_cur[j] > cmn->max[j] * 2.0f ) { + if ( cmn->cur[j] > cmn->max[j] * THRESHOLD_MAX_ERROR ) { - cmn->max[j] = cep_cur[j] * 1.1f; + cmn->max[j] = cmn->cur[j] * COEF_MAX_PER_ERROR; } else { - mfcc_t u_prob = ( cep_cur[j] / cmn->max[j] ) * 0.1f; + mfcc_t u_prob = ( cmn->cur[j] / cmn->max[j] ) * COEF_MAX_PER_CALL; - if ( u_prob > 0.1f ) - u_prob = 0.1f; + if ( u_prob > COEF_MAX_PER_CALL ) + u_prob = COEF_MAX_PER_CALL; - cmn->max[j] = cep_cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); + cmn->max[j] = cmn->cur[j] * u_prob + cmn->max[j] * (1.0f-u_prob); } } - mfcc_t prob0 = ( cep_cur[0] / cmn->max[0] ) * 0.01f; + mfcc_t prob0 = ( cmn->cur[0] / cmn->max[0] ) * COEF_POWER_PER_FRAME; - if ( prob0 > 0.01 ) - prob0 = 0.01f; + if ( prob0 > COEF_POWER_PER_FRAME ) + prob0 = COEF_POWER_PER_FRAME; for (i = 0; i < nfr; i++) { - if ( cep_cur[0] > cmn->max[0] ) - cmn->max[0] = cep_cur[0] * prob0 + cmn->max[0] * (1.0f-prob0); + if ( cmn->cur[0] > cmn->max[0] ) + cmn->max[0] = cmn->cur[0] * prob0 + cmn->max[0] * (1.0f-prob0); mfcc_t e_prob; if ( incep[i][0] <= 0.0f ) { e_prob = 0.0f; } else { - e_prob = incep[i][0] / cmn->max[0] * 0.001f; + e_prob = incep[i][0] / cmn->max[0] * COEF_MEAN_PER_FRAME; } for (j = 0; j < cmn->veclen; j++) { cmn->sum[j] += incep[i][j]; // save compatibility with prior method, you can to remove it - cmn->cmn_mean[j] = ( incep[i][j] * e_prob ) + ( cmn->cmn_mean[j] * (1.0f-e_prob) ); + cmn->cmn_mean[j] = incep[i][j] * e_prob + cmn->cmn_mean[j] * (1.0f-e_prob); incep[i][j] -= cmn->cmn_mean[j]; if (varnorm) incep[i][j] /= cmn->max[j];