#include "SV_UnbiasedMMSE.h"
#include "SV_basic_op.h"
#define SRCB_C_CODE_REARRANGED

#define MMSE_DYNAMIC_Q 1

#define BANDV 1 // 1: overlab (need memory optimization), 2: simple version(no overlap)
//#define BSH_DEBUG
#if defined (_WIN32) && defined(BSH_DEBUG)
#include <stdio.h>
extern frmCnt;
#define DEBUG_UNBIASED_MMSE
#endif
//%mmse_state = Unbiased_MMSE_init(Fframe);
//here Fframe == 257, for future SWB/NB usage

typedef long long INT64;
#define SMULL( a,   b )\
    ((INT64)(a)*(INT64)(b))
#define ABS(a) (((a)>0)?(a):(-a))

#define WB_FREQ_SIZE 257
#define BAND_PWR_Q (15)
#define NPSD_Q (18) // the initial value should be considered
#define SNR_Q 12
//#define band_N 20
#define band_N 12
#define NOISELEVEL_BAND_N 10
#define NOISELEVEL_BAND_N_REV 3277 // Q15

#define NOISELEVEL0_THD 1654 // -22dB (Q18)
#define NOISELEVEL1_THD 82897 // -12dB
#define NOISELEVEL2_THD 262144 // -0dB

#define NPSD_ALPHA_MAX 29491

#ifndef NULL
#define NULL ((void*)0)
#endif

#if BANDV == 1
#if 0
static const short freq2band_mat[band_N][WB_FREQ_SIZE]  = //Q15
{32767, 32767, 32767, 32767, 32767, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 16384, 32767, 32767, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 16384, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16384, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16384, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16384, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 21845, 10923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10923, 21845, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 21845, 10923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10923, 21845, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 21845, 10923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10923, 21845, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 24576, 16384, 8192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8192, 16384, 24576, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 24576, 16384, 8192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8192, 16384, 24576, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 26214, 19661, 13107, 6554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6554, 13107, 19661, 26214, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 27307, 21845, 16384, 10923, 5461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5461, 10923, 16384, 21845, 27307, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0 };
}
#else
#ifndef SRCB_C_CODE_REARRANGED //SRCB C code re-arranged
static const short freq2band_mat[band_N][WB_FREQ_SIZE]  = //Q15
{
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 24575, 16384, 8192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 8192, 16384, 24575, 32767, 32767, 32767, 32767, 24575, 16384, 8192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8192, 16384, 24575, 32767, 32767, 32767, 32767, 26214, 19660, 13107, 6553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6553, 13107, 19660, 26214, 32767, 32767, 32767, 32767, 32767, 32767, 27306, 21845, 16384, 10922, 5461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5461, 10922, 16384, 21845, 27306, 32767, 32767, 32767, 32767, 32767, 32767, 28671, 24575, 20479, 16384, 12288, 8192, 4096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4096, 8192, 12288, 16384, 20479, 24575, 28671, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 29490, 26214, 22937, 19660, 16384, 13107, 9830, 6553, 3277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3277, 6553, 9830, 13107, 16384, 19660, 22937, 26214, 29490, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 30036, 27306, 24575, 21845, 19114, 16384, 13653, 10922, 8192, 5461, 2731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2731, 5461, 8192, 10922, 13653, 16384, 19114, 21845, 24575, 27306, 30036, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 30583, 28398, 26214, 24029, 21845, 19660, 17476, 15291, 13107, 10922, 8738, 6553, 4369, 2184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2184, 4369, 6553, 8738, 10922, 13107, 15291, 17476, 19660, 21845, 24029, 26214, 28398, 30583, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 30947, 29126, 27306, 25485, 23665, 21845, 20024, 18204, 16384, 14563, 12743, 10922, 9102, 7282, 5461, 3641, 1820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1820, 3641, 5461, 7282, 9102, 10922, 12743, 14563, 16384, 18204, 20024, 21845, 23665, 25485, 27306, 29126, 30947, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 31278, 29788, 28299, 26809, 25320, 23831, 22341, 20852, 19362, 17873, 16384, 14894, 13405, 11915, 10426, 8936, 7447, 5958, 4468, 2979, 1489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1489, 2979, 4468, 5958, 7447, 8936, 10426, 11915, 13405, 14894, 16384, 17873, 19362, 20852, 22341, 23831, 25320, 26809, 28299, 29788, 31278, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 31597, 30427, 29256, 28086, 26916, 25746, 24575, 23405, 22235, 21065, 19894, 18724, 17554, 16384, 15213, 14043, 12873, 11703, 10532, 9362, 8192, 7022, 5851, 4681, 3511, 2341, 1170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1170, 2341, 3511, 4681, 5851, 7022, 8192, 9362, 10532, 11703, 12873, 14043, 15213, 16384, 17554, 18724, 19894, 21065, 22235, 23405, 24575, 25746, 26916, 28086, 29256, 30427, 31597, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0
};
#else
static short freq2band_mat_index[band_N][3] =
{
	//band_start_index, band_length, gain_start_index
	{ 0, 10, 0 },
	{ 7, 10, 10 },
	{ 14, 11, 20 },
	{ 21, 15, 31 },
	{ 31, 18, 46 },
	{ 42, 24, 64 },
	{ 57, 29, 88 },
	{ 75, 35, 117 },
	{ 96, 43, 152 },
	{ 122, 53, 195 },
	{ 154, 67, 248 },
	{ 194, 62, 315 },
};
static short freq2band_mat_gain[377] =
{
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 24575, 16384, 8192,

	8192, 16384, 24575, 32767, 32767, 32767, 32767, 24575, 16384, 8192,

	8192, 16384, 24575, 32767, 32767, 32767, 32767, 26214, 19660, 13107,
	6553,

	6553, 13107, 19660, 26214, 32767, 32767, 32767, 32767, 32767, 32767,
	27306, 21845, 16384, 10922, 5461,

	5461, 10922, 16384, 21845, 27306, 32767, 32767, 32767, 32767, 32767,
	32767, 28671, 24575, 20479, 16384, 12288, 8192, 4096,

	4096, 8192, 12288, 16384, 20479, 24575, 28671, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 29490, 26214, 22937, 19660, 16384,
	13107, 9830, 6553, 3277,

	3277, 6553, 9830, 13107, 16384, 19660, 22937, 26214, 29490, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 30036, 27306,
	24575, 21845, 19114, 16384, 13653, 10922, 8192, 5461, 2731,

	2731, 5461, 8192, 10922, 13653, 16384, 19114, 21845, 24575, 27306,
	30036, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 30583, 28398, 26214, 24029, 21845, 19660, 17476, 15291, 13107,
	10922, 8738, 6553, 4369, 2184,

	2184, 4369, 6553, 8738, 10922, 13107, 15291, 17476, 19660, 21845,
	24029, 26214, 28398, 30583, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 30947, 29126, 27306, 25485,
	23665, 21845, 20024, 18204, 16384, 14563, 12743, 10922, 9102, 7282,
	5461, 3641, 1820,

	1820, 3641, 5461, 7282, 9102, 10922, 12743, 14563, 16384, 18204,
	20024, 21845, 23665, 25485, 27306, 29126, 30947, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767, 31278, 29788, 28299, 26809, 25320, 23831, 22341, 20852,
	19362, 17873, 16384, 14894, 13405, 11915, 10426, 8936, 7447, 5958,
	4468, 2979, 1489,

	1489, 2979, 4468, 5958, 7447, 8936, 10426, 11915, 13405, 14894,
	16384, 17873, 19362, 20852, 22341, 23831, 25320, 26809, 28299, 29788,
	31278, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	31597, 30427, 29256, 28086, 26916, 25746, 24575, 23405, 22235, 21065,
	19894, 18724, 17554, 16384, 15213, 14043, 12873, 11703, 10532, 9362,
	8192, 7022, 5851, 4681, 3511, 2341, 1170,

	1170, 2341, 3511, 4681, 5851, 7022, 8192, 9362, 10532, 11703,
	12873, 14043, 15213, 16384, 17554, 18724, 19894, 21065, 22235, 23405,
	24575, 25746, 26916, 28086, 29256, 30427, 31597, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
	32767, 32767,
};
static short band2freq_mat_index[22] =
{
	7, 10,
	14, 17,
	21, 25,
	31, 36,
	42, 49,
	57, 66,
	75, 86,
	96, 110,
	122, 139,
	154, 175,
	194, 221,
};
static short band2freq_mat_gain[121] =
{
	24575, 16384, 8192,
	24575, 16384, 8192,
	26214, 19660, 13107, 6553,
	27306, 21845, 16384, 10922, 5461,
	28671, 24575, 20479, 16384, 12288, 8192, 4096,
	29490, 26214, 22937, 19660, 16384, 13107, 9830, 6553, 3277,
	30036, 27306, 24575, 21845, 19114, 16384, 13653, 10922, 8192, 5461, 2731,
	30583, 28398, 26214, 24029, 21845, 19660, 17476, 15291, 13107, 10922, 8738, 6553, 4369, 2184,
	30947, 29126, 27306, 25485, 23665, 21845, 20024, 18204, 16384, 14563, 12743, 10922, 9102, 7282, 5461, 3641, 1820,
	31278, 29788, 28299, 26809, 25320, 23831, 22341, 20852, 19362, 17873, 16384, 14894, 13405, 11915, 10426, 8936, 7447, 5958, 4468, 2979, 1489,
	31597, 30427, 29256, 28086, 26916, 25746, 24575, 23405, 22235, 21065, 19894, 18724, 17554, 16384, 15213, 14043, 12873, 11703, 10532, 9362, 8192, 7022, 5851, 4681, 3511, 2341, 1170,
};
static int freq_tmp[257];
static int band_tmp[13];
#endif
#endif
#elif BANDV == 2
static const short freq2band_idex[band_N + 1] = {
	2, 6, 11, 16, 21, 26, 32, 39, 47, 56, 66, 77, 90, 105, 121, 139, 160, 184, 210, 240, 256
};
#endif
typedef struct MMSE_struct
{
	short vec_size;
	short *postSPP;
	short *postSPP_avg;
	int *SNR;
	int *X2;
	int *Npsd;
#if MMSE_DYNAMIC_Q == 1
	short *Npsd_Q;
	short *X2_Q;
#endif
	int *X2_buf;
	short *X2_Q_buf;
	short *SPP_buf;
	short *noiseOnset_buf;
	short delaySize;
	short noiseOnset;

	short firstFrame;


	short isBandMode;
	short reliableVADMode;
	int TxVAD;
	int RxVAD;

	short *SPP_fullBand;
	int *SNR_fullBand;
	//int *Npsd_fullBand;
	//short *Npsd_Q_fullBand;

	short Npsd_alpha;
	short Npsd_alpha_rev;

	//short Npsd_Q;
	//short *echo_mask;
	short noiseLevel;
	short noiseLevelCnt;
	short disablePreventStagnation;
}UNBIASED_MMSE_State;

