/* NOTE: SamsungSolomonVoiceECNSTx.c should be changed to SamsungSolomonVoiceTx.c later */
/* NOTE: SamsungSolomonVoiceECNSTx.h should be changed to SamsungSolomonVoiceTx.h later */
#ifndef	SolomonVoiceTx_H
#define SolomonVoiceTx_H

/****************************************************************************************
*  HEADER FILE
****************************************************************************************/
#ifdef Linux_make
#include "SamsungTxECNS.h"
#elif defined Linux_gcc_make
#include "SamsungTxECNS.h"
#else
#include "SamsungTxECNS.h"
#endif

#define DNN_VAD_ENABLE 0

#define TUNING_ENABLE	1
#define WB_MODE_ONLY	1

/* noise onset hangover */
//#define noise_onset_thd 5 --> tunning parameter

/*   SolomonVoice Mode Config   */
#define	SAMSUNGSOLOMONVOICE_TX_ENABLE				1
#define	SAMSUNGSOLOMONVOICE_TX_DISABLE				0

#define	SAMSUNGSOLOMONVOICE_TX_ECNS_ENABLE			1
#define	SAMSUNGSOLOMONVOICE_TX_ECNS_DISABLE			0
//Add mode for other modules (Tx filter and so on) here
//Ex)
//#define SAMSUNGSOLOMONVOICE_TX_XXXX_ENABLE	(1<<1)

#define SAMSUNGSOLOMONVOICESUPERWIDEBAND_TX			640
#define	SAMSUNGSOLOMONVOICEWIDEBAND_TX				320
#define	SAMSUNGSOLOMONVOICENARROWBAND_TX			160

#define NUM_MIC_TX_MAX 3
#define NUM_MIC_TX_MIN 1
#define NUM_MIC_RX_MAX 2
#define NUM_MIC_RX_MIN 1

#define NUM_DTD_ST_FRM 5		//YLX // TODO: need to moved
#define NUM_EPC_ST_PRE 40   

#if defined (_MSC_VER)
#define DEBUG_DUMP 1
#elif defined (__hexagon__)
#define DEBUG_DUMP 0
#else
#define DEBUG_DUMP 0
#endif

/*
// Moved to SamsungTxECNS_typedef.h
#if defined (__hexagon__)
#define FFT_XTYPE_ENABLE 0
#else
#define FFT_XTYPE_ENABLE 0
#endif
*/

#ifndef	_SolomonVoiceTxEngine_ECNS_Cfg_t_H
#define	_SolomonVoiceTxEngine_ECNS_Cfg_t_H

//Mode
#define ECNS_AEC_ENABLE (1<<0)
#define ECNS_RES_ENABLE (1<<1)
#define ECNS_BF_ENABLE	(1<<2)
#define ECNS_DNN_ENABLE (1<<3)
#define ECNS_PF_ENABLE	(1<<4)
#define ECNS_WNR_ENABLE	(1<<5)
#define ECNS_HPF_ENABLE	(1<<6)
#define ECNS_CAL_ENABLE	(1<<7)

//Call type
#define ECNS_HS		(1<<0)
#define ECNS_HF		(1<<1)
#define ECNS_EAR	(1<<2)
#define ECNS_BT		(1<<3)

//Mic types
#define ECNS_TX_MIC_BOTTOM	0
#define ECNS_TX_MIC_TOP		1
#define ECNS_TX_MIC_BACK	2
#define ECNS_TX_MIC_FRONT	3

//FOR NB
#define         M_FRM_LEN_NB            SAMSUNGSOLOMONVOICENARROWBAND_TX
#define			M_ADF_LEN_NB			96
#define			M_DELAY_RX_FIXED_NB		18
#define			M_DELAY_RX_SEARCH_NB	40
#define			M_DELAY_RX_OFFSET_MAX_NB	(4 * M_DELAY_RX_SEARCH_NB)
#define			M_DELAY_RX_MAX_NB		M_DELAY_RX_FIXED_NB + M_DELAY_RX_OFFSET_MAX_NB
#define			M_MDF_LEN_NB			96
#define			M_MDF_FFT_LEN_NB		256
#define			M_MDF_RFFT_LEN_NB		((M_MDF_FFT_LEN_NB >> 1) + 1)
#define			M_MDF_SUB_LEN_NB		M_MDF_FFT_LEN_NB - M_MDF_LEN_NB
#define         M_DELAY_NB              96
#define         M_FFT_LEN_NB            256
#define         M_FFT_HALFLEN_NB        (M_FFT_LEN_NB >> 1)
#define         M_FREQ_BIN_SIZE_NB      (M_FFT_HALFLEN_NB + 1)


//FOR WB
#define         M_FRM_LEN_WB           SAMSUNGSOLOMONVOICEWIDEBAND_TX
#define			M_ADF_LEN_WB			192
#define			M_DELAY_RX_FIXED_WB		36
#define			M_DELAY_RX_SEARCH_WB	80
#define			M_DELAY_RX_OFFSET_MAX_WB	(4 * M_DELAY_RX_SEARCH_WB)
#define			M_DELAY_RX_MAX_WB		M_DELAY_RX_FIXED_WB + M_DELAY_RX_OFFSET_MAX_WB
#define			M_MDF_LEN_WB			192
#define			M_MDF_FFT_LEN_WB		512
#define			M_MDF_RFFT_LEN_WB		((M_MDF_FFT_LEN_WB >> 1) + 1)
#define			M_MDF_SUB_LEN_WB		M_MDF_FFT_LEN_WB - M_MDF_LEN_WB
#define         M_DELAY_WB             192
#define         M_FFT_LEN_WB           512
#define         M_FFT_HALFLEN_WB       (M_FFT_LEN_WB >> 1)
#define         M_FREQ_BIN_SIZE_WB     (M_FFT_HALFLEN_WB + 1)

//FOR SWB
#define         M_FRM_LEN_SWB          SAMSUNGSOLOMONVOICESUPERWIDEBAND_TX

#if 1
#define			M_ADF_LEN_SWB			192
#define			M_DELAY_RX_FIXED_SWB	72
#define			M_DELAY_RX_SEARCH_SWB	160
#define			M_DELAY_RX_OFFSET_MAX_SWB	(10 * M_DELAY_RX_SEARCH_SWB)
#define			M_DELAY_RX_MAX_SWB			M_DELAY_RX_FIXED_SWB + M_DELAY_RX_OFFSET_MAX_SWB
#define			M_MDF_LEN_SWB			192
#define			M_MDF_FFT_LEN_SWB		512
#else
#define			M_ADF_LEN_SWB			384
#define			M_DELAY_RX_FIXED_SWB	112
#define			M_DELAY_RX_SEARCH_WB	64
#define			M_DELAY_RX_MAX_SWB			M_DELAY_RX_FIXED_SWB + M_DELAY_RX_SEARCH_SWB
#define			M_MDF_LEN_SWB			384
#define			M_MDF_FFT_LEN_SWB		1024
#endif
#define			M_MDF_RFFT_LEN_SWB		((M_MDF_FFT_LEN_SWB >> 1) + 1)
#define			M_MDF_SUB_LEN_SWB		M_MDF_FFT_LEN_SWB - M_MDF_LEN_SWB
#define         M_DELAY_SWB            384
#define         M_FFT_LEN_SWB          1024
#define         M_FFT_HALFLEN_SWB       (M_FFT_LEN_SWB >> 1)
#define         M_FREQ_BIN_SIZE_SWB     (M_FFT_HALFLEN_SWB + 1)

//FOR MAXIMUM matrix value in ADF
#define         M_FRM_LEN_MAX           SAMSUNGSOLOMONVOICESUPERWIDEBAND_TX
#define			M_N_MDF_MAX				2
#define			M_MDF_LEN_MAX			M_MDF_LEN_SWB
#define			M_ADF_LEN_MAX			(M_MDF_LEN_MAX * M_N_MDF_MAX)
#define			M_DELAY_RX_FIXED_MAX	M_DELAY_RX_FIXED_SWB
#define			M_DELAY_RX_SEARCH_MAX	M_DELAY_RX_SEARCH_SWB
#define			M_DELAY_RX_OFFSET_MAX_MAX	(10 * M_DELAY_RX_SEARCH_MAX)
#define			M_DELAY_RX_MAX_MAX		M_DELAY_RX_FIXED_MAX + M_DELAY_RX_OFFSET_MAX_MAX
#define			M_MDF_FFT_LEN_MAX		M_MDF_FFT_LEN_SWB
#define			M_MDF_RFFT_LEN_MAX		((M_MDF_FFT_LEN_MAX >> 1) + 1)
#define			M_MDF_SUB_LEN_MAX		M_MDF_FFT_LEN_MAX - M_MDF_LEN_MAX


// For 1 mic
#define         SMTX_1MIC_M_NUM_CHAN_WB          40
#define         SMTX_1MIC_Nadf_WB                80// multiple number of 8, max 256 
#define         SMTX_1MIC_Nadfshort_WB           48
#define         SMTX_1MIC_M_Nfft_ceps_WB         64
#define         SMTX_1MIC_RxSigon_BuffLen_MAX        1920 // 320*6

#define			F0_BASED_VAD_BUF_SIZE			50

#define			CAL_EQ_FILTER_TAP				31
#define			CAL_EQ_COEFF_NUM				16
#define			HPF_ORDER						5


typedef enum BAND_TYPE_ { NB, WB, SWB } BAND_TYPE;
typedef enum CALL_MODE_ { HS, HF, EAR, BT, DEX_1MIC } CALL_MODE;

typedef enum { 
	NS_STATE_MUTE,
	NS_STATE_NOISE_ONLY,
	NS_STATE_NOISY, 
	NS_STATE_HIGH_SNR
} NS_STATE;

#ifdef _WNR
typedef enum {
	SILENT,
	UNVOICED,
	VOICED,
	CEPSTRUM,
	HPS,
	ORGINAL
} SPEECHTYPE;

typedef enum {
	WNRSTATE_OFF = 0,
	WNRSTATE_OFF2ON,
	WNRSTATE_ON,
	WNRSTATE_ON2OFF
} WNR_wnr_states;

typedef struct {
	Word16 x[M_FFT_LEN_SWB];			//Q15
	Word16 x_d[M_FFT_LEN_SWB];			//Q15
	Word16 x_lpf100[M_FFT_LEN_SWB];		//Q15
	Word32 state_lpf100[5];				//Q15
	Word32 x_win[M_FFT_LEN_SWB];		//Q15, Q9

	Word32 xr[M_FREQ_BIN_SIZE_SWB];		//Q9
	Word32 xi[M_FREQ_BIN_SIZE_SWB];		//Q9
#ifdef DBG_WNR
	Word32 tmp_buf_FFT_out_1[M_FREQ_BIN_SIZE_SWB];
	Word32 tmp_buf_FFT_out_2[M_FREQ_BIN_SIZE_SWB];
#endif

	Word64 psd[M_FREQ_BIN_SIZE_SWB];	//Q18
	Word64 psd_AMS[M_FREQ_BIN_SIZE_SWB];	//Q18

	Word64 E_low;						//Q18 (org : Q15)
	Word64 E_high;

	Word32 ZCR;							//Q15

	Word32 NSTM;						//Q15

	Word16 AMSmode;
	Word16 AMScnt_low;
	Word16 AMScnt_high;

}WNRBufStatus;

