#ifndef __SVTX_ANC__
#define __SVTX_ANC__
#include "SamsungSolomonVoiceW_Int.h"

#define ANC_FBIN_SIZE 64
#define ANC_REF_FBIN_SIZE ANC_FBIN_SIZE


#if ANC_FBIN_SIZE == 64
#define ANC_FBIN_SIZE_LOG2 6
#define ANC_COMP_FBIN_SIZE 128
#elif ANC_FBIN_SIZE == 128
#define ANC_FBIN_SIZE_LOG2 7
#define ANC_COMP_FBIN_SIZE 256
#endif

#if ANC_REF_FBIN_SIZE == 64
#define ANC_REF_FBAND_SIZE 18
#elif ANC_REF_FBIN_SIZE == 96
#define ANC_REF_FBAND_SIZE 23
#elif ANC_REF_FBIN_SIZE == 128
#define ANC_REF_FBAND_SIZE 28
#endif

#define SV_ANC_DIFF_SUM_WINLEN 20
#define lower_bound(a, b) ((a)<(b)?(b):(a))
#define upper_bound(a, b) ((a)>(b)?(b):(a))
#define bound(a, l, h) upper_bound(lower_bound((a), (l)), (h))


typedef enum { SIL, Rx_ON, NOISE, NONDET, SPEECH } ANC_VAD;
typedef struct ICANC_struct{

	// Unbaised MMSE
	short H1[ANC_FBIN_SIZE] ALIGN64SFX;
	short H1avg[ANC_FBIN_SIZE] ALIGN64SFX;
	int Npsd[ANC_FBIN_SIZE] ALIGN64SFX;
	int Npsdspp[ANC_FBIN_SIZE] ALIGN64SFX;
	int postSNR[ANC_FBIN_SIZE] ALIGN64SFX; // Q15
	
	int XX_inner[ANC_FBIN_SIZE] ALIGN64SFX; 
	int XX_main[ANC_FBIN_SIZE] ALIGN64SFX;
	short X_main_buf[ANC_COMP_FBIN_SIZE] ALIGN64SFX;
	short Xout_inner[ANC_COMP_FBIN_SIZE] ALIGN64SFX;
	short G_inner[ANC_FBIN_SIZE] ALIGN64SFX;
	short G_bfout[ANC_FBIN_SIZE] ALIGN64SFX;

	int w_inner[ANC_COMP_FBIN_SIZE] ALIGN64SFX;
	short Rx_VAD;
	ANC_VAD VAD;
	int vad_hg_cnt;
	int BMNpsd;

	int XXenh_band[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short CepsbasedVAD_cnt;
	short EbasedVAD;
	short EbasedVAD_cnt;
	short SNRbasedVAD;
	short SNRbasedVAD_cnt;

	int Diffsum[SV_ANC_DIFF_SUM_WINLEN];
	short Diffsum_ptr;
	short NoiseLevel;
	short NoiseLevel_cnt;
} InterChnanelANCStatus;
#endif