#ifdef DEBUG_UNBIASED_MMSE
extern FILE *f_mmse[6];
#endif
static void UNBIASED_MMSE_init_(UNBIASED_MMSE_State *vars)
{
	int i;
	const short vec_size = vars->vec_size;
	for (i = 0; i < vec_size; i++)
	{
#if MMSE_DYNAMIC_Q == 1
		vars->postSPP[i] = 32767;
		vars->postSPP_avg[i] = 32767;
#else
		vars->postSPP[i] = 32767;
		vars->postSPP_avg[i] = 32767;
#endif
	}


#if MMSE_DYNAMIC_Q == 1
	for (i = 0; i < vec_size; i++) 	vars->Npsd[i] = 1;//262144;
	for (i = 0; i < vec_size; i++) 	vars->Npsd_Q[i] = 20;//262144;
#else
	for (i = 0; i < vec_size; i++)		vars->Npsd[i] = 1;//262144;
#endif

	vars->firstFrame = 1;
	vars->vec_size = vec_size;

	vars->noiseLevel = 0;
	vars->noiseLevelCnt = 0;

	vars->disablePreventStagnation = 0;

	vars->Npsd_alpha = NPSD_ALPHA_MAX;
	vars->Npsd_alpha_rev = 32767 - NPSD_ALPHA_MAX;

	return;
}
//void UNBIASED_MMSE_init(char *scratch_mem, short vec_size) {
//void *UNBIASED_MMSE_init(short vec_size, char *scratch_mem_ptr) 
int SV_UnbiasedMMSE_Init(void **varsPtr, short vec_size, char *scratch_mem_ptr)
{
	int used_mem_size = 0, total_mem_size = 0;

	//---- memory allocation
	UNBIASED_MMSE_State *mmse_ptr = (UNBIASED_MMSE_State*)scratch_mem_ptr;
	used_mem_size = sizeof(UNBIASED_MMSE_State);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP_avg = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SNR = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2 = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->Npsd = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

#if MMSE_DYNAMIC_Q == 1
	mmse_ptr->Npsd_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;
#endif

	mmse_ptr->SNR_fullBand = mmse_ptr->SNR;
	mmse_ptr->SPP_fullBand = mmse_ptr->postSPP;
	//mmse_ptr->Npsd_fullBand = mmse_ptr->Npsd;
	//mmse_ptr->Npsd_Q_fullBand = mmse_ptr->Npsd_Q;


	mmse_ptr->reliableVADMode = 0;
	mmse_ptr->vec_size = vec_size;
	mmse_ptr->isBandMode = 0;
	mmse_ptr->delaySize = 0;
	UNBIASED_MMSE_init_(mmse_ptr);


	*varsPtr = mmse_ptr;

	return total_mem_size;
}