typedef struct {
	/********************* WND **********************/
	WNRBufStatus ch_main;
	WNRBufStatus ch_aux;

	Word16 Fs;

	Word16 N_FRAMELEN_WNR;
	Word16 N_FFT_WNR;
	Word16 N_HFFT_WNR;
	Word16 N_FFTANALYSIS_WND;

	Word16 N_WND_ANALYSIS;

	/* psd */
	Word32 psd_alpha;						//Q31
	Word64 phi_main_AMS[M_FREQ_BIN_SIZE_SWB];//Q18
	Word64 phi_main_r[M_FREQ_BIN_SIZE_SWB];	//Q18
	Word64 phi_main_i[M_FREQ_BIN_SIZE_SWB];	//Q18
	Word64 phi_aux_AMS[M_FREQ_BIN_SIZE_SWB];//Q18
	Word64 phi_aux_r[M_FREQ_BIN_SIZE_SWB];	//Q18
	Word64 phi_aux_i[M_FREQ_BIN_SIZE_SWB];	//Q18
	Word64 phi_cross_r[M_FREQ_BIN_SIZE_SWB];//Q18
	Word64 phi_cross_i[M_FREQ_BIN_SIZE_SWB];//Q18

	/* lmsc */
	Word64 MSC[M_FREQ_BIN_SIZE_SWB];		//Q36 (org : Q13)
	Word32 msc_alpha;						//Q15
	Word64 Imsc;							//Q36 (org : Q15)
	Word32 Imsc_alpha_up;					//Q31
	Word32 Imsc_alpha_down;					//Q31

	/* band energy */
	Word32 E_alpha_up;						//Q31
	Word32 E_alpha_down;					//Q31
	Word32 E_bin_from;
	Word32 E_bin_to;

	/* ZCR */
	Word32 D;
	Word32 b_lpf100[3];						//Q13
	Word32 a_lpf100[3];						//Q13
	Word32 ZCR_alpha_up;					//Q15
	Word32 ZCR_alpha_down;					//Q15
	

	/* Short-Term Mean */
	Word16 NSTM_alpha_up;					//Q15
	Word16 NSTM_alpha_down;					//Q15

	/* wind decision */
	Word16 WindFlag[3];

	Word16 wind_hangover_1_up;
	Word16 wind_hangover_1_down;
	Word16 wind_hangover_2_up;
	Word16 wind_hangover_2_down;

	Word64 wind_thr_1_up;
	Word64 wind_thr_1_down;
	Word64 wind_thr_2_up;
	Word64 wind_thr_2_down;
	Word16 wind_thr_3_up;
	Word16 wind_thr_3_down;

	Word64 Thr_E_main;						//Q18
	Word64 Thr_E_aux;						//Q18
	Word32 Thr_zcr;							//Q15
	Word32 Thr_NSTM;						//Q15
	Word64 Thr_Imsc;						//Q36

	Word32 wind_cnt;
	Word32 wind_weak_cnt;
	Word32 wind_main_cnt;
	Word32 wind_main_highEnergy_cnt;
	Word32 wind_aux_cnt;
	Word32 wind_aux_noisy_cnt;

	Word16 wind_state;
	Word16 wind_flag;
	Word16 wind_weak_flag;
	Word16 wind_main_flag;
	Word16 wind_main_highEnergy_flag;
	Word16 wind_aux_flag;
	Word16 wind_aux_noisy_flag;

	Word16 use_main;
	Word16 use_aux;
	Word16 bypass_WND;

	/******************* WNR **********************/
	Word32 fl_xr[M_FREQ_BIN_SIZE_SWB];		//Q24
	Word32 fl_xi[M_FREQ_BIN_SIZE_SWB];		//Q24

	Word32 fXpsd[M_FREQ_BIN_SIZE_SWB];//Q14
	Word32 psdwind_buf[M_FREQ_BIN_SIZE_SWB];//Q23

	Word32 fXpsd_buf[M_FREQ_BIN_SIZE_SWB >> 1];
	Word32 fXpsd_buf_32[M_FREQ_BIN_SIZE_SWB >> 1];
#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 ceps_buf[M_FREQ_BIN_SIZE_SWB]  __attribute__((aligned(128)));
#else
	Word16 ceps_buf[M_FREQ_BIN_SIZE_SWB];
#endif

	Word32 posterioriSNR_WNR[M_FREQ_BIN_SIZE_SWB];
	Word32 wnr_gain[M_FREQ_BIN_SIZE_SWB];//Q15

	Word32 E_low_sm[1];//Q14
	
	Word32 postSNR_min;//Q23
	Word32 Gmin_wnr;// Q15
	Word32 c_wnr;//Q31
	Word32 a_wnr;//Q21

	Word32 val_prev;
	Word32 f0_buf[10];
	Word16 buf_length;
	Word32 f0_prev;
	Word32 SC_prev;

	Word16 morph_on[M_FREQ_BIN_SIZE_SWB];
	Word32 S_env[M_FREQ_BIN_SIZE_SWB];
	Word32 S_NN[M_FREQ_BIN_SIZE_SWB];
	Word32 X_he[M_FREQ_BIN_SIZE_SWB];
	Word32 X_he_prev[M_FREQ_BIN_SIZE_SWB];
	Word16 m_up[M_FREQ_BIN_SIZE_SWB];
	Word16 m_on_prev[M_FREQ_BIN_SIZE_SWB];

	Word32 windtemplet1[M_FREQ_BIN_SIZE_SWB];
	Word32 psd_wind_templet[M_FREQ_BIN_SIZE_SWB];
	Word32 psd_wind_templet_sm[M_FREQ_BIN_SIZE_SWB];
		   
	Word32 wind_cutoff;
	Word32 limit_low;
	Word32 limit_high;
	Word32 vad_thr;
	Word32 lgoffset;
	Word16 vad_alpha;
	Word16 vad_freq_lo;
	Word16 vad_freq_hi;
	Word16 alpha_windslope;
	Word32 wind_psd_slope;
	Word16 wind_slope_tmp;
	Word32 thr_silent;
	Word32 thr_unvoiced;
	Word16 sc_alpha;
	Word16 sc_freq_lo;
	Word16 sc_freq_hi;
	Word16 f0_lpcIndex;
	Word16 f0_hpf_cut;
	Word16 f0_quef_cut;
	Word16 f0_harmNum;
	Word32 f0_gain_lowband;
	Word32 f0_min_xr_buf_32;
	Word16 f0_doubling_rate1;
	Word16 f0_doubling_rate2;
	Word32 harmonic_ratio;	
	Word16 f0_alpha;
	Word16 alpha_NN;
	Word32 gamma;
	Word32 thr_Rising;
	Word16 thr_Morphological;
		   
	Word32 alpha_wind_psd;
	Word32 alpha_Xpsd;
		   
	Word16 aux_ch_gain;

	Word32 a_E_low_sm;
	Word32 a_psd_wind;
	Word32 limit_psd_wind_RF;
	Word32 limit_psd_wind_noRF;
	Word16 slope_wind;
	Word16 a_gain;
			   
	Word16 WNR_lowcut_freq;
		   
	Word16 blk_norm;

	/******************* Mixing **********************/
	Word16 freq_Mx_start;
	Word16 freq_Mx_end;
	Word16 gain_Mx_step;
	Word16 gain_Mx;

	/******************* Switching **********************/
	WNR_wnr_states wnr_state;
	Word16 switching_cnt;
	Word16 switching_max_cnt;
	Word16 switching_step_on;
	Word16 switching_step_off;

	Word16 WNR_1chNSonoff;

	Word16 frame_vad_;
	
	Word16 wind_init;

	/******************* 1ch_NS **********************/
	Word16 PARA_NoiseFloorOffset_0_250Hz_low;
	Word16 PARA_NoiseFloorOffset_0_250Hz_high;

	/******************* Reserved **********************/
	Word16 Enable_aux_channel;
	Word16 WNR_ONOFF;

#ifdef DBG_WNR
	Word32 dbg_tmp1;
	Word32 dbg_tmp2;
	Word32 dbg_tmp3;
#endif

} WNRStatus;
#endif