int SV_UnbiasedMMSE_WB_Band_Init(void **varsPtr, char *scratch_mem_ptr)
{
	int used_mem_size = 0, total_mem_size = 0;
	int vec_size = band_N;
	//---- memory allocation
	UNBIASED_MMSE_State *mmse_ptr = (UNBIASED_MMSE_State*)scratch_mem_ptr;
	used_mem_size = sizeof(UNBIASED_MMSE_State);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP_avg = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SNR = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2 = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->Npsd = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

#if MMSE_DYNAMIC_Q == 1
	mmse_ptr->Npsd_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;
#endif

	mmse_ptr->SNR_fullBand = (int*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SPP_fullBand = (short*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

#if 0
	mmse_ptr->Npsd_fullBand = (int*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->Npsd_Q_fullBand = (short*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;
#endif

	mmse_ptr->reliableVADMode = 0;
	mmse_ptr->vec_size = vec_size;
	mmse_ptr->isBandMode = 1;
	mmse_ptr->delaySize = 0;
	mmse_ptr->noiseOnset = 0;

	UNBIASED_MMSE_init_(mmse_ptr);


	*varsPtr = mmse_ptr;

	return total_mem_size;
}



int SV_UnbiasedMMSE_WB_Band_Delayed_Init(void **varsPtr, int delaySize, char *scratch_mem_ptr)
{
	int used_mem_size = 0, total_mem_size = 0;
	int vec_size = band_N;
	int i;
	//---- memory allocation
	UNBIASED_MMSE_State *mmse_ptr = (UNBIASED_MMSE_State*)scratch_mem_ptr;
	used_mem_size = sizeof(UNBIASED_MMSE_State);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->postSPP_avg = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SNR = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2 = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->Npsd = (int*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

#if MMSE_DYNAMIC_Q == 1
	mmse_ptr->Npsd_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2_Q = (short*)scratch_mem_ptr;
	used_mem_size = vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;
#endif

	mmse_ptr->X2_buf = (int*)scratch_mem_ptr;
	used_mem_size = delaySize * vec_size * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->X2_Q_buf = (short*)scratch_mem_ptr;
	used_mem_size = delaySize * vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SPP_buf = (short*)scratch_mem_ptr;
	used_mem_size = delaySize * vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;


	mmse_ptr->noiseOnset_buf = (short*)scratch_mem_ptr;
	used_mem_size = delaySize * vec_size * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SNR_fullBand = (int*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->SPP_fullBand = (short*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

#if 0
	mmse_ptr->Npsd_fullBand = (int*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(int);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;

	mmse_ptr->Npsd_Q_fullBand = (short*)scratch_mem_ptr;
	used_mem_size = WB_FREQ_SIZE * sizeof(short);
	total_mem_size += used_mem_size;
	scratch_mem_ptr += used_mem_size;
#endif

	mmse_ptr->reliableVADMode = 0;
	mmse_ptr->vec_size = vec_size;
	mmse_ptr->isBandMode = 1;
	mmse_ptr->delaySize = delaySize;
	mmse_ptr->noiseOnset = 0;

	for (i = 0; i < vec_size*delaySize; i++)
	{
		mmse_ptr->X2_buf[i] = 0;
	}

	for (i = 0; i < vec_size*delaySize; i++)
	{
		mmse_ptr->X2_Q_buf[i] = 20;
		mmse_ptr->SPP_buf[i] = 0;
		mmse_ptr->noiseOnset_buf[i] = 0;
	}
	UNBIASED_MMSE_init_(mmse_ptr);


	*varsPtr = mmse_ptr;

	return total_mem_size;
}
void SV_UnbiasedMMSE_Deinit() {

}

static short table_pow2_dnn[129]  =
{
	16384,  16473,  16562,  16652,  16743,  16834,  16925,  17017,  17109,  17202,
	17296,  17390,  17484,  17579,  17674,  17770,  17867,  17964,  18061,  18160,
	18258,  18357,  18457,  18557,  18658,  18759,  18861,  18963,  19066,  19170,
	19274,  19379,  19484,  19590,  19696,  19803,  19911,  20019,  20127,  20237,
	20347,  20457,  20568,  20680,  20792,  20905,  21019,  21133,  21247,  21363,
	21479,  21595,  21713,  21831,  21949,  22068,  22188,  22309,  22430,  22552,
	22674,  22797,  22921,  23045,  23170,  23296,  23423,  23550,  23678,  23806,
	23936,  24066,  24196,  24328,  24460,  24593,  24726,  24860,  24995,  25131,
	25268,  25405,  25543,  25681,  25821,  25961,  26102,  26244,  26386,  26530,
	26674,  26818,  26964,  27110,  27258,  27406,  27554,  27704,  27855,  28006,
	28158,  28311,  28464,  28619,  28774,  28931,  29088,  29246,  29405,  29564,
	29725,  29886,  30048,  30212,  30376,  30541,  30706,  30873,  31041,  31209,
	31379,  31549,  31720,  31893,  32066,  32240,  32415,  32591,  32767
};
static int SRCB_Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
	short exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
	short fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
)
{
	short exp, i, a, tmp;
	int L_x;

	L_x = SV_L_mult(fraction, 128);            /* L_x = fraction<<6           */
	i = SV_extract_h(L_x);                    /* Extract b10-b16 of fraction */
	L_x = SV_L_shr(L_x, 1);
	a = SV_extract_l(L_x);                    /* Extract b0-b9   of fraction */
	a = (short)(a & (short)0x7fff);

	L_x = SV_L_deposit_h(table_pow2_dnn[i]);      /* table[i] << 16        */
	tmp = SV_sub(table_pow2_dnn[i], table_pow2_dnn[i + 1]);        /* table[i] - table[i+1] */
	L_x = SV_L_msu(L_x, tmp, a);              /* L_x -= tmp*a*2        */            //Q30

	exp = SV_sub(30, exponant);
	L_x = SV_L_shr_r(L_x, exp);

	return (L_x);
}

static int Pow_E(                  //¢®¢´¡ËOI¢®¡¿I¡§¡Ìin<=90852,inE¡Íi¡§uEO¡Íi¡§¡Ë¡Ë¢çOU¡ÍiEOU21
	int in,				//Ea¨Ï©ªo¢®I¡§¡þQ0
	short Q_in
)
{
	short exponant, fraction;
	short tmp1 = 23637;// 1/log(2),1.44269502 , Q14
	short Q_tmp;
	int tmp2;
	int result;
	Q_tmp = Q_in + 14;
	tmp2 = in * (int)tmp1; //Q: Q_tmp
	exponant = SV_extract_l(tmp2 >> Q_tmp);
	fraction = SV_L_shr(tmp2, (Q_in - 1)) & 32767;
	result = SRCB_Pow2(exponant, fraction);
	return(result);
}


#ifndef SRCB_C_CODE_REARRANGED //SRCB C code re-arranged
#if MMSE_DYNAMIC_Q == 1
static void calculate_band_power(int *out, short *out_Q, int *in, int band_n)
#else
static void calculate_band_power(int *out, int *in, int band_n)
#endif
{
	int i, j;
	int *inPtr = in;
	int *pwrPtr = out;
#if MMSE_DYNAMIC_Q == 1
	short *out_QPtr = out_Q;
#endif
	int pwr;
	int real, imag;
	short band_pwr_q = BAND_PWR_Q;
	short band_pwr_shift = 30 - band_pwr_q;

	// band -> freq
	for (j = 0; j < band_n; j++) {
		out[j] = 0;
	}

#if BANDV == 1
	for (i = 0; i < WB_FREQ_SIZE; i++)
	{
		real = *inPtr++; imag = *inPtr++;

		pwr = (int)((SMULL(real, real) + SMULL(imag, imag)) >> band_pwr_shift);
		if (pwr == 0) pwr = 1;
		if (pwr < 0) pwr = SV_MAX_32; // prevent overflow


		// band -> freq
		for (j = 0; j < band_n; j++) {
			out[j] += SV_L_mpy_ls(pwr, freq2band_mat[j][i]);
#if MMSE_DYNAMIC_Q == 1
			out_QPtr[j] = band_pwr_q;
#endif
		}
	}
#elif BANDV == 2

	for (j = 0; j < band_n; j++)
	{
		for (i = freq2band_idex[j]; i < freq2band_idex[j + 1]; i++)
		{
			real = inPtr[2 * i]; imag = inPtr[2 * i + 1];
			pwr = (int)((SMULL(real, real) + SMULL(imag, imag)) >> 5);
			if (pwr == 0) pwr = 1;
			if (pwr < 0) pwr = SV_MAX_32; // prevent overflow
			out[j] += pwr;
		}
		if (out[j] < 0) out[j] = SV_MAX_32;

#if MMSE_DYNAMIC_Q == 1
		out_QPtr[j] = 25;
#endif
	}

#endif
}
#else
static void calculate_band_power(int *out, short *out_Q, int *in, int band_n)  //High complex
{
	int i, j;
	int *inPtr = in;
	int pwr;
	int real, imag;
	short band_pwr_q = BAND_PWR_Q;
	short band_pwr_shift = 30 - band_pwr_q;

	for (i = 0; i < WB_FREQ_SIZE; i++)
	{
		real = *inPtr++; imag = *inPtr++;
		pwr = (int)((SMULL(real, real) + SMULL(imag, imag)) >> band_pwr_shift);
		if (pwr == 0) pwr = 1;
		if (pwr < 0) pwr = SV_MAX_32; // prevent overflow
		freq_tmp[i] = pwr;
	}

	// band -> freq
	for (i = 0; i < band_n; i++)
	{
		short freq_start = freq2band_mat_index[i][0];
		short freq_end = freq_start + freq2band_mat_index[i][1];
		short *pGain = &freq2band_mat_gain[freq2band_mat_index[i][2]];

		out[i] = 0;
		for (j = freq_start; j < freq_end; j++)
		{
			out[i] += SV_L_mpy_ls(freq_tmp[j], *pGain++);
		}
		out_Q[i] = band_pwr_q;
	}
}
#endif





#if MMSE_DYNAMIC_Q == 0


static void calculate_power(int *out, int *in, int vec_size)
{
	int i;
	int *inPtr = in;
	int *pwrPtr = out;

	int pwr;
	int real, imag;

	for (i = 0; i < vec_size; i++)
	{
		real = *inPtr++;
		imag = *inPtr++;
		pwr = (int)((SMULL(real, real) + SMULL(imag, imag)) >> (30 - NPSD_Q)); //Q(NPSD_Q)
		if (pwr < 0) pwr = SV_MAX_32;
		*pwrPtr++ = pwr;
	}
}


static void estimate_SNR(int *SNRPtr, int *X2Ptr, int *NpsdPtr, int vec_size)
{
	int i;

	for (i = 0; i < vec_size; i++)
	{
		short normPwr, normNpsd;
		short Spwr, SNpsd;
		int newSNR;
		int pwr = *X2Ptr++;
		int Npsd = *NpsdPtr++;

		if (Npsd == 0) Npsd = 1;
		normPwr = SV_norm_l(pwr);
		normNpsd = SV_norm_l(Npsd);

		if (normPwr == 0)
		{
			pwr >>= 1;
		}
		else
		{
			pwr <<= (normPwr - 1);
		}
		Npsd <<= normNpsd;
		Spwr = SV_extract_h(pwr);
		SNpsd = SV_extract_h(Npsd);
		newSNR = (int)SV_div_s(Spwr, SNpsd);
		*SNRPtr++ = SV_L_shr(newSNR, 14 + normPwr - normNpsd - SNR_Q); // Q(14+normPwr-normNpsd)
	}
}

static int inline SNR_estimation(int pwr, int Npsd, int out_Q)
{

	short normPwr, normNpsd;
	short Spwr, SNpsd;
	int newSNR;

	if (Npsd == 0) Npsd = 1;
	normPwr = SV_norm_l(pwr);
	normNpsd = SV_norm_l(Npsd);

	if (normPwr == 0)
	{
		pwr >>= 1;
	}
	else
	{
		pwr <<= (normPwr - 1);
	}
	Npsd <<= normNpsd;
	Spwr = SV_extract_h(pwr);
	SNpsd = SV_extract_h(Npsd);
	newSNR = (int)SV_div_s(Spwr, SNpsd);
	newSNR = SV_L_shr(newSNR, 14 + normPwr - normNpsd - out_Q); // Q(14+normPwr-normNpsd)

	return newSNR;
}


static void esitmate_SPP(UNBIASED_MMSE_State *vars, short TxVAD, short *ref_mask, short noise_est_disable)
{
	int i;

	int e_x;
	const int e_x_threshold = (int)SV_L_shr(18634, 10 - SNR_Q);

	//a priori SNR = 20dB
	//const short priSNR_plus_1 = 101;
	//const short beta = 32444;// priSNR/(1+priSNR)
	//a priori SNR = 15dB
	const short priSNR_plus_1 = 32; //(Q0)
	const short beta = 31763; // priSNR/(1+priSNR) (Q15)
	const short unbiased_MMSE_SPP_alpha = 29491;//0.9

	short *SPP = vars->postSPP;
	int *SNR = vars->SNR;
	short vec_size = vars->vec_size;

	if (TxVAD == 0)
	{
		for (i = 0; i < vec_size; i++) SPP[i] = 0;
	}
	else
	{
		for (i = 0; i < vec_size; i++)
		{
			// SNR .*  priSNR_fixed ./ (1+priSNR_fixed) .* gamma
			// beta = priSNR_fixed ./ (1+priSNR_fixed) .* gamma
			e_x = SV_L_mpy_ls(SNR[i], beta);

			if (e_x > e_x_threshold) // dependent on SNR_Q
			{
				SPP[i] = SV_MAX_16;
			}
			else
			{
				int l_tmp1 = Pow_E(e_x, SNR_Q) + priSNR_plus_1;
				int l_tmp2 = divide(priSNR_plus_1, 0, l_tmp1, 0, 31);
				SPP[i] = SV_MAX_16 - SV_extract_h(l_tmp2);
			}
		}

		for (i = 0; i < vec_size; i++)
		{
			// to void stagnation
			vars->postSPP_avg[i] = (short)(((int)vars->postSPP_avg[i] * (int)unbiased_MMSE_SPP_alpha + (int)SPP[i] * (int)(SV_MAX_16 - unbiased_MMSE_SPP_alpha)) >> 15);
			if ((SPP[i] > 32440) && (vars->postSPP_avg[i] > 32440) && noise_est_disable == 0)
			{
				if (ref_mask == NULL)
					SPP[i] = 32440;
				else
					SPP[i] = ref_mask[i];
			}
		}
	}

}


static void update_Npsd(UNBIASED_MMSE_State *vars)
{
	int i;

	short vec_size = vars->vec_size;
	short alpha1 = 6553;
	short alpha2 = 26214;

	int ltmp;
	int *X2Ptr = vars->X2;
	short *SPPPtr = vars->postSPP;

	for (i = 0; i < vec_size; i++)
	{
		int X2 = *X2Ptr++;
		short SPP = *SPPPtr++;

		if (SPP < 3276) SPP = 0;
		ltmp = SV_L_mpy_ls(X2, SV_sub(SV_MAX_16, SPP)) + SV_L_mpy_ls(vars->Npsd[i], SPP);
		vars->Npsd[i] = SV_L_mpy_ls(ltmp, alpha1) + SV_L_mpy_ls(vars->Npsd[i], alpha2);
	}
}


//%mmse_state = Unbiased_MMSE(mmse_state, X_all(:, frame_ind, 1));
//complex in[256x2] = {a0,a256,a1,b1.............a255,b255} , means ai+j*bi i=0,1,,,255
//update mmse_state's member
static void UNBIASED_MMSE(UNBIASED_MMSE_State *vars, int *in, short noise_est_disable, int TxVAD, int RxVAD, short *ref_mask)
{
	int i;
	int *X2 = vars->X2;
	int *Npsd = vars->Npsd;
	int *SNR = vars->SNR;
	short *SPP = vars->postSPP;
	short vec_size = vars->vec_size;

	//---- calcuate Power
		//---- calcuate Power
	if (vars->isBandMode == 1)
		calculate_band_power(X2, in, vec_size);
	else
		calculate_power(X2, in, vec_size);

	//---- calculate SNR 
	estimate_SNR(SNR, X2, Npsd, vec_size);


	//---- estimate speech presence probability
	esitmate_SPP(vars, TxVAD, ref_mask, noise_est_disable);


	//---- update Npsd
	update_Npsd(vars);


#ifdef DEBUG_UNBIASED_MMSE
	float ftmp;
	int *inPtr = in;
	for (i = 0; i < vec_size; i++)
	{
		int real = *inPtr++;
		int imag = *inPtr++;
		ftmp = ((float)real*real + (float)imag*imag) / (float)(1 << 30);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[0]);
	}

	int *NpsdPtr = vars->Npsd;
	for (i = 0; i < vec_size; i++)
	{
		ftmp = (*NpsdPtr++) / (float)(1 << NPSD_Q);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[1]);
	}

	int *SNRPtr = vars->SNR;
	for (i = 0; i < vec_size; i++)
	{
		ftmp = (*SNRPtr++) / (float)(1 << SNR_Q);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[2]);
	}

	short *sppPtr = vars->postSPP;
	for (i = 0; i < vec_size; i++)
	{
		ftmp = (*sppPtr++) / (float)(1 << 15);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[3]);
	}

#endif
	return;
}

#else

static int inline SNR_estimation_inline(int pwr, short pwr_Q, int Npsd, short Npsd_Q, short out_Q)
{

	short normPwr, normNpsd;
	short Spwr, SNpsd;
	int newSNR;

	if (Npsd == 0) Npsd = 1;
#if 0
	normPwr = SV_norm_l(pwr);
	normNpsd = SV_norm_l(Npsd);

	if (normPwr == 0)
	{
		pwr >>= 1;
	}
	else
	{
		pwr <<= (normPwr - 1);
	}
#else
	normPwr = -1;
	normNpsd = SV_norm_l(Npsd);
	pwr >>= 1;
#endif
	Npsd <<= normNpsd;
	Spwr = SV_extract_h(pwr);
	SNpsd = SV_extract_h(Npsd);
	newSNR = (int)SV_div_s(Spwr, SNpsd);
	newSNR = SV_L_shr(newSNR, 14 + normPwr + pwr_Q - normNpsd - Npsd_Q - out_Q); // Q(14+normPwr-normNpsd)
	return newSNR;
}

static void estimate_SNR(int *SNRPtr, int *X2Ptr, short *X2_QPtr, int *NpsdPtr, short *Npsd_QPtr, int vec_size)
{
	int i;

	for (i = 0; i < vec_size; i++)
	{
		short normPwr, normNpsd;
		short Spwr, SNpsd;
		int newSNR;

		int pwr = *X2Ptr++;
		int Npsd = *NpsdPtr++;
		short pwr_Q = *X2_QPtr++;
		short Npsd_Q = *Npsd_QPtr++;

		if (Npsd == 0) Npsd = 1;
		normPwr = SV_norm_l(pwr);
		normNpsd = SV_norm_l(Npsd);

		if (normPwr == 0)
		{
			pwr >>= 1;
		}
		else
		{
			pwr <<= (normPwr - 1);
		}
		Npsd <<= normNpsd;
		Spwr = SV_extract_h(pwr);
		SNpsd = SV_extract_h(Npsd);
		newSNR = (int)SV_div_s(Spwr, SNpsd);
		*SNRPtr++ = SV_L_shr(newSNR, 14 + normPwr + pwr_Q - normNpsd - Npsd_Q - SNR_Q); // Q(14+normPwr-normNpsd)
	}
}

static void calculate_power(int *out, short *out_Q, int *in, int vec_size)
{
	int i;
	int *inPtr = in;
	int *pwrPtr = out;
	short *out_QPtr = out_Q;

	int pwr;
	int real, imag;
	int maxV;
	short norm;

	for (i = 0; i < vec_size; i++)
	{
		real = *inPtr++; imag = *inPtr++;
		maxV = (ABS(real) > ABS(imag)) ? ABS(real) : ABS(imag);

		if (maxV == 0)
		{
			*pwrPtr++ = 1;
			*out_QPtr++ = 60;
		}
		else
		{
			norm = SV_norm_l(maxV);
			real = SV_L_shl(real, norm - 15);
			imag = SV_L_shl(imag, norm - 15);
			pwr = (int)(SMULL(real, real) + SMULL(imag, imag));
			*out_QPtr++ = norm << 1;
			if (pwr == 0) pwr = 1;
			if (pwr < 0) pwr = SV_MAX_32; // prevent overflow
			*pwrPtr++ = pwr;
		}

	}
}

#define SV_UNBIASEDMMSE_APRIORISNR 10
static void esitmate_SPP(UNBIASED_MMSE_State *vars, int TxVAD, short *ref_mask, short noise_est_disable)
{
	int i;

	int e_x;
	const int e_x_threshold = (int)SV_L_shr(18634, 10 - SNR_Q);

#if SV_UNBIASEDMMSE_APRIORISNR == 30
	//a priori SNR = 30dB
	const short priSNR_plus_1 = 1001;
	const short beta = 32735;// priSNR/(1+priSNR)
#elif SV_UNBIASEDMMSE_APRIORISNR == 25
	//a priori SNR = 25dB
	const short priSNR_plus_1 = 317;
	const short beta = 32665;// priSNR/(1+priSNR)
#elif SV_UNBIASEDMMSE_APRIORISNR == 20
	//a priori SNR = 20dB
	const short priSNR_plus_1 = 101;
	const short beta = 32444;// priSNR/(1+priSNR)
#elif SV_UNBIASEDMMSE_APRIORISNR == 15
	//a priori SNR = 15dB
	const short priSNR_plus_1 = 32; //(Q0)
	const short beta = 31763; // priSNR/(1+priSNR) (Q15)
#elif SV_UNBIASEDMMSE_APRIORISNR == 10
	//a priori SNR = 15dB
	const short priSNR_plus_1 = 11; //(Q0)
	const short beta = 29789; // priSNR/(1+priSNR) (Q15)
#endif


	const short unbiased_MMSE_SPP_alpha = 29491;//0.9

	short *SPP = vars->postSPP;
	int *SNR = vars->SNR;
	short vec_size = vars->vec_size;

	if (TxVAD == 0)
	{
		for (i = 0; i < vec_size; i++) SPP[i] = 0;
	}
	else if (vars->noiseOnset == 1)
	{
		for (i = 0; i < vec_size; i++) SPP[i] = ref_mask[i];
	}
	else
	{
		for (i = 0; i < vec_size; i++)
		{
			// SNR .*  priSNR_fixed ./ (1+priSNR_fixed) .* gamma
			// beta = priSNR_fixed ./ (1+priSNR_fixed) .* gamma
			e_x = SV_L_mpy_ls(SNR[i], beta);

			if (e_x > e_x_threshold) // dependent on SNR_Q
			{
				SPP[i] = SV_MAX_16;
			}
			else
			{
				int l_tmp1 = Pow_E(e_x, SNR_Q) + priSNR_plus_1;
				int l_tmp2 = divide(priSNR_plus_1, 0, l_tmp1, 0, 31);
				SPP[i] = SV_MAX_16 - SV_extract_h(l_tmp2);
			}
		}
#if 0
		if (ref_mask != NULL)
		{
			for (i = 0; i < vec_size; i++)
			{
				if (ref_mask[i] > SPP[i]) SPP[i] = ref_mask[i];
			}
		}
#endif
		if (vars->disablePreventStagnation == 0)
		{
			for (i = 0; i < vec_size; i++)
			{
				// to void stagnation
				vars->postSPP_avg[i] = (short)(((int)vars->postSPP_avg[i] * (int)unbiased_MMSE_SPP_alpha + (int)SPP[i] * (int)(SV_MAX_16 - unbiased_MMSE_SPP_alpha)) >> 15);
				if ((SPP[i] > 32439) && (vars->postSPP_avg[i] > 32439) && noise_est_disable == 0)
				{
					if (ref_mask == NULL)
						SPP[i] = 32439;
					else
						SPP[i] = ref_mask[i];
				}
			}
		}

	}

}


static void estimateNoiseLevel(UNBIASED_MMSE_State *vars)
{

	int *Npsd = vars->Npsd;
	short *Npsd_Q = vars->Npsd_Q;
	INT64 NpsdSum = 0; // Q18
	int Ltmp;
	int i;
	for (i = 0; i < NOISELEVEL_BAND_N; i++)
	{
		Ltmp = SV_L_shr(Npsd[i], Npsd_Q[i] - NPSD_Q);
		NpsdSum = NpsdSum + (int)(SMULL(Ltmp, NOISELEVEL_BAND_N_REV) >> 15);
	}
	//if (NpsdSum < 0) NpsdSum = SV_MAX_32;

	if (vars->noiseLevel == 0)
	{
		if (NpsdSum > NOISELEVEL0_THD) 	// 0-> 1
		{
			vars->noiseLevelCnt++;
		}
		else
		{
			vars->noiseLevelCnt = 0;
		}

		if (vars->noiseLevelCnt > 5)
		{
			vars->noiseLevel = 1;
			vars->noiseLevelCnt = 0;
		}
	}

	if (vars->noiseLevel > 0)
	{
		if (NpsdSum < NOISELEVEL1_THD)  vars->noiseLevel = 1;
		// 1-> 2
		else if (NpsdSum < NOISELEVEL2_THD)  vars->noiseLevel = 2;
		// 2-> 3
		else  vars->noiseLevel = 3;

		if (NpsdSum < NOISELEVEL0_THD) 	// 1,2,3 -> 0
		{
			vars->noiseLevelCnt++;
		}
		else
		{
			vars->noiseLevelCnt = 0;
		}

		if (vars->noiseLevelCnt > 20)
		{
			vars->noiseLevel = 0;
			vars->noiseLevelCnt = 0;
		}
	}

#ifdef DEBUG_UNBIASED_MMSE
	fwrite(&(vars->noiseLevel), sizeof(short), 1, f_mmse[4]);

	float ftmp;
	ftmp = NpsdSum / (float)((INT64)1 << NPSD_Q);
	fwrite(&ftmp, sizeof(float), 1, f_mmse[5]);
#endif
}
static void update_Npsd(UNBIASED_MMSE_State *vars)
{
	int i;

	short vec_size = vars->vec_size;
	//short alpha1 = 6553;
	//short alpha2 = 26214;
	short alpha1 = vars->Npsd_alpha_rev;
	short alpha2 = vars->Npsd_alpha;

	int ltmp;
	int *X2Ptr = vars->X2;
	int X2;
	short *SPPPtr = vars->postSPP;
	short SPP;
	short target_Q;

	if (vars->reliableVADMode == 1)
	{
		if (vars->noiseLevel < 2)
		{
			if (vars->TxVAD != 0 || vars->RxVAD != 0) return;
		}
		else
		{
			if (vars->TxVAD == 1 || vars->RxVAD != 0) return;
		}

	}

	for (i = 0; i < vec_size; i++)
	{
		X2 = *X2Ptr++;
		SPP = *SPPPtr++;
		if (SPP < 3276) SPP = 0;
		if (vars->Npsd_Q[i] < vars->X2_Q[i])
		{
			target_Q = vars->Npsd_Q[i];
			X2 = X2 >> (vars->X2_Q[i] - target_Q);
			vars->Npsd[i] = vars->Npsd[i] >> (vars->Npsd_Q[i] - target_Q);

			ltmp = SV_L_mpy_ls(X2, SV_sub(SV_MAX_16, SPP)) + SV_L_mpy_ls(vars->Npsd[i], SPP);
			vars->Npsd[i] = SV_L_mpy_ls(ltmp, alpha1) + SV_L_mpy_ls(vars->Npsd[i], alpha2);
			vars->Npsd_Q[i] = target_Q;
		}
		else
		{
			target_Q = vars->X2_Q[i];
			X2 = X2 >> (vars->X2_Q[i] - target_Q);
			vars->Npsd[i] = vars->Npsd[i] >> (vars->Npsd_Q[i] - target_Q);

			ltmp = SV_L_mpy_ls(X2, SV_sub(SV_MAX_16, SPP)) + SV_L_mpy_ls(vars->Npsd[i], SPP);
			vars->Npsd[i] = SV_L_mpy_ls(ltmp, alpha1) + SV_L_mpy_ls(vars->Npsd[i], alpha2);
			vars->Npsd_Q[i] = target_Q;
		}

		if (vars->Npsd[i] > 0)
		{
			short norm_test = SV_norm_l(vars->Npsd[i]);
			if (norm_test == 0)
			{
				vars->Npsd[i] >>= 1;
				vars->Npsd_Q[i] -= 1;
			}
			else
			{
				vars->Npsd[i] <<= (norm_test - 1);
				vars->Npsd_Q[i] += norm_test - 1;
			}
		}
		if (vars->Npsd[i] == 0)  vars->Npsd[i] = 1;
	}
}


static void update_NpsdWithDelay(UNBIASED_MMSE_State *vars)
{
	int i, j;

	short vec_size = vars->vec_size;
	short alpha1, alpha2;

	int ltmp;
	int *X2Ptr = vars->X2_buf;
	short *X2QPtr = vars->X2_Q_buf;

	int X2;
	short *SPPPtr = vars->SPP_buf;
	short *NoiseOnsetPtr = vars->noiseOnset_buf;

	short SPP;
	short target_Q;

	short NpsdUpdateFlag = 1;

	if (vars->reliableVADMode == 1)
	{
		if (vars->noiseLevel < 2)
		{
			if (vars->TxVAD != 0 || vars->RxVAD != 0) NpsdUpdateFlag = 0;
		}
		else
		{
			if (vars->TxVAD == 1 || vars->RxVAD != 0) NpsdUpdateFlag = 0;
		}
	}
	else
	{
		if (vars->TxVAD == 1 || vars->RxVAD != 0) NpsdUpdateFlag = 0;
	}

	if (*NoiseOnsetPtr == 1)
	{
		vars->Npsd_alpha = 32767 >> 1;
		vars->Npsd_alpha_rev = 32767 - vars->Npsd_alpha;
	}
	else
	{
		vars->Npsd_alpha = (vars->Npsd_alpha * 16974) >> 14;
		if (vars->Npsd_alpha > NPSD_ALPHA_MAX) vars->Npsd_alpha = NPSD_ALPHA_MAX;
		vars->Npsd_alpha_rev = 32767 - vars->Npsd_alpha;
	}

	alpha1 = vars->Npsd_alpha_rev;
	alpha2 = vars->Npsd_alpha;

	for (i = 0; i < vec_size; i++)
	{
		X2 = *X2Ptr++;
		SPP = *SPPPtr++;
		if (SPP < 3276) SPP = 0;
		if (SPP < SV_MAX_16)
		{
			if (vars->Npsd_Q[i] < X2QPtr[i])
			{
				target_Q = vars->Npsd_Q[i];
				X2 = X2 >> (X2QPtr[i] - target_Q);
				vars->Npsd[i] = vars->Npsd[i] >> (vars->Npsd_Q[i] - target_Q);

				ltmp = SV_L_mpy_ls(X2, SV_sub(SV_MAX_16, SPP)) + SV_L_mpy_ls(vars->Npsd[i], SPP);
				vars->Npsd[i] = SV_L_mpy_ls(ltmp, alpha1) + SV_L_mpy_ls(vars->Npsd[i], alpha2);
				vars->Npsd_Q[i] = target_Q;
			}
			else
			{
				target_Q = X2QPtr[i];
				X2 = X2 >> (X2QPtr[i] - target_Q);
				vars->Npsd[i] = vars->Npsd[i] >> (vars->Npsd_Q[i] - target_Q);

				ltmp = SV_L_mpy_ls(X2, SV_sub(SV_MAX_16, SPP)) + SV_L_mpy_ls(vars->Npsd[i], SPP);
				vars->Npsd[i] = SV_L_mpy_ls(ltmp, alpha1) + SV_L_mpy_ls(vars->Npsd[i], alpha2);
				vars->Npsd_Q[i] = target_Q;
			}

			if (vars->Npsd[i] > 0)
			{
				short norm_test = SV_norm_l(vars->Npsd[i]);
				if (norm_test == 0)
				{
					vars->Npsd[i] >>= 1;
					vars->Npsd_Q[i] -= 1;
				}
				else
				{
					vars->Npsd[i] <<= (norm_test - 1);
					vars->Npsd_Q[i] += norm_test - 1;
				}
			}
			if (vars->Npsd[i] == 0)  vars->Npsd[i] = 1;
		}

	}

	// buffer move
	X2Ptr = vars->X2_buf;
	X2QPtr = vars->X2_Q_buf;
	SPPPtr = vars->SPP_buf;
	NoiseOnsetPtr = vars->noiseOnset_buf;
	for (j = 0; j < vars->delaySize - 1; j++) {
		NoiseOnsetPtr[j] = NoiseOnsetPtr[j + 1];
		for (i = 0; i < vec_size; i++)
		{
			X2Ptr[i] = X2Ptr[i + vec_size];
			X2QPtr[i] = X2QPtr[i + vec_size];
			SPPPtr[i] = SPPPtr[i + vec_size];
		}
		X2Ptr += vec_size;
		X2QPtr += vec_size;
		SPPPtr += vec_size;
	}

	NoiseOnsetPtr[j] = vars->noiseOnset;
	for (i = 0; i < vec_size; i++)
	{
		X2Ptr[i] = vars->X2[i];
		X2QPtr[i] = vars->X2_Q[i];
		SPPPtr[i] = vars->postSPP[i];
	}


	SPPPtr = vars->SPP_buf + (vars->delaySize - 1) * vec_size;
	for (j = 0; j < vars->delaySize - 1; j++)
	{
		if (NoiseOnsetPtr[vars->delaySize - 1 - j] == 1) break;

		if (NpsdUpdateFlag == 0)
		{
			for (i = 0; i < vec_size; i++)
			{
				SPPPtr[i] = SV_MAX_16;
			}
		}
		else
		{
			for (i = 0; i < vec_size; i++)
			{
				if (vars->postSPP[i] == SV_MAX_16)  SPPPtr[i] = SV_MAX_16;
			}
		}

		SPPPtr -= vec_size;
	}

}


//%mmse_state = Unbiased_MMSE(mmse_state, X_all(:, frame_ind, 1));
//complex in[256x2] = {a0,a256,a1,b1.............a255,b255} , means ai+j*bi i=0,1,,,255
//update mmse_state's member
static void UNBIASED_MMSE(UNBIASED_MMSE_State *vars, int *in, short noise_est_disable, int TxVAD, int RxVAD, short *ref_mask)
{
	//TODO[BSH]: when Rx signal is presence
	int i;

	int *X2 = vars->X2;
	int *Npsd = vars->Npsd;
	int *SNR = vars->SNR;
	short *X2_Q = vars->X2_Q;
	short *Npsd_Q = vars->Npsd_Q;
	short *SPP = vars->postSPP;
	short vec_size = vars->vec_size;

	vars->TxVAD = TxVAD;
	vars->RxVAD = RxVAD;

	//---- calcuate Power
	if (vars->isBandMode == 1)
		calculate_band_power(X2, X2_Q, in, vec_size);
	else
		calculate_power(X2, X2_Q, in, vec_size);


	//---- estimate SNR 
	if (vars->firstFrame == 1) for (i = 0; i < vec_size; i++) Npsd_Q[i] = X2_Q[i];
	estimate_SNR(SNR, X2, X2_Q, Npsd, Npsd_Q, vec_size);


	//---- estimate speech presence probability
	esitmate_SPP(vars, TxVAD, ref_mask, noise_est_disable);


	//---- update Npsd
	if (vars->delaySize == 0)
		update_Npsd(vars);
	else
		update_NpsdWithDelay(vars);

	//---- calculate Noise Level
	estimateNoiseLevel(vars);


	vars->firstFrame = 0;

#ifdef DEBUG_UNBIASED_MMSE
	float ftmp;
	int *inPtr = in;
	for (i = 0; i < vec_size; i++)
	{
		int real = *inPtr++;
		int imag = *inPtr++;
		//ftmp = ((float)real*real + (float)imag*imag) / (float)(1 << 30);
		ftmp = X2[i] / (float)(1 << X2_Q[i]);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[0]);
	}

	int *NpsdPtr = vars->Npsd;
	for (i = 0; i < vec_size; i++)
	{
		if (vars->Npsd_Q[i] > 0)
		{
			if (vars->Npsd_Q[i] > 60)
			{
				ftmp = (*NpsdPtr++) / (float)((INT64)1 << 60);
				ftmp = ftmp / (float)((INT64)1 << (vars->Npsd_Q[i] - 60));
			}
			else
				ftmp = (*NpsdPtr++) / (float)((INT64)1 << vars->Npsd_Q[i]);

		}
		else
		{
			if (vars->Npsd_Q[i] < -60)
			{
				ftmp = (*NpsdPtr++) * (float)((INT64)1 << 60);
				ftmp = ftmp * (float)((INT64)1 << -(vars->Npsd_Q[i] + 60));
			}
			else
				ftmp = (*NpsdPtr++) * (float)((INT64)1 << -vars->Npsd_Q[i]);
		}
		fwrite(&ftmp, sizeof(float), 1, f_mmse[1]);
	}

	int *SNRPtr = vars->SNR;
	for (i = 0; i < vec_size; i++)
	{
		ftmp = (*SNRPtr++) / (float)(1 << SNR_Q);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[2]);
	}

	short *sppPtr = vars->postSPP;
	for (i = 0; i < vec_size; i++)
	{
		ftmp = (*sppPtr++) / (float)(1 << 15);
		fwrite(&ftmp, sizeof(float), 1, f_mmse[3]);
	}


#endif
	return;
}


#endif


#if BANDV == 1

#ifndef SRCB_C_CODE_REARRANGED //SRCB C code re-arranged
void band2freq(int *out, int freq_size, int *in, int band_size)
{
	int i, j;
	for (i = 0; i < freq_size; i++)
	{
		out[i] = 0;
		for (j = 0; j < band_size; j++)
		{
			//out[i] = SV_L_mac(out[i], in[j], freq2band_mat[j][i]);
			out[i] += SV_L_mpy_ls(in[j], freq2band_mat[j][i]);
		}
	}
}
void band2freq_short(short *out, int freq_size, short *in, int band_size)
{
	int i, j;
	int Ltmp;
	for (i = 0; i < freq_size; i++)
	{
		Ltmp = 0;
		for (j = 0; j < band_size; j++)
		{
			Ltmp = SV_L_mac(Ltmp, (int)in[j], freq2band_mat[j][i]);
		}
		out[i] = SV_saturate(Ltmp >> 15);
	}
}
#else
void band2freq(int *out, int freq_size, int *in, int band_size)   //High complex
{
	int i, j;
	int band_num, tab_index;
	int band_index, gain_index;
	short gain1, gain2;

	band_index = 0;
	band_num = 1;
	tab_index = 0;
	gain_index = 0;
	for (i = 0; i < freq_size; i++)
	{
		if (i == band2freq_mat_index[tab_index])
		{
			tab_index++;
			if (band_num == 1)
				band_num = 2;
			else
			{
				band_num = 1;
				band_index++;
			}
		}

		if (band_num == 1)
		{
			//out[i] = SV_L_mpy_ls(in[band_index], (short)32767);
			out[i] = in[band_index];
		}
		else
		{
			gain1 = band2freq_mat_gain[gain_index];
			gain2 = 32767 - gain1;
			out[i] = SV_L_mpy_ls(in[band_index], gain1);
			out[i] += SV_L_mpy_ls(in[band_index + 1], gain2);
		}

		if (band_num == 2)
		{
			gain_index++;
		}
	}
}
void band2freq_short(short *out, int freq_size, short *in, int band_size)   //High complex
{
	int i, j;
	int band_num, tab_index;
	int band_index, gain_index;
	int Ltmp;
	short gain1, gain2;

	band_index = 0;
	band_num = 1;
	tab_index = 0;
	gain_index = 0;
	for (i = 0; i < freq_size; i++)
	{
		if (i == band2freq_mat_index[tab_index])
		{
			tab_index++;
			if (band_num == 1)
				band_num = 2;
			else
			{
				band_num = 1;
				band_index++;
			}
		}

		if (band_num == 1)
		{
			//Ltmp = SV_L_mult(in[band_index], (short)32767);
			//out[i] = SV_saturate(Ltmp >> 15);
			out[i] = SV_shl(in[band_index], 1);
		}
		else
		{
			gain1 = band2freq_mat_gain[gain_index];
			gain2 = 32767 - gain1;
			Ltmp = SV_L_mult(in[band_index], gain1);
			Ltmp = SV_L_mac(Ltmp, in[band_index + 1], gain2);
			out[i] = SV_saturate(Ltmp >> 15);
		}

		if (band_num == 2)
		{
			gain_index++;
		}
	}
}
#endif
#elif BANDV == 2
void band2freq(int *out, int freq_size, int *in, int band_size)
{
	int i, j;
	for (i = 0; i < freq_size; i++)
	{
		out[i] = 0;
	}

	for (j = 0; j < band_size; j++)
	{
		for (i = freq2band_idex[j]; i < freq2band_idex[j + 1]; i++)
		{
			out[i] = in[j];
		}
	}
}

void band2freq_short(short *out, int freq_size, short *in, int band_size)
{
	int i, j;
	for (i = 0; i < freq_size; i++)
	{
		out[i] = 0;
	}

	for (j = 0; j < band_size; j++)
	{
		for (i = freq2band_idex[j]; i < freq2band_idex[j + 1]; i++)
		{
			out[i] = in[j];
		}
	}
}
#endif

void SV_UnbiasedMMSE_Proc(void *void_vars, int *in, int TxVAD, int RxVAD, short *ref_mask)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	UNBIASED_MMSE(vars, in, 0, TxVAD, RxVAD, ref_mask);
}