typedef struct {
	//Static parameters
	Word16 N_ADF;		// Adaptive filter tap length
	Word16 ADF_in_dly;	// Delay for Rx input for ADF
	Word16 LEN_MDF;		// MDF filter length (FFT for MDF / 2)
	Word16 N_FFT_MDF;	// MDF FFT length (FFT for MDF / 2)
	Word16 N_sub;		// MDF frame forward length (FFT for MDF / 2)
	Word16 nMDF;		// N_ADF/N_MDF

	//Threshold
	Word16 ADF_pwr_aecin_avg;
	Word16 ADF_pwr_aecin_Rx_thd;
	Word16 ADF_pwr_aecin_Tx_thd;
	Word16 ADF_THD_DT[NUM_MIC_TX_MAX];
	Word16 ADF_THD_DT_RES[NUM_MIC_TX_MAX];
	Word16 ADF_THD_DT_LF[NUM_MIC_TX_MAX];
	Word16 ADF_THD_DT_HF[NUM_MIC_TX_MAX];

	//Frame status for EC
	Word32 stepsize_init[NUM_MIC_TX_MAX];
	Word32 stepsize[NUM_MIC_TX_MAX];
	Word32 stepsize_epc[NUM_MIC_TX_MAX];
	Word32 regul[NUM_MIC_TX_MAX];
	Word16 Q_fmt_ADF_Coeff[NUM_MIC_TX_MAX];
	Word16 Q_fmt_EXba[NUM_MIC_TX_MAX];
	Word16 beta_release;
	Word16 beta_attack;
	Word16 nbin_lf;
	//Word16 stepsize_shl_EPC[NUM_MIC_TX_MAX];

	//Buffers for EC
	Word16 BUF_RxFrm_Delay_AEC[NUM_MIC_RX_MAX][M_FRM_LEN_MAX + M_DELAY_RX_MAX_MAX + M_ADF_LEN_MAX];
	Word16 BUF_RxFrm_AECin_AEC[NUM_MIC_RX_MAX][M_FRM_LEN_MAX + M_ADF_LEN_MAX];
	Word16 ADF_Coeff_AEC[NUM_MIC_TX_MAX][M_N_MDF_MAX][M_MDF_FFT_LEN_MAX];
	Word16 ADF_Coeff1_AEC[NUM_MIC_TX_MAX][M_N_MDF_MAX][M_MDF_FFT_LEN_MAX];		// Aux Filter Update
	Word32 L_ADF_Coeff_AEC[NUM_MIC_TX_MAX][M_N_MDF_MAX][M_MDF_FFT_LEN_MAX];
	Word32 L_ADF_Coeff1_AEC[NUM_MIC_TX_MAX][M_N_MDF_MAX][M_MDF_FFT_LEN_MAX];		// Aux Filter Update
	Word16 BUF_Xb_MEM_AEC[NUM_MIC_RX_MAX][M_N_MDF_MAX][M_MDF_FFT_LEN_MAX];
	Word16 BUF_Xb_NORM_MEM_AEC[NUM_MIC_RX_MAX][M_N_MDF_MAX];
	Word32 BUF_EXba2_MEM_AEC[NUM_MIC_RX_MAX][M_MDF_RFFT_LEN_MAX];

	// DTD
	Word32 cross_correlation_Qdy[NUM_MIC_TX_MAX];
	Word32 cross_correlation_Qdd[NUM_MIC_TX_MAX];
	Word32 cross_correlation_Qyy[NUM_MIC_TX_MAX];
	Word32 cross_correlation_Qdy_lf[NUM_MIC_TX_MAX];
	Word32 cross_correlation_Qdd_lf[NUM_MIC_TX_MAX];
	Word32 cross_correlation_Qyy_lf[NUM_MIC_TX_MAX];
	Word16 XECC_mem[NUM_MIC_TX_MAX][NUM_DTD_ST_FRM];
	Word16 XECC_mem_lf[NUM_MIC_TX_MAX][NUM_DTD_ST_FRM];

	// Aux filter update
	Word16 AUX_update_once[NUM_MIC_TX_MAX];
	Word16 AUX_update_cnt[NUM_MIC_TX_MAX];
	Word16 AUX_update_thd[NUM_MIC_TX_MAX];

	// Filter convergence detection
	Word32 thd_WnlmsMismatch_init[NUM_MIC_TX_MAX];
	Word32 WnlmsMismatch[NUM_MIC_TX_MAX];
	
	// Regul control
	Word32 Qee_prev[NUM_MIC_TX_MAX][NUM_EPC_ST_PRE]; //for fn2
	Word32 Qee2[NUM_MIC_TX_MAX];  //for fn2
	Word32 Thd_regul_max[NUM_MIC_TX_MAX];
	Word16 a1;
	Word16 a2;
	Word16 regul_stepsize;

	// EPC Detection
	Word32 Qee[NUM_MIC_TX_MAX];		// 1
	Word32 Qdd[NUM_MIC_TX_MAX];
	Word32 Qyy[NUM_MIC_TX_MAX];
	Word32 Qee_DCrjct[NUM_MIC_TX_MAX];
	Word32 Qdd_DCrjct[NUM_MIC_TX_MAX];
	Word32 ea2_prev[NUM_MIC_TX_MAX];
	Word32 da2_prev[NUM_MIC_TX_MAX];
	Word32 Rtdd[NUM_MIC_TX_MAX];
	Word32 Rted[NUM_MIC_TX_MAX];
	Word32 XECC2[NUM_MIC_TX_MAX]; //yingbo.shi only use in xx_EPC_Detection_fn1, so delete it
	Word32 XECC3[NUM_MIC_TX_MAX]; //yingbo.shi only use in xx_EPC_Detection_fn1, so delete it
	Word32 Qey[NUM_MIC_TX_MAX];
	Word32 Ea2[NUM_MIC_TX_MAX];  //for fn1 and fn2
	Word16 hg_epcc;
	Word32 THD[NUM_MIC_TX_MAX];
	Word32 THD2[NUM_MIC_TX_MAX];
	Word32 THD3[NUM_MIC_TX_MAX];
	Word16 THD4[NUM_MIC_TX_MAX];
	Word16 beta0_EPD[NUM_MIC_TX_MAX];
	//end for Fix_EPC_Detection_AEC
	
	// Flags for EC
	Word16 flag_isUpdate[NUM_MIC_TX_MAX];
	Word16 flag_isInit[NUM_MIC_TX_MAX];
	Word16 flag_DTD_prev_state[NUM_MIC_TX_MAX];
	Word16 flag_DTD_LF_prev_state[NUM_MIC_TX_MAX];
	Word16 flag_Tx_Silence[NUM_MIC_TX_MAX];
	Word16 STATUS_current[NUM_MIC_TX_MAX];
	Word16 nBin_isUpdated_once[NUM_MIC_TX_MAX];
	Word16 flag_isabnormal[NUM_MIC_TX_MAX];
	Word16 hg_isabnormal[NUM_MIC_TX_MAX];

	// Flag for WNR
	Word16 flag_isWND;

	//ADDED from VAD
	Word16 flag_Rx_frame_VAD[NUM_MIC_RX_MAX];		// Flag_Rx_VAD
	Word16 flag_Tx_frame_VAD;		// Flag_Tx_VAD
	Word16 flag_Rx_frame_fricative[NUM_MIC_RX_MAX];
	Word16 flag_Rx_frame_ringtone[NUM_MIC_RX_MAX];
	Word16 flag_Rx_frame_singletone[NUM_MIC_RX_MAX];
	Word16 flag_Rx_frame_VAD_last[NUM_MIC_RX_MAX];
	Word32 thd_rx_pwr[NUM_MIC_RX_MAX];
	Word16 thd_rx_fricative_ratio;	//TODO: vectorize
	Word16 flag_Rx_frame_mute[NUM_MIC_RX_MAX];
	Word16 flag_Rx_frame_VAD_loud[NUM_MIC_RX_MAX];

	//for clipping
	Word16 flag_Echo_clipped[NUM_MIC_TX_MAX];
	Word16 thd_clippingdetection_tx_abs;
	Word16 thd_clippingdetection_tx_num;
	Word16 thd_clippingdetection_echo_abs;
	Word16 thd_clippingdetection_echo_num;

	//ADDED for RES
	Word16 flag_isDTD_RES[NUM_MIC_TX_MAX];	// DTD information for subframes
	Word16 flag_DTD_RES_prev_state[NUM_MIC_TX_MAX];
	Word16 XECC_mem_RES[NUM_MIC_TX_MAX][NUM_DTD_ST_FRM];
	Word16 flag_isDTD_LFonly[NUM_MIC_TX_MAX];	// DTD information for subframes
	Word16 flag_isDTD_release[NUM_MIC_TX_MAX];	// DTD information for subframes
	Word16 flag_isDTD_HFonly[NUM_MIC_TX_MAX];	// DTD information for subframes

	Word16 flag_frame_EPC[NUM_MIC_TX_MAX];			// EPC information for frames
	Word16 flag_frame_DTD[NUM_MIC_TX_MAX];			// DTD information for frames (PM_AEC.isDTDfrm)
	Word16 flag_frame_DTD_RES[NUM_MIC_TX_MAX];		// DTD information for frames (PM_AEC.isDTDfrm_RES)
	Word16 flag_frame_EPCC[NUM_MIC_TX_MAX];			// EPCC information for frames
	Word16 flag_frame_DTD_LFonly[NUM_MIC_TX_MAX];	// DTD information for frames
	Word16 hg_EPCC[NUM_MIC_TX_MAX];
	
	// For VAD
	Word32 Pwr_TX_AECIN[NUM_MIC_TX_MAX];
	Word32 Pwr_TX_AECIN_diff_dB[NUM_MIC_TX_MAX];
	Word32 Qxx2[NUM_MIC_TX_MAX];
	Word32 Qyy2[NUM_MIC_TX_MAX];
	Word16 Pwr_RX_TX_diff[NUM_MIC_TX_MAX];
	Word32 THD_Pwr_TX_AECIN_diff_dB[NUM_MIC_TX_MAX];
	Word32 XECC4[NUM_MIC_TX_MAX];
	Word16 THD_Pwr_TX_AECIN_dB[NUM_MIC_TX_MAX];
	Word32 THD_Pwr_RX_TX_diff[NUM_MIC_TX_MAX];
	Word32 Pwr_RX_AECIN[NUM_MIC_RX_MAX];
	Word32 Pwr_RX_AECIN_LF[NUM_MIC_RX_MAX];
	
	Word16 is_Pwr_TX_AECIN_diff_on;
	Word16 is_Pwr_RX_TX_diff_on;
	Word16 Flag_Rx_silent_last;
	Word16 Flag_Rx_VAD_onset;
	Word16 Flag_Rx_frame_VAD_onset[NUM_MIC_RX_MAX];
	Word16 Flag_Rx_VAD_offset;
	Word16 Flag_Rx_frame_VAD_offset[NUM_MIC_RX_MAX];
	Word16 Flag_Rx_impulsive;
	Word16 Flag_Rx_frame_impulsive[NUM_MIC_RX_MAX];
	
	// For Rx delay estimation
	Word16 ADF_in_dly_cur;
	Word16 ADF_in_dly_search;
	Word16 Rx_delay_frm;
	Word16 hg_Rx_delay_frm;
	Word16 hg_Rx_delay_frm_max;

	// For abnormal status
	Word16 thd_hg_abnormal_reset;
	Word16 use_abnormal_reset;
	Word16 thd_abnormal_out_pwr_ratio;

	// Frame buffer
#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 buf_x[M_MDF_FFT_LEN_MAX] __attribute__((aligned(128)));
	Word16 buf_d[M_MDF_FFT_LEN_MAX] __attribute__((aligned(128)));
#else
	Word16 buf_x[M_MDF_FFT_LEN_MAX];
	Word16 buf_d[M_MDF_FFT_LEN_MAX];
#endif
	Word16 buf_d_nf[NUM_MIC_RX_MAX][M_MDF_SUB_LEN_MAX];
	Word16 buf_D[M_MDF_FFT_LEN_MAX];
	Word16 buf_e[M_MDF_SUB_LEN_MAX];
	Word32 L_buf_d[M_MDF_FFT_LEN_MAX];
	Word16 buf_Tx_2mic[M_MDF_FFT_LEN_MAX * 2];
	Word16 buf_Rx[M_MDF_FFT_LEN_MAX];

	// AEC intermediate feature buffer
	Word32 Xba2[M_MDF_RFFT_LEN_MAX];
	Word32 mu[M_MDF_RFFT_LEN_MAX];

	Word32 L_ADF_stepsize[M_MDF_RFFT_LEN_MAX];
#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 Eb[M_MDF_FFT_LEN_MAX] __attribute__((aligned(128)));
	Word16 ADF_update[M_MDF_FFT_LEN_MAX] __attribute__((aligned(128)));
#else
	Word16 Eb[M_MDF_FFT_LEN_MAX];
	Word16 ADF_update[M_MDF_FFT_LEN_MAX];
#endif
	Word64 LL_ADF_update[M_MDF_FFT_LEN_MAX];
	Word16 buf_rx_DCoff_fix[M_MDF_FFT_LEN_MAX];
	Word16 buf_y_DCoff_fix[M_MDF_SUB_LEN_MAX];
	Word16 buf_d_DCoff_fix[M_MDF_SUB_LEN_MAX];
	Word16 buf_rx_LF_fix[M_MDF_FFT_LEN_MAX];
	Word16 buf_y_LF_fix[M_MDF_SUB_LEN_MAX];
	Word16 buf_d_LF_fix[M_MDF_SUB_LEN_MAX];
	Word16 buf_y_HF_fix[M_MDF_SUB_LEN_MAX];
	Word16 buf_d_HF_fix[M_MDF_SUB_LEN_MAX];
	Word32 fx_tmp[NUM_MIC_TX_MAX];
	Word32 Pwr_TX_AECIN_tmp[NUM_MIC_TX_MAX];
	Word16 Pwr_TX_AECIN_dB[NUM_MIC_TX_MAX];

	Word16 buf_y_LF_fix_2[NUM_MIC_TX_MAX][2 * M_MDF_SUB_LEN_MAX];
	Word16 buf_d_LF_fix_2[NUM_MIC_TX_MAX][2 * M_MDF_SUB_LEN_MAX];

	// AEC in/out buffer
	Word16 data_buffer_in[NUM_MIC_TX_MAX][M_FFT_LEN_SWB];
	//Gram-Schmidt orthgonalization
#if 0	// STEREO_RES
	Word16 G_orth[NUM_MIC_RX_MAX];
	Word16 isFirstFrm;
#endif

} AECStatus;