int *SV_UnbiasedMMSE_Get_BandSNR(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	return vars->SNR;
}

int *SV_UnbiasedMMSE_Get_SNR(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	if (vars->isBandMode == 1)
	{
		band2freq(vars->SNR_fullBand, WB_FREQ_SIZE, vars->SNR, vars->vec_size);
	}
	return vars->SNR_fullBand;
}
int SV_UnbiasedMMSE_Get_SNR_Q(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	return (int)SNR_Q;
}

short *SV_UnbiasedMMSE_Get_Mask(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	if (vars->isBandMode == 1)
	{
		band2freq_short(vars->SPP_fullBand, WB_FREQ_SIZE, vars->postSPP, vars->vec_size);
	}
	return vars->SPP_fullBand;
}

void SV_UnbiasedMMSE_SetReliableVADMode(void *void_vars, short value)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	vars->reliableVADMode = value;
}

short SV_UnbiasedMMSE_Get_NoiseLevel(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	return vars->noiseLevel;
}
int *SV_UnbiasedMMSE_Get_BandNpsd(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	return vars->Npsd;
}
short *SV_UnbiasedMMSE_Get_BandNpsd_Q(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	return vars->Npsd_Q;
}

#ifndef SRCB_C_CODE_REARRANGED //SRCB C code re-arranged
int SV_UnbiasedMMSE_Get_BandIndex(int freqBinIndex)
{
#if 0
	int i = 0;
	for (i = 0; i < band_N; i++) {
		if (freq2band_mat[i][freqBinIndex] != 0) break;
	}
	return i;
#else
	int i = 0;
	int maxValue = 0;
	int maxIndex = 0;
	for (i = 0; i < band_N; i++) {
		if (freq2band_mat[i][freqBinIndex] > maxValue)
		{
			maxValue = freq2band_mat[i][freqBinIndex];
			maxIndex = i;
		}
	}

	return maxIndex;
#endif
}
#else
int SV_UnbiasedMMSE_Get_BandIndex(int freqBinIndex)
{
	if (freqBinIndex < 9) return 0;
	if (freqBinIndex < 16) return 1;
	if (freqBinIndex < 23) return 2;
	if (freqBinIndex < 34) return 3;
	if (freqBinIndex < 46) return 4;
	if (freqBinIndex < 62) return 5;
	if (freqBinIndex < 81) return 6;
	if (freqBinIndex < 103) return 7;
	if (freqBinIndex < 131) return 8;
	if (freqBinIndex < 165) return 9;
	if (freqBinIndex < 208) return 10;
	else return 11;
}
#endif

void SV_UnbiasedMMSE_SetDisablePreventStagnation(void *void_vars, short flag)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	vars->disablePreventStagnation = flag;
}
#if 0
int *SV_UnbiasedMMSE_Get_Npsd(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	if (vars->isBandMode == 1)
	{
		band2freq(vars->Npsd_fullBand, WB_FREQ_SIZE, vars->Npsd, vars->vec_size);
	}
	return vars->Npsd_fullBand;
}
short *SV_UnbiasedMMSE_Get_Npsd_Q(void *void_vars)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	if (vars->isBandMode == 1)
	{
		band2freq_short(vars->Npsd_Q_fullBand, WB_FREQ_SIZE, vars->Npsd_Q, vars->vec_size);
	}
	return vars->Npsd_Q_fullBand;
}
#endif

void SV_UnbaisedMMSE_SetNoiseOnsetFlag(void *void_vars, short flag)
{
	UNBIASED_MMSE_State *vars = (UNBIASED_MMSE_State*)void_vars;
	vars->noiseOnset = flag;
}