typedef struct _DNN_network_t
{

	Word16 * DNN_workspace_buffer;

	//DNN IO
	Word16 *data_buffer_in_log;
	Word16 *data_buffer_in_noise_log;
	Word16 *data_buffer_out_log;
	
	Word16 *norm_mean; //[DNN_FEATURE_BATCH_LENGTH];
	Word16 *norm_std;//[DNN_FEATURE_BATCH_LENGTH];
	Word16 *denorm_mean; //[DNN_FEATURE_LENGTH];
	Word16 *denorm_std;//[DNN_FEATURE_LENGTH];
	Word16 *denorm_IRM_mean; //[DNN_FEATURE_LENGTH];
	Word16 *denorm_IRM_std;//[DNN_FEATURE_LENGTH];
	
	Word16 *DNN_network_coef;
	Word16 *DNN_network_coef_W_0;  
	Word16 *DNN_network_coef_W_1;
	Word16 *DNN_network_coef_W_2;
	Word16 *DNN_network_coef_W_3;
	Word16 *DNN_network_coef_b_0;  
	Word16 *DNN_network_coef_b_1;
	Word16 *DNN_network_coef_b_2;
	Word16 *DNN_network_coef_b_3;
	Word16 *DNN_network_coef_W0_0;  
	Word16 *DNN_network_coef_W0_1;
	Word16 *DNN_network_coef_W0_2;
	Word16 *DNN_network_coef_W0_3;
	Word16 *DNN_network_coef_b0_0;	
	Word16 *DNN_network_coef_b0_1;
	Word16 *DNN_network_coef_b0_2;
	Word16 *DNN_network_coef_b0_3;
	Word16 *DNN_network_coef_W1_0;  
	Word16 *DNN_network_coef_W1_1;
	Word16 *DNN_network_coef_W1_2;
	Word16 *DNN_network_coef_W1_3;
	Word16 *DNN_network_coef_b1_0;	
	Word16 *DNN_network_coef_b1_1;
	Word16 *DNN_network_coef_b1_2;
	Word16 *DNN_network_coef_b1_3;
	Word16 *DNN_network_coef_W2_0;  
	Word16 *DNN_network_coef_W2_1;
	Word16 *DNN_network_coef_W2_2;
	Word16 *DNN_network_coef_W2_3;
	Word16 *DNN_network_coef_W_IRM_0;
	Word16 *DNN_network_coef_W_IRM_1;
	Word16 *DNN_network_coef_W_IRM_2;
	Word16 *DNN_network_coef_W_IRM_3;
	Word16 *DNN_network_coef_b2;	//[output_node_number]
	Word16 *DNN_network_coef_b_IRM;//[output_node_number]
	
	Word16 *DNN_feature_batch; //[DNN_FEATURE_BATCH_LENGTH];
	Word16 *DNN_feature_batch_norm;
	Word32 *DNN_speech_amplitude_log_norm;
	Word32 *DNN_speech_amplitude_IRM_log_norm;

	Word32 *DNN_asm_tmp;

	Word32 *out_layer1_0;
	Word32 *out_layer1_1;
	Word32 *out_layer1_2;
	Word32 *out_layer1_3;

	Word32 *out_layer2_0;
	Word32 *out_layer2_1;
	Word32 *out_layer2_2;
	Word32 *out_layer2_3;

	Word32 *out_layer3_0;
	Word32 *out_layer3_1;
	Word32 *out_layer3_2;
	Word32 *out_layer3_3;

	Word32 *out_speech_0;
	Word32 *out_speech_1;
	Word32 *out_speech_2;
	Word32 *out_speech_3;
	Word32 *out_IRM_0;
	Word32 *out_IRM_1;
	Word32 *out_IRM_2;
	Word32 *out_IRM_3;

	//Word64 input_layer_cycle;

}DNN_network_t;


typedef struct {

	// Buffers
	Word16 WINDOW_NSWB[M_DELAY_WB + M_FRM_LEN_WB];
	Word16 OVERLAP_NSWB[M_FFT_LEN_WB - M_FRM_LEN_WB];
	Word16 WINDOW_OVERLAP_NSWB[M_DELAY_WB];

	Word16 CHANINDEX[SMTX_1MIC_M_NUM_CHAN_WB][2];
	Word16 CHAN_NUMBIN[SMTX_1MIC_M_NUM_CHAN_WB][2];
	Word32 L_SNRMTX[SMTX_1MIC_M_NUM_CHAN_WB][4];

	Word32 L_Npsd[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_Npsd_MMSE_ini[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_Npsd_MMSE_TMP[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 P_H1_ravg[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNRpost_prv[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 Gmmse[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 spp[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNRprio_avg[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNR_by_Nmmse_ini_avg[SMTX_1MIC_M_NUM_CHAN_WB];

	Word16 beta_ceps[SMTX_1MIC_M_Nfft_ceps_WB];
	Word16 SNR_ini_ceps_avg[SMTX_1MIC_M_Nfft_ceps_WB];
	Word16 SNR_ini_ceps_Fixedavg[SMTX_1MIC_M_Nfft_ceps_WB];

	Word16 INDEX_SNRMTX;

	Word16 PRE_EMP;
	Word16 DE_EMP;
	Word16 NORM_PRV;

	Word16 hov_tx_noisefree_cnt;
	Word16 noise_floor_offset;
	Word16 gain_Npsd;

	Word16 Flag_RxVAD_AEC;/*Flag_RxVAD_AEC=1 when PwrRx>THD, 	ini_val = 0	*/
	Word16 Flag_Tx_LoudSig; // 1:oud Tx. avoid cepstral smoothing
	Word16 Flag_is_DTD_AEC;

	//NS buff
	Word32 L_SNR_by_Nmmse_ini[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNR_by_Nmmse_global[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_tmpvec[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_tmpvec1[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 S_tmpvec[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 S_noise_floor[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 S_spp_ns[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 S_Gns_final[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 P_H1[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 P_H0[SMTX_1MIC_M_NUM_CHAN_WB];
	Word16 P_H1_GbyL[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNRpost[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNRprio[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_EsqrNS[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_EsqrNS_q30[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNR_by_Nmmse_ini_cepsmooth[SMTX_1MIC_M_NUM_CHAN_WB];
	Word32 L_SNR_by_Nmmse_ini_cepsmooth_fix[SMTX_1MIC_M_NUM_CHAN_WB];

	Word16 GmmseNFFT[M_FFT_HALFLEN_WB];
	Word32 L_EEBin[M_FFT_HALFLEN_WB];

	Word16 S_tmpfft1[M_FFT_HALFLEN_WB];
	Word16 Pwr_TX_AECIN_dB;

	Word16 tmpvec_ceps[SMTX_1MIC_M_Nfft_ceps_WB];
	Word16 SNR_ini_ceps[SMTX_1MIC_M_Nfft_ceps_WB];
	Word16 tmp_beta_ceps[SMTX_1MIC_M_Nfft_ceps_WB];

	Word32 HPFcoeff[5];
	Word32 LPFcoeff[5];
	Word32 HPFstateTx[5];
	Word32 HPFstateRx[5];
	Word32 LPFstateTx[5];
	Word32 LPFstateRx[5];

#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 data_buffer[M_FFT_LEN_SWB] __attribute__((aligned(128)));
#else
	Word16 data_buffer[M_FFT_LEN_SWB];
#endif

	// AMS parameters
	Word16 AMS_enable;
	Word16 AMS_on_hg_thd;
	Word16 AMS_on_hg_cur;
	Word16 AMS_off_hg_thd;
	Word16 AMS_off_hg_cur;

	// ECNS basic parameter	
	Word16 PARA_ns_level;
	Word16 PARA_FLAG_FIRST_FRM;
	Word16 PARA_Q_for_InSigGain;

	// Freq. NS tunning parameter 		
	Word16 PARA_HangOver_Cnt_NoiseFree;
	Word16 PARA_Slop_SNRiniAvg_for_beta;
	Word16 PARA_xi_for_SPP_Table;
	Word16 PARA_Npsd_Gain_MIN;
	Word16 PARA_NoiseFloor_Offset_MAX;
	Word16 PARA_slope_prioriSNR_for_NoiseFloor;
	Word16 PARA_MIN_CHAN_PWR;
	Word16 PARA_MIN_NOISE_PWR;
	Word16 PARA_NoiseFloorOffset_0_250Hz_low;
	Word16 PARA_NoiseFloorOffset_0_250Hz_high;
	Word16 PARA_NoiseFloorOffset_250_4000Hz_low;
	Word16 PARA_NoiseFloorOffset_250_4000Hz_high;
	Word16 PARA_NoiseFloorOffset_4000_8000Hz_low;
	Word16 PARA_NoiseFloorOffset_4000_8000Hz_high;
	Word32 PARA_THD_Pwr_Lo_1k_4k;
	Word32 PARA_THD_Lo_SNRiniAvg_for_beta;
	Word32 PARA_THD_Hi_SNRiniAvg_for_beta;
	Word32 PARA_THD_Lo_prioriSNR_for_NoiseFloor;
	Word32 PARA_THD_Hi_prioriSNR_for_NoiseFloor;
	Word16 PARA_FixedXi[SMTX_1MIC_M_NUM_CHAN_WB][3];

	Word16 PARA_THD_Pwr_Tx_dB;
	Word16 PARA_THD_Pwr_Tx_Loud_dB;

	Word16 PARA_NS_1mic_on;
	Word16 PARA_fDRC_on;
	Word16 PARA_fDRC_THD_Lo_EEBin;
	Word16 PARA_fDRC_THD_Hi_EEBin;
	Word16 PARA_fDRC_gain;
	Word16 PARA_fDRC_Q_format;

} ECNSStatus_1mic;

typedef struct {
	Word64 fX_abs_2[M_FREQ_BIN_SIZE_SWB];//Q23
	Word32 log_X_abs_2[M_FREQ_BIN_SIZE_SWB]; //Q10
	Word32 norm_log_X_abs_2[M_FREQ_BIN_SIZE_SWB];
	Word32 log_prev_X_abs_2[FRAME_DIFF_BUF_SIZE][M_FREQ_BIN_SIZE_SWB]; //Q10
	Word16 log_prev_X_abs_2_ptr;
	Word32 log_X_diff[M_FREQ_BIN_SIZE_SWB]; //Q10
	Word64 frame_energy; //Q23
	Word64 target_band_energy; //Q23

	Word16 f0_map[M_FREQ_BIN_SIZE_SWB];//Q23
#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 ceps[M_FREQ_BIN_SIZE_SWB] __attribute__((aligned(128)));
#else
	Word16 ceps[M_FREQ_BIN_SIZE_SWB];
#endif
	Word16 ceps_blk_norm;

	Word16 N_HFFT_LOG2;
	Word16 N_HFFT;
	Word16 N_FFT;
	Word16 blk_norm;
	Word16 ceps_max;

	Word32 ceps_lbound;
	Word32 e_lbound;

	Word16	buf_length;

	Word32 limit_low, limit_high;
	Word32 f0_prev;
	Word32 f0_buf[10];
} F0_EST;


typedef struct {
	F0_EST f0_est;

	Word32 HNR;
	Word32 HNR_buf[F0_BASED_VAD_BUF_SIZE];
	Word16 HNR_buf_ptr;

	Word16 ceps_max_buf[F0_BASED_VAD_BUF_SIZE];
	Word16 ceps_max_buf_ptr;
	Word16 mute_cnt;

	Word16 pscore_high_cnt;
	Word16 pscore_high_cnt2;

	Word16 hnr_onset_cnt;
	Word16 hnr_endurance_cnt;

	Word16 pscore_ceps_threshold;
	Word16 pscore_threthold;
	Word16 pscore_threthold2;

	Word16 pscore_based_vad_onset_delay;


	Word16 hnr_high_threshold;//Q15
	Word16 hnr_low_threshold;//Q15
	Word16 hnr_onset_delay;
	Word16 hnr_onset_penalty;
	Word16 hnr_endurance_cnt_max;

	Word16 clean_speech_detection;
	Word16 noise_check_at_speech_absence_cnt;
	
} F0_BASED_VAD;

typedef struct {

	Word16 NS_state;
	//Buffers for NS
	Word16 WINDOW_NS[M_DELAY_SWB + M_FRM_LEN_SWB];

	Word16 BUF_ola_frame_in[NUM_MIC_TX_MAX][M_DELAY_SWB];
	Word16 BUF_ola_frame_in_rx[NUM_MIC_TX_MAX][M_DELAY_SWB];
	Word16 BUF_ola_frame_in_rx_nl[NUM_MIC_TX_MAX][M_DELAY_SWB];
	Word16 BUF_ola_frame_speech_out[M_FFT_LEN_SWB - M_FRM_LEN_SWB];

#if defined (ECNS_DEBUG) || (DEBUG_DUMP == 1)
	Word16 BUF_ola_frame_bf_out[M_FFT_LEN_SWB - M_FRM_LEN_SWB];
	Word16 BUF_ola_frame_bm_out[M_FFT_LEN_SWB - M_FRM_LEN_SWB];
	Word16 BUF_ola_frame_dnn_out[M_FFT_LEN_SWB - M_FRM_LEN_SWB];
	Word16 BUF_ola_frame_IRM_out[M_FFT_LEN_SWB - M_FRM_LEN_SWB];
	Word16 BUF_ola_frame_RES_out[NUM_MIC_TX_MAX][M_FFT_LEN_SWB - M_FRM_LEN_SWB];
#endif
#ifdef ECNS_DEBUG
	Word16 BUF_ola_frame_RES_est[NUM_MIC_TX_MAX][M_FFT_LEN_SWB - M_FRM_LEN_SWB];
#endif

	Word16 Gbin_NS[(M_FFT_LEN_SWB >> 1) + 1];

#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 BUF_frame_in[NUM_MIC_TX_MAX][M_FFT_LEN_SWB] __attribute__((aligned(128)));
	//NOTE: These buffer is defined as 128bit aligned for safety
	Word16 BUF_frame_bf_out[M_FFT_LEN_SWB] __attribute__((aligned(128)));
	Word16 BUF_frame_bm_out[M_FFT_LEN_SWB] __attribute__((aligned(128)));
	Word16 BUF_frame_res_out[NUM_MIC_TX_MAX][M_FFT_LEN_SWB] __attribute__((aligned(128)));
	Word16 BUF_frame_dnn_out[M_FFT_LEN_SWB] __attribute__((aligned(128)));
	Word16 BUF_frame_pf_out[M_FFT_LEN_SWB] __attribute__((aligned(128)));
#ifdef _WNR
	Word16 BUF_frame_wnr_out[M_FFT_LEN_SWB] __attribute__((aligned(128)));
#endif
#else
	Word16 BUF_frame_in[NUM_MIC_TX_MAX][M_FFT_LEN_SWB];
	Word16 BUF_frame_bf_out[M_FFT_LEN_SWB];
	Word16 BUF_frame_bm_out[M_FFT_LEN_SWB];
	Word16 BUF_frame_bm_out_2[M_FFT_LEN_SWB];

	Word16 BUF_frame_res_out[NUM_MIC_TX_MAX][M_FFT_LEN_SWB];
	Word16 BUF_frame_dnn_out[M_FFT_LEN_SWB];
	Word16 BUF_frame_pf_out[M_FFT_LEN_SWB];
#ifdef _WNR
	Word16 BUF_frame_wnr_out[M_FFT_LEN_SWB];
#endif
#endif
#if (DEBUG_DUMP == 1)
	Word16 BUF_frame_aec_out[NUM_MIC_TX_MAX][M_FRM_LEN_SWB];	// for debug only
#endif
	Word16 BM_update_mask[M_FREQ_BIN_SIZE_SWB];
	Word16 blk_max_ch[NUM_MIC_TX_MAX];
	Word16 blk_max_ch_rx[NUM_MIC_TX_MAX];
	Word16 blk_norm_rx[NUM_MIC_TX_MAX];
	Word16 blk_max_ch_rx_nl[NUM_MIC_TX_MAX];
	Word16 blk_norm_rx_nl[NUM_MIC_TX_MAX];
	Word16 BUF_frame_anc_out[M_FFT_LEN_SWB];

#ifdef ECNS_DEBUG
	Word16 BUF_frame_res_est[NUM_MIC_TX_MAX][M_FFT_LEN_SWB];	// for debug only
#endif

	//KHQ: can be altered to use malloc()
#if defined (__hexagon__) && (FFT_XTYPE_ENABLE == 1)
	Word16 BUF_frame_in_rx[NUM_MIC_RX_MAX][M_FFT_LEN_SWB] __attribute__((aligned(128)));
	Word16 BUF_frame_in_rx_nl[NUM_MIC_RX_MAX][M_FFT_LEN_SWB] __attribute__((aligned(128)));
#else
	Word16 BUF_frame_in_rx[NUM_MIC_RX_MAX][M_FFT_LEN_SWB];
	Word16 BUF_frame_in_rx_nl[NUM_MIC_RX_MAX][M_FFT_LEN_SWB];
#endif

	// DNN
	Word16 speech_logspec[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 noise_logspec[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 speech_out_logspec[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 IRM_out_logspec[(M_FFT_LEN_SWB >> 1) + 1];

	Word16 logspec_mismatch[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 logspec_dnn_out_gain[(M_FFT_LEN_SWB >> 1) + 1];


	Word16 noise_logspec_tmp[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 speech_out_logspec_tmp[(M_FFT_LEN_SWB >> 1) + 1];

	Word16 noise_logspec_stored[(M_FFT_LEN_SWB >> 1) + 1];

	Word16 dnn_out_bgn_log_gain[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 dnn_out_bgn_log_gain_low_snr[(M_FFT_LEN_SWB >> 1) + 1];

	Word16 minG_for_resi_Npsd[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 minG_mask_for_resi_Npsd[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 dnn_gain_control_enable;
	//Word32 high_SNR_mode_dnn_thd[(M_FFT_LEN_SWB >> 1) + 1]; //Q15
	
	Word16 noise_mismatch_bias[M_FREQ_BIN_SIZE_SWB];
	Word16 dnn_out_boosting_bias[M_FREQ_BIN_SIZE_SWB];
	Word16 noise_mismatch_bias_echo;
	Word16 noise_mismatch_bias_echo_cur;
	Word16 noise_mismatch_bias_echo_release;

	Word16 noise_mismatch_alpha;
	Word16 noise_mismatch_alpha_inv;
	Word16 noise_mismatch_spp_thr;
	//Word16 noise_mismatch_for_noise_free[(M_FFT_LEN_SWB >> 1) + 1];

	Word16 dnn_out_boosting_alpha;
	Word16 dnn_out_boosting_alpha_inv;
	Word16 dnn_out_boosting_spp_thr;
	Word16 dnn_out_boosting_IRM_thr;


	FC_buffer flag;
	GSC_buffer gsc_fixed;
	CGMM_buffer cgmm;
	CSP_param CSP;
	CSP_param CSP2;

	F0_BASED_VAD f0_vad;
#if DNN_VAD_ENABLE
	SamsungDNNVAD_t VAD_st;
#endif

#if FLOAT_PF
	PF_buffer pf;
	PE_buffer pe;
#else
	PF_buffer_fixed pf;
#endif

	RES_buffer* p_res[NUM_MIC_TX_MAX];
	RES_buffer res[NUM_MIC_TX_MAX];

	Word16 pwr_ratio_Q12;

	// for multiple talker scenario
	Word16 multiple_talker_flag;
	Word16 multiple_talker_hg_cnt;
	Word16 multiple_talker_hg_cnt2;

	Word16 BM_linear_domain_compensating_factor;
	Word16 BM_log_domain_compensating_factor;

	Word16 DNN_high_SNR_mode_mask[M_FREQ_BIN_SIZE_SWB];
	

	Word32 high_SNR_mode_bf_thd[(M_FFT_LEN_SWB >> 1) + 1]; //Q15
	Word32 high_SNR_mode_bf_thd2[(M_FFT_LEN_SWB >> 1) + 1]; //Q15

	Word32 high_SNR_mode_dnn_thd[(M_FFT_LEN_SWB >> 1) + 1]; //Q15
	Word32 high_SNR_mode_pf_thd[(M_FFT_LEN_SWB >> 1) + 1]; //Q15

	Word16 Smin_log_thd[(M_FFT_LEN_SWB >> 1) + 1];
	Word16 noise_mismatch_for_noise_free[(M_FFT_LEN_SWB >> 1) + 1];
								   //for HF
	Word32 high_SNR_mode_dnn_thd_HF[(M_FFT_LEN_SWB >> 1) + 1]; //Q15

	Word16 ref_g[M_FREQ_BIN_SIZE_SWB];
	Word32 Npsd_freq[M_FREQ_BIN_SIZE_SWB];

	Word16 in_gain_freq_enable;
	Word16 noise_onset;
	Word16 noise_onset_thd;
	Word16 noise_onset_v2;

	Word16 low_SNR_mode_mask[M_FREQ_BIN_SIZE_SWB];

	mic_status_s mic_status;

	Word16 gain_compensate_top_mic[M_FREQ_BIN_SIZE_SWB]; // Q10
	Word32 Npsd_topmic[M_FREQ_BIN_SIZE_SWB]; // Q30

	Word16 pscore_cvad;
	Word32 low_SNR_mode_E_thd;
} ECNSStatus;

// Structure for HPF, EQ filter
typedef struct {
	Word16 hpf_cutoff[NUM_MIC_TX_MAX + 1];
	Word32 hpf_coeff[NUM_MIC_TX_MAX + 1][HPF_ORDER];	// iir coeff
	Word32 hpf_state[NUM_MIC_TX_MAX + 1][HPF_ORDER];	// iir history variable
} TxHPFStatus;

typedef struct {
	Word16 FIRCoef[NUM_MIC_TX_MAX + 1][CAL_EQ_FILTER_TAP];
	Word16 FIRBuff[NUM_MIC_TX_MAX + 1][M_FRM_LEN_WB + CAL_EQ_FILTER_TAP - 1];
} TxEQStatus;

typedef struct {

	// Common Parameters
	Word16 ECNS_enable;		// ECNS on/off
	Word16 ECNS_mode;		// ECNS module on/off
	CALL_MODE call_mode;	// ECNS call mode (HS, HF, EAR, BT, DEX_1MIC)
	BAND_TYPE band_type;	// ECNS band type (NB, WB, SWB)
	Word16 NumMics;
	Word16 NumSPKs;
	//Word16 mode_change;
	
	// Modes
	Word16 aec_enable;
	Word16 ns_enable;
	Word16 res_enable;
	Word16 bf_enable;
	Word16 dnn_enable;
	Word16 pf_enable;
	Word16 wnr_enable;
	Word16 cal_enable;
	Word16 hpf_enable;

	//Input gain
	Word16 Gain_Tx[NUM_MIC_TX_MAX];
	Word16 Gain_NS_In[NUM_MIC_TX_MAX];
	Word16 Gain_NS_In_Q[NUM_MIC_TX_MAX];
	Word16 Gain_out;
	Word16 Gain_out_AMS;
	Word16 Gain_out_AMS_Q;

	//Word16 **Speech;
	Word16 *Speech[NUM_MIC_TX_MAX];
	//Word16 **Speech_cal;
	Word16 *Speech_cal[NUM_MIC_TX_MAX];
	//Word16 **Speech_rx;
	Word16 *Speech_rx[NUM_MIC_RX_MAX];
	Word16 *OutSignal;
	Word16 *Temp;
	Word16 Frm_len;
	Word16 Fft_len;
	Word16 freq_bin_size;
	Word16 Delay_len;
	
	Word16 hg_mute_init;
	Word16 hg_in_mute_init;

	Word16 DC_offset[NUM_MIC_TX_MAX];

	// Parameters for NS
	// TODO: move to ECNSStatus??
	Word16 thd_frm_VAD_lf;
	Word16 thd_frm_VAD_hf;
	Word16 use_frm_VAD2;
	Word16 thd_frm_VAD2;//Q11

	Word16 Tx_mic_types[NUM_MIC_TX_MAX];
	Word16 Rx_spk_types[NUM_MIC_TX_MAX];

	TxHPFStatus TxHPF;
	TxEQStatus TxEQ;

	ECNSStatus_1mic AECNS_1mic;
	ECNSStatus AECNS;
	AECStatus AECADF;
	DNN_network_t DNN_network_var;
	//DNN_network_float_t DNN_network_float_var;
#ifdef _WNR
	WNRStatus WNR_handle;
#endif

} SolomonVoiceTxEngine_ECNS_Cfg_t;

#endif

/******************************************************************************
*  TUNNING PARAMETERS
*****************************************************************************/

//Basic
typedef struct {

	Word16 txMode;
	Word16 ECNS_Mode;
	Word16 Call_Mode;
	Word16 Band_Mode;

	Word16 Len_Frm_Mute_Init_In;
	Word16 Len_Frm_Mute_Init_Out;

	Word16 Num_Tx_Channel;
	Word16 Num_Rx_Channel;

	Word16 HPF_cutoff_0;
	Word16 HPF_cutoff_1;
	Word16 HPF_cutoff_2;
	Word16 HPF_cutoff_3;

	Word16 Gain_Tx_In_0;
	Word16 Gain_Tx_In_1;
	Word16 Gain_Tx_In_2;
	Word16 Gain_Tx_In_3;
	Word16 Gain_NS_In_0;
	Word16 Gain_NS_In_1;
	Word16 Gain_NS_In_2;
	Word16 Gain_NS_In_3;
	Word16 Gain_Out;

	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;

} SamsungSolomonVoiceTxModeParam;

typedef struct {

	Word16 FIR_EQ_0_Coef[CAL_EQ_COEFF_NUM];
	Word16 FIR_EQ_1_Coef[CAL_EQ_COEFF_NUM];
	Word16 FIR_EQ_2_Coef[CAL_EQ_COEFF_NUM];
	Word16 FIR_EQ_3_Coef[CAL_EQ_COEFF_NUM];

} SamsungSolomonVoiceTxEQParam;

// AEC
typedef struct {

	// RX delay and change detection
	Word16 LEN_RX_DELAY;
	Word16 LEN_RX_DELAY_SEARCH;

	// AEC NLMS filter
	Word16 N_MDF;
	Word16 THD_NLMS_FILTER_MISMATCH_TX0;
	Word16 THD_NLMS_FILTER_MISMATCH_TX1;
	Word16 PARAM_NLMS_STEPSIZE_INIT_TX0;
	Word16 PARAM_NLMS_STEPSIZE_INIT_TX1;
	Word16 PARAM_NLMS_STEPSIZE_TX0;
	Word16 PARAM_NLMS_STEPSIZE_TX1;
	Word16 PARAM_NLMS_STEPSIZE_EPC_TX0;
	Word16 PARAM_NLMS_STEPSIZE_EPC_TX1;

	// Double-talk detection (DTD)
	Word16 THD_DTD_AEC_TX0;
	Word16 THD_DTD_AEC_TX1;
	Word16 THD_DTD_RES_TX0;
	Word16 THD_DTD_RES_TX1;
	Word16 THD_DTD_AEC_LF_TX0;
	Word16 THD_DTD_AEC_LF_TX1;
	Word16 THD_DTD_AEC_HF_TX0;
	Word16 THD_DTD_AEC_HF_TX1;

	// Regularization and divergence protection
	Word16 LEN_FRM_NLMS_AUX_FILTER_UPDATE_TX0;
	Word16 LEN_FRM_NLMS_AUX_FILTER_UPDATE_TX1;
	Word16 PARAM_REGUL_MAX_TX0;
	Word16 PARAM_REGUL_MAX_TX1;
	Word16 THD_REGUL_OUT_PWR;

	// Tx, Rx Voice activity detection (VAD)
	Word16 THD_TX_PWR_DIFF;
	Word16 PARAM_RX_TX_PWR_RATIO_TX0;
	Word16 PARAM_RX_TX_PWR_RATIO_LF_TX0;
	Word16 PARAM_RX_TX_PWR_RATIO_TX1;
	Word16 PARAM_RX_TX_PWR_RATIO_LF_TX1;
	Word16 THD_RX_TX_PWR_RATIO;
	Word16 THD_RX_PWR_RX0;
	Word16 THD_RX_PWR_RX1;
	Word16 THD_RX_FRICATIVE_RATIO_RX0;
	Word16 THD_RX_FRICATIVE_RATIO_RX1;
	Word16 THD_RX_ONSET_RX0;
	Word16 THD_RX_ONSET_RX1;
	Word16 THD_TX_CLIPPING_DETECTION_TX0;
	Word16 THD_TX_CLIPPING_DETECTION_TX1;

	// AEC NLMS Q format
	Word16 PARAM_Q_FMT_ADF_COEFF_TX0;
	Word16 PARAM_Q_FMT_ADF_COEFF_TX1;

	// Rx PSD smoothing
	Word16 PARAM_RX_PSD_BETA_RELEASE;
	Word16 PARAM_RX_PSD_BETA_ATTACK;

	// Echo path change (EPC) detection
	Word16 THD_EPC_1_TX0;
	Word16 THD_EPC_1_TX1;
	Word16 THD_EPC_2_TX0;
	Word16 THD_EPC_2_TX1;
	Word16 THD_EPC_3_TX0;
	Word16 THD_EPC_3_TX1;
	Word16 THD_EPC_4_TX0;
	Word16 THD_EPC_4_TX1;
	Word16 PARAM_BETA_EPC_TX0;
	Word16 PARAM_BETA_EPC_TX1;
	Word16 PARAM_HG_EPCDT_TX0;
	Word16 PARAM_HG_EPCDT_TX1;

	// Noise free flag
	Word16 THD_PWR_NOISE_FREE_AEC;

	// Reserved
	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;
	Word16 RSV_3;
	Word16 RSV_4;

} SamsungSolomonVoiceTxAECParam;

// RES
typedef struct {

	// RES operation mode
	Word16 RES_MODE_TX0;
	Word16 RES_MODE_TX1;
	Word16 RES_MODE_TX2;
	Word16 ERL_ECHO_REF_3RD;
	Word16 GAIN_RX2_PROX;

	// Main mic
	// Overestimation gain for status
	Word16 GAIN_OVER_STATUS_0N6_TX0;
	Word16 GAIN_OVER_STATUS_1_TX0;
	Word16 GAIN_OVER_STATUS_2_TX0;
	Word16 GAIN_OVER_STATUS_3_TX0;
	Word16 GAIN_OVER_STATUS_4_TX0;
	Word16 GAIN_OVER_STATUS_5_TX0;
	Word16 GAIN_OVER_STATUS_7N8_TX0;
	Word16 GAIN_OVER_STATUS_9_TX0;
	Word16 GAIN_OVER_STATUS_10_TX0;
	Word16 GAIN_OVER_STATUS_13_TX0;
	Word16 GAIN_OVER_MIN_TOTAL_TX0;
	// Overestimation gain for bands
	Word16 PARAM_NUM_OVER_BANDS_TX0;	// not used
	Word16 PARAM_BAND_0_TX0;
	Word16 PARAM_BAND_1_TX0;
	Word16 PARAM_BAND_2_TX0;
	Word16 PARAM_BAND_3_TX0;
	Word16 PARAM_BAND_4_TX0;
	Word16 PARAM_BAND_5_TX0;			// not used
	Word16 GAIN_OVER_BAND_0_TX0;
	Word16 GAIN_OVER_BAND_1_TX0;
	Word16 GAIN_OVER_BAND_2_TX0;
	Word16 GAIN_OVER_BAND_3_TX0;
	Word16 GAIN_OVER_BAND_4_TX0;
	Word16 GAIN_OVER_BAND_5_TX0;
	// Minimum gain
	Word16 GAIN_RES_MIN_1ST_TX0;
	Word16 GAIN_RES_MIN_TOTAL_TX0;
	// Echo PSD smoothing
	Word16 PARAM_BETA_RELEASE_LIN_TX0;
	Word16 PARAM_BETA_ATTACK_LIN_TX0;
	Word16 PARAM_BETA_RELEASE_NL_TX0;
	Word16 PARAM_BETA_ATTACK_NL_TX0;
	Word16 PARAM_BAND_LF_TX0;
	// RES init
	Word16 PARAM_REGRESSION_INIT_LF_TX0;
	Word16 PARAM_REGRESSION_INIT_HF_TX0;
	// Aux filter update
	Word16 LEN_FRM_RES_AUX_FILTER_UPDATE_TX0;
	// Echo delay decaying
	Word16 PARAM_LATE_ECHO_DECAY_LF_TX0;
	Word16 PARAM_LATE_ECHO_DECAY_HF_TX0;
	// Other RES flags
	Word16 THD_HG_RX_VAD_ONSET_TX0;
	Word16 THD_MAX_SPP_NPSD_ECHO_TX0;
	Word16 THD_PWR_NOISE_FREE_RES_TX0;
	Word16 THD_MIN_BAND_ECHO_TX0;

	// Aux mic (2nd, top)
	// Overestimation gain for status
	Word16 GAIN_OVER_STATUS_0N6_TX1;
	Word16 GAIN_OVER_STATUS_1_TX1;
	Word16 GAIN_OVER_STATUS_2_TX1;
	Word16 GAIN_OVER_STATUS_3_TX1;
	Word16 GAIN_OVER_STATUS_4_TX1;
	Word16 GAIN_OVER_STATUS_5_TX1;
	Word16 GAIN_OVER_STATUS_7N8_TX1;
	Word16 GAIN_OVER_STATUS_9_TX1;
	Word16 GAIN_OVER_STATUS_10_TX1;
	Word16 GAIN_OVER_STATUS_13_TX1;
	Word16 GAIN_OVER_MIN_TOTAL_TX1;
	// Overestimation gain for bands
	Word16 PARAM_NUM_OVER_BANDS_TX1;	// not used
	Word16 PARAM_BAND_0_TX1;
	Word16 PARAM_BAND_1_TX1;
	Word16 PARAM_BAND_2_TX1;
	Word16 PARAM_BAND_3_TX1;
	Word16 PARAM_BAND_4_TX1;
	Word16 PARAM_BAND_5_TX1;			// not used
	Word16 GAIN_OVER_BAND_0_TX1;
	Word16 GAIN_OVER_BAND_1_TX1;
	Word16 GAIN_OVER_BAND_2_TX1;
	Word16 GAIN_OVER_BAND_3_TX1;
	Word16 GAIN_OVER_BAND_4_TX1;
	Word16 GAIN_OVER_BAND_5_TX1;
	// Minimum gain
	Word16 GAIN_RES_MIN_1ST_TX1;
	Word16 GAIN_RES_MIN_TOTAL_TX1;
	// Echo PSD smoothing
	Word16 PARAM_BETA_RELEASE_LIN_TX1;
	Word16 PARAM_BETA_ATTACK_LIN_TX1;
	Word16 PARAM_BETA_RELEASE_NL_TX1;
	Word16 PARAM_BETA_ATTACK_NL_TX1;
	Word16 PARAM_BAND_LF_TX1;
	// RES init
	Word16 PARAM_REGRESSION_INIT_LF_TX1;
	Word16 PARAM_REGRESSION_INIT_HF_TX1;
	// Aux filter update
	Word16 LEN_FRM_RES_AUX_FILTER_UPDATE_TX1;
	// Echo delay decaying
	Word16 PARAM_LATE_ECHO_DECAY_LF_TX1;
	Word16 PARAM_LATE_ECHO_DECAY_HF_TX1;
	// Other RES flags
	Word16 THD_HG_RX_VAD_ONSET_TX1;
	Word16 THD_MAX_SPP_NPSD_ECHO_TX1;
	Word16 THD_PWR_NOISE_FREE_RES_TX1;
	Word16 THD_MIN_BAND_ECHO_TX1;

	// Aux mic (3rd, back)
	// Overestimation gain for status
	Word16 GAIN_OVER_STATUS_0N6_TX2;
	Word16 GAIN_OVER_STATUS_1_TX2;
	Word16 GAIN_OVER_STATUS_2_TX2;
	Word16 GAIN_OVER_STATUS_3_TX2;
	Word16 GAIN_OVER_STATUS_4_TX2;
	Word16 GAIN_OVER_STATUS_5_TX2;
	Word16 GAIN_OVER_STATUS_7N8_TX2;
	Word16 GAIN_OVER_STATUS_9_TX2;
	Word16 GAIN_OVER_STATUS_10_TX2;
	Word16 GAIN_OVER_STATUS_13_TX2;
	Word16 GAIN_OVER_MIN_TOTAL_TX2;
	// Overestimation gain for bands
	Word16 PARAM_NUM_OVER_BANDS_TX2;	// not used
	Word16 PARAM_BAND_0_TX2;
	Word16 PARAM_BAND_1_TX2;
	Word16 PARAM_BAND_2_TX2;
	Word16 PARAM_BAND_3_TX2;
	Word16 PARAM_BAND_4_TX2;
	Word16 PARAM_BAND_5_TX2;			// not used
	Word16 GAIN_OVER_BAND_0_TX2;
	Word16 GAIN_OVER_BAND_1_TX2;
	Word16 GAIN_OVER_BAND_2_TX2;
	Word16 GAIN_OVER_BAND_3_TX2;
	Word16 GAIN_OVER_BAND_4_TX2;
	Word16 GAIN_OVER_BAND_5_TX2;
	// Minimum gain
	Word16 GAIN_RES_MIN_1ST_TX2;
	Word16 GAIN_RES_MIN_TOTAL_TX2;
	// Echo PSD smoothing
	Word16 PARAM_BETA_RELEASE_LIN_TX2;
	Word16 PARAM_BETA_ATTACK_LIN_TX2;
	Word16 PARAM_BETA_RELEASE_NL_TX2;
	Word16 PARAM_BETA_ATTACK_NL_TX2;
	Word16 PARAM_BAND_LF_TX2;
	// RES init
	Word16 PARAM_REGRESSION_INIT_LF_TX2;
	Word16 PARAM_REGRESSION_INIT_HF_TX2;
	// Aux filter update
	Word16 LEN_FRM_RES_AUX_FILTER_UPDATE_TX2;
	// Echo delay decaying
	Word16 PARAM_LATE_ECHO_DECAY_LF_TX2;
	Word16 PARAM_LATE_ECHO_DECAY_HF_TX2;
	// Other RES flags
	Word16 THD_HG_RX_VAD_ONSET_TX2;
	Word16 THD_MAX_SPP_NPSD_ECHO_TX2;
	Word16 THD_PWR_NOISE_FREE_RES_TX2;
	Word16 THD_MIN_BAND_ECHO_TX2;

	// Reserved parameters
	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;
	Word16 RSV_3;
	Word16 RSV_4;

} SamsungSolomonVoiceTxRESParam;

// NS
typedef struct {
	/*********** DNN related parameters *************/
	Word16 DNN__noise_mismatch_bias1;
	Word16 DNN__noise_mismatch_bias2;
	Word16 DNN__noise_mismatch_bias3;
	Word16 DNN__noise_mismatch_bias4;
	Word16 DNN__noise_mismatch_bias5;
	Word16 DNN__dnn_out_boosting_bias1;
	Word16 DNN__dnn_out_boosting_bias2;
	Word16 DNN__dnn_out_boosting_bias3;
	Word16 DNN__dnn_out_boosting_bias4;
	Word16 DNN__dnn_out_boosting_bias5;
	Word16 DNN__noise_mismatch_for_noise_free1;
	Word16 DNN__noise_mismatch_for_noise_free2;
	Word16 DNN__noise_mismatch_for_noise_free3;
	Word16 DNN__noise_mismatch_for_noise_free4;
	Word16 DNN__noise_mismatch_for_noise_free5;
	Word16 DNN__gain_control_enable;
	Word16 DNN__minG_mask_for_resi_Npsd_freq1;
	Word16 DNN__minG_mask_for_resi_Npsd_freq2;
	Word16 DNN__minG_mask_for_resi_Npsd_freq3;
	Word16 DNN__minG_mask_for_resi_Npsd_freq4;
	Word16 DNN__minG_mask_for_resi_Npsd_freq5;
	Word16 DNN__minG_mask_for_resi_Npsd_freq6;
	Word16 DNN__out_bgn_log_gain_freq1;
	Word16 DNN__out_bgn_log_gain_freq2;
	Word16 DNN__out_bgn_log_gain_freq3;
	Word16 DNN__out_bgn_log_gain_freq4;
	Word16 DNN__out_bgn_log_gain_freq5;
	Word16 DNN__out_bgn_log_gain_freq6;
	Word16 DNN__out_bgn_log_gain_low_snr_freq1;
	Word16 DNN__out_bgn_log_gain_low_snr_freq2;
	Word16 DNN__out_bgn_log_gain_low_snr_freq3;
	Word16 DNN__out_bgn_log_gain_low_snr_freq4;
	Word16 DNN__out_bgn_log_gain_low_snr_freq5;
	Word16 DNN__out_bgn_log_gain_low_snr_freq6;

	/*********** Postfilter related parameters *************/
	Word16 PF__sap_mode;
	Word16 PF__output_mode;
	Word16 PF__DC_remove;
	Word16 PF__gamma_bound_ch1_1;
	Word16 PF__gamma_bound_ch1_2;
	Word16 PF__gamma_bound_ch1_3;
	Word16 PF__gamma_bound_ch1_4;
	Word16 PF__gamma_bound_ch2_1;
	Word16 PF__gamma_bound_ch2_2;
	Word16 PF__gamma_bound_ch2_3;
	Word16 PF__gamma_bound_ch2_4;
	Word16 PF__gamma_bound_ch1_2nd_1;
	Word16 PF__gamma_bound_ch1_2nd_2;
	Word16 PF__gamma_bound_ch1_2nd_3;
	Word16 PF__gamma_bound_ch1_2nd_4;
	Word16 PF__gamma_bound_ch2_2nd_1;
	Word16 PF__gamma_bound_ch2_2nd_2;
	Word16 PF__gamma_bound_ch2_2nd_3;
	Word16 PF__gamma_bound_ch2_2nd_4;
	Word16 PF__gamma_0_1_MSB;
	Word16 PF__gamma_0_1_LSB;
	Word16 PF__gamma_0_2_MSB;
	Word16 PF__gamma_0_2_LSB;
	Word16 PF__gamma_0_3_MSB;
	Word16 PF__gamma_0_3_LSB;
	Word16 PF__gamma_0_4_MSB;
	Word16 PF__gamma_0_4_LSB;
	Word16 PF__gamma_0_2_1_MSB;
	Word16 PF__gamma_0_2_1_LSB;
	Word16 PF__gamma_0_2_2_MSB;
	Word16 PF__gamma_0_2_2_LSB;
	Word16 PF__gamma_0_2_3_MSB;
	Word16 PF__gamma_0_2_3_LSB;
	Word16 PF__gamma_0_2_4_MSB;
	Word16 PF__gamma_0_2_4_LSB;
	Word16 PF__sap1_oef1;
	Word16 PF__sap1_oef2;
	Word16 PF__sap1_oef3;
	Word16 PF__sap1_oef4;
	Word16 PF__sap2_oef1;
	Word16 PF__sap2_oef2;
	Word16 PF__sap2_oef3;
	Word16 PF__sap2_oef4;
	Word16 PF__Npsd_oef1;
	Word16 PF__Npsd_oef2;
	Word16 PF__Npsd_oef3;
	Word16 PF__Npsd_oef4;
	Word16 PF__sap1_oef_abnormal_pos_freq1;
	Word16 PF__sap1_oef_abnormal_pos_freq2;
	Word16 PF__sap1_oef_abnormal_pos_freq3;
	Word16 PF__sap1_oef_abnormal_pos_freq4;
	Word16 PF__sap2_oef_abnormal_pos_freq1;
	Word16 PF__sap2_oef_abnormal_pos_freq2;
	Word16 PF__sap2_oef_abnormal_pos_freq3;
	Word16 PF__sap2_oef_abnormal_pos_freq4;
	Word16 PF__Npsd_oef_abnormal_pos_freq1;
	Word16 PF__Npsd_oef_abnormal_pos_freq2;
	Word16 PF__Npsd_oef_abnormal_pos_freq3;
	Word16 PF__Npsd_oef_abnormal_pos_freq4;
	Word16 PF__Npsd_oef_high_snr_freq1;
	Word16 PF__Npsd_oef_high_snr_freq2;
	Word16 PF__Npsd_oef_high_snr_freq3;
	Word16 PF__Npsd_oef_high_snr_freq4;
	Word16 PF__Npsd_oef_high_snr_freq5;
	Word16 PF__gain_compensation_disable;
	Word16 PF__Gmin_gain;
	Word16 PF__final_gain_forgetting_factor_alpha;
	Word16 PF__Gmin_non_speech;
	Word16 PF__Gmin_lowbounder;
	Word16 PF__bgn_mag_gain_freq1;
	Word16 PF__bgn_mag_gain_freq2;
	Word16 PF__bgn_mag_gain_freq3;
	Word16 PF__bgn_mag_gain_freq4;
	Word16 PF__bgn_mag_gain_freq5;
	Word16 PF__bgn_mag_gain_freq6;
	Word16 PF__bgn_pow_gain_freq1;
	Word16 PF__bgn_pow_gain_freq2;
	Word16 PF__bgn_pow_gain_freq3;
	Word16 PF__bgn_pow_gain_freq4;
	Word16 PF__bgn_pow_gain_freq5;
	Word16 PF__bgn_pow_gain_freq6;
	Word16 PF__thd_NS_freq1;
	Word16 PF__thd_NS_freq2;
	Word16 PF__thd_NS_freq3;
	Word16 PF__thd_NS_freq4;
	Word16 PF__thd_NG_time;

	/*********** VAD & NS status related parameters *************/
	Word16 VAD__use_frm_VAD2;
	Word16 STATE__noise_onset_thd;
	Word16 STATE__HS_abnormal_pos_max_cnt;
	Word16 STATE__thd_noise_free;
	Word16 STATE__thd_noise_free_Rx;
	Word16 STATE__thd_noise_free_ultra;
	Word16 STATE__noise_free_flag_hg_max_ultra;

	/*********** Reserved parameters *************/
	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;
	Word16 RSV_3;
	Word16 RSV_4;
	
} SamsungSolomonVoiceTxNSParam;

// NS 1mic mode
typedef struct {

	// NS 1mic operation
	Word16 PARA_ns_level;

	// VAD
	Word16 PARA_THD_Pwr_Tx_dB;
	Word16 PARA_THD_Pwr_Tx_Loud_dB;
	Word16 PARA_THD_Pwr_Lo_1k_4k_dB;
	
	// SPP & NPSD
	Word16 PARA_xi_for_SPP_Table;
	Word16 PARA_HangOver_Cnt_NoiseFree;
	Word16 PARA_THD_Lo_SNRiniAvg_for_beta;
	Word16 PARA_THD_Hi_SNRiniAvg_for_beta;
	Word16 PARA_Slop_SNRiniAvg_for_beta;
	Word16 PARA_MIN_NOISE_PWR;
	Word16 PARA_Npsd_Gain_MIN;
	
	// Noise floor
	Word16 PARA_NoiseFloor_Offset_MAX;
	Word16 PARA_THD_Lo_prioriSNR_for_NoiseFloor_dB;
	Word16 PARA_THD_Hi_prioriSNR_for_NoiseFloor_dB;
	Word16 PARA_slope_prioriSNR_for_NoiseFloor;
	Word16 PARA_NoiseFloorOffset_0_250Hz_low;
	Word16 PARA_NoiseFloorOffset_0_250Hz_high;
	Word16 PARA_NoiseFloorOffset_250_4000Hz_low;
	Word16 PARA_NoiseFloorOffset_250_4000Hz_high;
	Word16 PARA_NoiseFloorOffset_4000_8000Hz_low;
	Word16 PARA_NoiseFloorOffset_4000_8000Hz_high;
	Word16 PARA_NoiseFloorOffset_8000_NyquistHz_low;
	Word16 PARA_NoiseFloorOffset_8000_NyquistHz_high;
	
	// DRC
	Word16 PARA_fDRC_on;
	Word16 PARA_fDRC_THD_Lo_EEBin;
	Word16 PARA_fDRC_THD_Hi_EEBin;
	Word16 PARA_fDRC_gain;
	Word16 PARA_fDRC_Q_format;
	
	// Fixed Xi
	Word16 PARA_FixedXi_0k_1k;
	Word16 PARA_FixedXi_1k_2k;
	Word16 PARA_FixedXi_2k_4k;
	Word16 PARA_FixedXi_4k_8k;
	Word16 PARA_FixedXi_8k_Nyquistk;

	// Reserved
	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;
	Word16 RSV_3;
	Word16 RSV_4;

} SamsungSolomonVoiceTxNS1micParam;

// WNR
typedef struct {

	Word16 ONOFF;
	Word16 WNR_MODE;
	Word16 LOWCUTFREQ;
	Word16 HANGOVER_0;
	Word16 HANGOVER_1;
	Word16 HANGOVER_2;
	Word16 HANGOVER_3;
	Word16 THR_WND_E_0;
	Word16 THR_WND_E_1;
	Word16 THR_WND_ZCR;
	Word16 THR_WND_NSTM;
	Word16 THR_WND_IMSC;
	Word16 THR_MIC0_0;
	Word16 THR_MIC0_1;
	Word16 THR_MIC1_0;
	Word16 THR_MIC1_1;
	Word16 THR_MICSWITCHING_0;
	Word16 THR_MICSWITCHING_1;
	Word16 THR_MICSWITCHING_2;
	Word16 MAINSPEECH_FREQ;
	Word16 MAINSPEECH_GAIN;
	Word16 MAINSPEECH_MU;
	Word16 MAINSPEECH_DELTA;
	Word16 MAINSPEECH_SM0;
	Word16 MAINSPEECH_SM1;
	Word16 MAINSPEECH_SM2;
	Word16 PARAM_POSTSNR;
	Word16 PARAM_GMIN;
	Word16 PARAM_A;
	Word16 PARAM_C;
	Word16 WIND_PSD_0;
	Word16 THR_RF;
	Word16 WIND_PSD_LIMIT_0;
	Word16 WIND_PSD_LIMIT_1;
	Word16 F0_ALPHA;
	Word16 POSTNS_0;
	Word16 POSTNS_1;
	Word16 POSTNS_2;
	Word16 POSTNS_3;
	Word16 NOISEFLOOR_0;
	Word16 NOISEFLOOR_1;
	Word16 NOISEFLOOR_2;
	Word16 NOISEFLOOR_3;
	Word16 NOISEFLOOR_4;
	Word16 NOISEFLOOR_5;
	Word16 NOISEFLOOR_6;
	Word16 NOISEFLOOR_7;
	Word16 RSV_0;
	Word16 RSV_1;
	Word16 RSV_2;
	Word16 RSV_3;
	Word16 RSV_4;

} SamsungSolomonVoiceTxWNRParam;

typedef struct {

	SamsungSolomonVoiceTxModeParam		MODE_param;
	SamsungSolomonVoiceTxEQParam		EQ_param;
	SamsungSolomonVoiceTxAECParam		AEC_param;
	SamsungSolomonVoiceTxRESParam		RES_param;
	SamsungSolomonVoiceTxNSParam		NS_param;
	SamsungSolomonVoiceTxNS1micParam	NS_1mic_param;
	SamsungSolomonVoiceTxWNRParam		WNR_param;

} SamsungSolomonVoiceTxParam;

typedef struct {
	Word16 **Speech;
	Word16 **Speech_rx;
	Word16 *OutSignal;	
	Word16 Mode;	// SolomonVoiceTx module on/off
	Word16 BandWidth;
	//Word16 NumMics;
	//Word16 NumSPKs;

	SolomonVoiceTxEngine_ECNS_Cfg_t *DVTX_ECNS_vars;
	SolomonVoiceTxEngine_ECNS_Cfg_t SAM_DNN_ECNS_STRUCT;
	
} SamsungSolomonVoiceTxEngine_Handle_t;


/******************************************************************************
*  FUNCTION PROTOTYPES
*****************************************************************************/
extern int SamsungSolomonVoiceTxEngineInit(SamsungSolomonVoiceTxEngine_Handle_t* DVTX_vars, Word16 mics, Word16 spks, Word16 bandwidth);
extern int SamsungSolomonVoiceTxEngineConfig(SamsungSolomonVoiceTxEngine_Handle_t* DVTX_vars, SamsungSolomonVoiceTxParam *SamsungSolomonParam_varsTx);
extern int SamsungSolomonVoiceTxEngineExe(SamsungSolomonVoiceTxEngine_Handle_t* DVTX_vars, SamsungSolomonVoiceTxParam *SamsungSolomonParam_varsTx, Word16 **speech_tx, Word16 **speech_rx, Word16 *output);

#endif
