
#ifndef	SolmonVoice_H
#define SolmonVoice_H
#include "Define_config.h"
//#include "SamsungSolomonVoiceW_Int.h"
/****************************************************************************************
*  HEADER FILE
****************************************************************************************/

#define OUTER_NUM 2

/*   DiamondVoice Mode Config   */
#define	SAMSUNGECNS_TX_ON							(1<<0)
#define	SAMSUNGECNS_TX_OFF							0x0

#define	SAMSUNGDIAMONDVOICE_TX_ENABLE				1
#define	SAMSUNGDIAMONDVOICE_TX_DISABLE				0

#define SAMSUNGDIAMONDVOICESUPERWIDEBAND_TX			640
#define	SAMSUNGDIAMONDVOICEWIDEBAND_TX				320
#define	SAMSUNGDIAMONDVOICENARROWBAND_TX			160

#ifndef	_SolomonVoiceEngine_ECNS_Cfg_t_H
#define	_SolomonVoiceEngine_ECNS_Cfg_t_H

//FOR NB
#define         DVTX_M_FRM_LEN_NB            160
#define         DVTX_M_DELAY_NB              96 // max 96 for 256pointFFT
#define         DVTX_M_FFT_LEN_NB            256
#define         DVTX_M_FFT_HALFLEN_NB        128
#define         DVTX_M_NUM_CHAN_NB           28 //28
#define         DVTX_Nadf_NB                 80 // multiple number of 8, mumax 256
#define         DVTX_Nadfshort_NB            32 // same to WB
#define         DVTX_M_Nfft_ceps_NB          64 // same to WB

//FOR WB
#define         DVTX_M_FRM_LEN_WB           320
#define         DVTX_M_DELAY_WB             192
#define         DVTX_M_FFT_LEN_WB           512
#define         DVTX_M_FFT_HALFLEN_WB       256
#define         DVTX_M_NUM_CHAN_WB          40 //40
#define         DVTX_Nadf_WB                80// multiple number of 8, max 256
#define         DVTX_Nadfshort_WB           48
#define         DVTX_M_Nfft_ceps_WB         64

#define         DVTX_M_LTSV_R            16
#define         DVTX_M_LTSV_Ksrt         15
#define         DVTX_M_LTSV_Kend         127
#define         DVTX_M_LTSV_Nbin         (DVTX_M_LTSV_Kend - DVTX_M_LTSV_Ksrt + 1)

//FOR FIR Filter
#define			SF_FRAME_LENGTH_SWB					640
#define			SF_FIRFILTERNUM						63
#define			SF_FIRFILTER_CENTER					31
#define			SF_FIRFILTER_BYPASS					16384
#define			FIRFILTERTEMP					32
// for NB WB common
#define         DVTX_Nadf_MAX                256

#define DVTX_FIXED_ONE(qfrac)        ((unsigned int)      1 << (qfrac))

#define         DVTX_RxSigon_BuffLen_MAX        1920 // 320*6

#define         DVTX_RxSigOnset_FRAME_WB              6
#define         DVTX_RxSigOnset_FRAME_NB              12

#define         DVTX_DelayCompenRange_Less_WB     20

#define         DVTX_DelayCompenRange_Less_NB     10

/* 20180713 Moving Average for Outer Power */
#define		   MA_frame 64
#define		   MA_frame_s 8
// 20180914  ADF delay represented # of FrameSize
#define Delay_numFrame 12	//160 * Delay_numFrame

#define data_opt_notUsed  // not used data buffer
#define data_reduce

/* 20181015 check Data optimization (sqrt_root, table) */
#define sqrt_root
#define table_cal

#define NFIR 20
#define LPCORDER 16
#define LPCORDER_NB 10

typedef enum {
	CH_INNER,
	CH_OUTER_1,
	CH_OUTER_2
} CHANNEL;
#if(FLAG_SELECT_C_DSP == 0)
#define ALIGN64SFX __attribute__ ((aligned(16)))
#else
#define ALIGN64SFX
#endif
typedef struct { //COMMONBUF
	// Inner output
	short Output_buf_Inner[SAMSUNGDIAMONDVOICEWIDEBAND_TX] ALIGN64SFX;

	// common buffer
	int Buff_L_NB[DVTX_M_FRM_LEN_NB] ALIGN64SFX; //sBuff1
	int Buff_L_NB2[DVTX_M_FRM_LEN_NB] ALIGN64SFX; //sBuff1
	int Buff_L_WB[DVTX_M_FFT_LEN_WB] ALIGN64SFX; //sBuff

	// PreNS
	short	Gmin;
	short dummy;
	int  gL_EEii[DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	short gf0contourAvg[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int  *gL_EEoo_07;
	short gtmpf0contour[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX; // tmporay vector

	// RES
	int     gL_DDBin[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	int     gL_EEBin[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	short   gGpwrres[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	short 	gW_fnlms_reression[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	short 	gW_fnlms_reression2[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	short 	gG_fnlms[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;

	// NS
	short *gS_tmpfft1;
	int   ECNSbuff_L_SNR_by_Nmmse_ini[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int   ECNSbuff_L_SNR_by_Nmmse_global[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	int   ECNSbuff_L_tmpvec[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int   ECNSbuff_L_tmpvec1[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short  ECNSbuff_S_tmpvec[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short  ECNSbuff_S_noise_floor[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short  ECNSbuff_S_spp_ns[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short  ECNSbuff_P_H1[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short  ECNSbuff_P_H1_GbyL[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int   ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int   ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth_fix[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short  ECNSbuff_tmpvec_ceps[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;
	short  ECNSbuff_SNR_ini_ceps[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;
	short  ECNSbuff_tmp_beta_ceps[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;

	int     gL_RRBin_step[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;

	// AEC
	short gRxFrm_Delay_AEC[((2000 * OUTER_NUM) + 1000)] ALIGN64SFX;
	short gRxFrm_AECin_AEC[(DVTX_M_FRM_LEN_WB + DVTX_Nadf_MAX /*- 1*/) * OUTER_NUM + DVTX_M_FRM_LEN_NB + DVTX_Nadf_MAX] ALIGN64SFX;
	short gE_tx_AEC[DVTX_M_FRM_LEN_WB * OUTER_NUM + DVTX_M_FRM_LEN_NB] ALIGN64SFX;
	short gE_tx_AECaux[DVTX_M_FRM_LEN_WB * OUTER_NUM + DVTX_M_FRM_LEN_NB] ALIGN64SFX;
	short gRxFFTfrm_AEC[DVTX_M_FRM_LEN_WB * OUTER_NUM + DVTX_M_FRM_LEN_NB] ALIGN64SFX;
	short gRxFFTfrm_clp_AEC[DVTX_M_FRM_LEN_WB * OUTER_NUM + DVTX_M_FRM_LEN_NB] ALIGN64SFX;

	// FrmVAD
	int gavg_ANC_sigPwr[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;

	// ANC
	int gANC_sigPwr[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB] ALIGN64SFX;
	int  	gANC_sigPwr_inner[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;//TODO: Need to debug actually DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB shld be suficient
	int 	gEnhenced_Signal[DVTX_M_FFT_LEN_WB + DVTX_M_FFT_LEN_NB] ALIGN64SFX;
	short 	gANC_W_Filter[DVTX_M_FFT_LEN_WB + DVTX_M_FFT_LEN_NB] ALIGN64SFX;

	// Mixing
	int  ECNSbuff_L_EEBin_forMixing[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

}COMMONBUF;

typedef struct {
	short PRE_EMP;
	short BLK_NORM;
	short NORM_PRV;
	short data_buffer[DVTX_M_FFT_LEN_NB] ALIGN64SFX;
	short WINDOW_OVERLAP[DVTX_M_DELAY_NB] ALIGN64SFX;
}FFTBUF_NB;

typedef struct {
	short PRE_EMP;
	short BLK_NORM;
	short NORM_PRV;
	short data_buffer[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
	short WINDOW_OVERLAP[DVTX_M_DELAY_WB] ALIGN64SFX;
}FFTBUF_WB;

typedef struct {
	short DE_EMP;
	short OVERLAP[DVTX_M_FFT_LEN_NB - DVTX_M_FRM_LEN_NB] ALIGN64SFX;
}IFFTBUF_NB;

typedef struct {
	short DE_EMP;
	short OVERLAP[DVTX_M_FFT_LEN_WB - DVTX_M_FRM_LEN_WB] ALIGN64SFX;
}IFFTBUF_WB;

typedef struct {//Inner, Outer °ψΕλ

	short Flag_Tx_Clipping_Inner;
	short Flag_Tx_Clipping_Outer_1;
	short Flag_Tx_Clipping_Outer_2;

	// back up inner 16kHz input signal
	short Speech_Tx_Inner_WB[SAMSUNGDIAMONDVOICEWIDEBAND_TX] ALIGN64SFX;
#if(FLAG_SELECT_C_DSP == 1)
	short dbg_buffer_Outer[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
#endif
	short data_buffer_forMixing[DVTX_M_FFT_LEN_WB] ALIGN64SFX;

	// OLA
	FFTBUF_NB fftbuf_Inner ALIGN64SFX;		//data_buffer_NB
	FFTBUF_NB fftbuf_RX_Inner ALIGN64SFX;	//data_buffer_rx_NB
	FFTBUF_NB fftbuf_RX2_Inner ALIGN64SFX; //data_buffer_rx2_NB
	FFTBUF_WB fftbuf_Inner_WB ALIGN64SFX;	//data_buffer_inner_WB
	FFTBUF_WB fftbuf_Outer_1 ALIGN64SFX;		//data_buffer_WB
	FFTBUF_WB fftbuf_Outer_2 ALIGN64SFX;		//data_buffer_WB
	FFTBUF_WB fftbuf_RX_Outer ALIGN64SFX;	//data_buffer_rx_WB
	FFTBUF_WB fftbuf_RX2_Outer ALIGN64SFX; //data_buffer_rx2_WB
	// OLA (NB mode)
	FFTBUF_NB fftbuf_Outer_NB ALIGN64SFX;	//data_buffer_NB
	FFTBUF_NB fftbuf_RX_Outer_NB ALIGN64SFX;	//data_buffer_rx_NB
	FFTBUF_NB fftbuf_RX2_Outer_NB ALIGN64SFX; //data_buffer_rx2_NB
	
	// IOLA
	IFFTBUF_WB Ifftbuf_Output ALIGN64SFX;
	IFFTBUF_WB Ifftbuf_Inner_WB ALIGN64SFX;
	IFFTBUF_WB Ifftbuf_Outer_WB ALIGN64SFX;
	// IOLA (NB mode)
	IFFTBUF_NB Ifftbuf_Output_NB ALIGN64SFX;

	int  *L_EEBin_forMixing;

	/********* outer IIR Filtering ********/
	int HPFstateOuterTx_1[5] ALIGN64SFX;
	int HPFstateOuterTx_2[5] ALIGN64SFX;
	int HPFstateOuterRx[5] ALIGN64SFX;

	/********* inner downsampling : 16kHz to 8kHz ********/
	long Buf_Downsample_InnerRx[8] ALIGN64SFX;
	long Buf_Downsample_InnerTx[8] ALIGN64SFX;

	int   Pwr_1kHz_to_4kHz_Inner;
	int   Pwr_100Hz_to_1kHz_Inner;
	int   Pwr_1kHz_to_4kHz_Outer;
	int   Pwr_100Hz_to_1kHz_Outer;

	int  *avg_ANC_sigPwr_Inner;
	int  *avg_ANC_sigPwr_Outer;

	int FrmPiLowBand_Inner;
	int FrmRioLowBand_Inner;
	int FrmPiLowBand_Outer;
	int FrmRioLowBand_Outer;

	short VariableTHD_Ratio_LowBandPwr;
	short VariableTHD_THD_Pwr_inner;
	short FrmDT_Inner;
	short FrmDT_Outer;

	short FrmVAD_Inner;
	short FrmVAD_Outer;

	// MCRA-based VAD THD decision
	short Avg_FrmPiLowBand;
	short PtBuff_FrmPiLowBand;
	short Buff_FrmPiLowBand[100/*DVTX_NumFrm_MCRA_VAD*/] ALIGN64SFX;
	short MinVal_FrmPiLowBand;

} FRAMEStatus;

typedef struct {//Inner, Outer Ί°΅΅
	short *adf_var;

	short ADF_IN[DVTX_Nadf_MAX] ALIGN64SFX;

	short W[DVTX_Nadf_WB] ALIGN64SFX;
	short Waux[DVTX_Nadf_WB] ALIGN64SFX;

	short Buff_RxOnset_aecout[DVTX_RxSigon_BuffLen_MAX] ALIGN64SFX; // max 4 frmae 320*4=1280, NB/WB common
	short Buff_RxOnset_txin[DVTX_RxSigon_BuffLen_MAX] ALIGN64SFX;

	short ADF_IN_short[DVTX_Nadfshort_WB] ALIGN64SFX;

	short Pwr_RX_AECIN_dB;
	short Pwr_TX_AECIN_dB;
	short Pwr_TX_AECOUT_dB;
	short Pwr_TX_AECauxOUT_dB;
	short PwrDiff_AECinout_dB;

	int L_Pwr_tonality_ringband;
	int L_Pwr_tonality_otherband;

	short Count_DelayCompensation_function_exe;

	int Cnt_Samples_NLMSupdate;

	short *E_tx_AEC;
	short  *E_tx_AECaux;

	short *RxFrm_Delay_AEC;
	short *RxFrm_AECin_AEC;
	short *RxFFTfrm_AEC;
	short *RxFFTfrm_clp_AEC;

	//short   Flag_Tx_Clipping;
	short   Flag_RxVAD_AEC;/*Flag_RxVAD_AEC=1 when PwrRx>THD, 	ini_val = 0	*/
	short   Flag_TxSilence_AEC;// 1:sig activ 0:silence, ini=1, Npsd_silence est.
	short   Flag_Tx_LoudSig; // 1:oud Tx. avoid cepstral smoothing
	short   Flag_SingleTalk;
	short   Flag_SingleNET;
	short   Flag_ringbakctone;
	short   Flag_IniRxSigOnset;
	short   Flag_Waux_update;
	short   Flag_Tx_silent_mode;

	short hangover_cnt_flag_RxVAD_First;

	short Qex_q;
	short Qxx_q;
	int  L_Qex;
	int  L_Qxx;
	short XECC;
	short Threshold_XECC;

} AECStatus;


typedef struct {
	short tmp;

	short XoutGSC[DVTX_M_FFT_LEN_WB] ALIGN64SFX;

	int GXo1Xo2EQ[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int PwrXo1EQ[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	short qXX01EQ;
	int PwrXo2EQ[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	short qXX02EQ;

	int XXo1[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX; // 1-frame volatile
	int XXo2[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX; // 1-frame volatile

	int tmpvec256A[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;// 1-frame volatile
	int tmpvec256B[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;// 1-frame volatile

	short pH1mic[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;// 1-frame volatile
	short pH1micavg[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int Npsdmic[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int Npsdsppmic[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

	short pH1gsc[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;// 1-frame volatile
	short pH1gscavg[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int   Npsdgsc[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int   Npsdsppgsc[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

	int SxMtxLtsv[DVTX_M_LTSV_Nbin][DVTX_M_LTSV_R] ALIGN64SFX;
	short ColIndexSxMtx;

	short Flag_AbnormalMic;

	/* GSC */
	short(*wBF)[514] ALIGN64SFX;
	short(*wMaxNSR)[514] ALIGN64SFX;
	short X_F_NSR[(DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2] ALIGN64SFX;
	short X_B_NSR[(DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2] ALIGN64SFX;
	short XoBcNSRNfrm[2][(DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2] ALIGN64SFX;
	short WgscNSR[(DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2] ALIGN64SFX;
	short WgscNSRNfrm[2][(DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2] ALIGN64SFX;
	int XXgsc[DVTX_M_FFT_HALFLEN_WB/* + 1*/] ALIGN64SFX;
	short  qXXgsc;
	short Q_ps_cepsavg_prev;


	/*Npsdbm for NS */
	int PwrXXgsc[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int PwrXXbm[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int NpsdBM[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int G_gsc_bm[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int NpsdBFout[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

	/* pitch enhancement */
	int ps[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;
	int ps_ceps[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
	int ps_cepsavg[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
	int XX_GSCcpes[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
	short a_ceps[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;
	short dummy1;
	//int XX_GSCcpes[DVTX_M_FFT_LEN_WB] ALIGN64SFX;
	short gain_postNS[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;
	short dummy2;
	//short Q_ps_cepsavg_prev;
	//short dummy1;
	//short a_ceps[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;		//Q0.15
	//short dummy2;
	
	short Flag_NoiseOnly;

} BFStatus;

typedef struct {
	int   L_SNRMTX[DVTX_M_NUM_CHAN_WB][4] ALIGN64SFX;

	int  L_Npsd[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_Npsd_MMSE_ini[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_Npsd_MMSE_TMP[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short P_H1_ravg[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_SNRpost_prv[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_SERpost_prv[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short Gmmse[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short Gres[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short spp[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	int  L_SNRprio_avg[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_SNR_by_Nmmse_ini_avg[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short beta_ceps[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;
	short SNR_ini_ceps_avg[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;
	short SNR_ini_ceps_Fixedavg[DVTX_M_Nfft_ceps_WB] ALIGN64SFX;

	short INDEX_SNRMTX;

	short hov_tx_noisefree_cnt;
	short noise_floor_offset;
	short gain_Npsd;

	int  *L_SNR_by_Nmmse_ini;
	int  *L_SNR_by_Nmmse_global;

	int  L_Esqr[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_Esqr_q30[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	int  *L_tmpvec;
	int  *L_tmpvec1;
	short *S_tmpvec;
	short *S_noise_floor;
	short *S_spp_ns;

	short S_Gns_final[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short *P_H1;
	short *P_H1_GbyL;
	int  *L_SNRpost;
	int  *L_SNRprio;
	int  *L_Dsqr_q30;
	int  *L_PSD_resiEcho;
	int  *L_SERpost;
	int  *L_SERprio;
	int  *L_EsqrNS;
	int  *L_EsqrNS_q30;
	int  *L_SNR_by_Nmmse_ini_cepsmooth;
	int  *L_SNR_by_Nmmse_ini_cepsmooth_fix;

	int     *L_RRBin_step;

	short *tmpvec_ceps;
	short *SNR_ini_ceps;
	short *tmp_beta_ceps;

} NSStatus;

typedef struct {
	// f0 harmonic contour
	int  *L_tmp256; // tmporay vector
	int  *L_EEoo_07;
	int  *L_Eoo;// tmporay vector
	int  *L_EEii;

	short *tmpf0contour; // tmporay vector
	short *f0contourAvg;
	short *G_NS;// tmporay vector

	short	F0flag;
	short	ANCflag;

} PRENSStatus;

typedef struct {
	int *ANC_sigPwr;
	int *ANC_sigPwr_inner;

	int *Enhenced_Signal;

	short *ANC_W_Filter;
	short Aeq[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

} ANCStatus;

typedef struct {
	int  L_Esqr_ravg_silence[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	int  L_Dsqr_ravg[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short   *GmmseNFFT;
	int		L_DDBin2[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;
	int     *L_RRBin;
	short    *S_tmpfft1;
	short    CntFrmRxVADon;

	// FNLMS
	int      *L_DDBin;
	int      *L_EEBin;
	short    *Gpwrres;
	short 	 *W_fnlms_reression;
	short 	 *W_fnlms_reression2;
	short 	 *G_fnlms;

	short   Cnt_Cascade_tx_silent_frames;

	short Gain_echo_PSD_RES;

} RESStatus;

typedef struct {
	short	State;
	short	State_prev;
	short	State_Wind;
	short	State_Car;
	short	State_Noise2Clean;
	short	UnFit_State;
	short	UnFit_NS_ON;

	short	ECNS_out_VAD;
	short	Noise_Diff;

	int		w_outer;
	int		w_inner;
	short	WND_normal_ON;
	short	WND_strong_cand;
	short	WND_strong_ON;
	short	mixing_cnt_up;
	short	mixing_cnt_down;
	short	mixing_cnt_up_car;
	short	mixing_cnt_down_car;
	short	mixing_cnt_up_verylowband;
	short	mixing_cnt_down_verylowband;

	short FreqMix_data_buffer[2 * 80/*DVTX_FreqMix_MaxBin*/] ALIGN64SFX;
	short FreqMix_BLK_NORM;
	int	eng_mean_high, eng_mean_low;
	short HPFouter;
	short LPFouter;

	int Inner_EEBin_UnFit[DVTX_M_FFT_HALFLEN_WB] ALIGN64SFX;

} MixingStatus;

typedef struct {

	short AGC_xd_level;		// fast rms value
	short AGC_G_old;		// past Gain

} AGCStatus;

typedef struct {

	short FIRCoefBuff[SF_FRAME_LENGTH_SWB + SF_FIRFILTERNUM - 1];

} FIRStatus;

#endif


//Basic
typedef struct {

	short PARA_txMode;// DO NOT CHANGE
	short PARA_call_mode_HS_HF_EAR;

	short TX_Inner_bandwidth;
	short TX_Outer_bandwidth;

	short PARA_AEC_ONOFF_Inner; // Outer_PARA_AEC_on_off
	short PARA_AEC_ONOFF_Outer; // Outer_PARA_AEC_on_off
	short PARA_FNLMS_ONOFF_Inner; // Outer_PARA_FNLMS_on_off
	short PARA_FNLMS_ONOFF_Outer; // Outer_PARA_FNLMS_on_off
	short PARA_RES_ONOFF_Inner; // Outer_PARA_RES_on_off
	short PARA_RES_ONOFF_Outer; // Outer_PARA_RES_on_off
	short PARA_NS_ONOFF_Inner; // Outer_PARA_NS_on_off
	short PARA_NS_ONOFF_Outer; // Outer_PARA_NS_on_off
	short PARA_Mixing_ONOFF_Outer; // Outer_PARA_Mixing_on_off

	short PARA_FLAG_FIRST_FRM_Inner;
	short PARA_FLAG_FIRST_FRM_Outer;

	short PARA_Q_for_InSigGain_Inner;
	short PARA_Gain_TxSig_Inner;
	short PARA_Gain_RxSig_Inner;
	short PARA_Gain_TxSig_NS_IN_Inner;
	short PARA_Gain_RxSig_NS_IN_Inner;
	short PARA_Gain_TxSig_NS_Out_Inner;
	short PARA_Q_for_InSigGain_Outer;
	short PARA_Gain_TxSig_Outer;
	short PARA_Gain_RxSig_Outer;
	short PARA_Gain_TxSig_NS_IN_Outer;
	short PARA_Gain_RxSig_NS_IN_Outer;
	short PARA_Gain_TxSig_NS_Out_Outer;
	short PARA_Gain_TxSig_Out;

	short PARA_reserved_11; // gain is Q4.11 format...

	short PARA_reserved_12; //reserved
	short PARA_reserved_13;
	short PARA_reserved_14;
	short PARA_reserved_15;
	short PARA_reserved_16;
	short PARA_reserved_17;
	short PARA_reserved_18;
	short PARA_reserved_19;
	short PARA_reserved_20;

} SamsungSolomonVoiceWTxFRAMEParam;

typedef struct {

	short DelayCompensation;

	short PARA_FLAG_RxVAD_First_AEC;
	short PARA_reserved_7; // PARA_EchoBulkDelay_Search_samplerange

	short PARA_Nadfdelay;
	short PARA_Pwr_LoTHD_ADF_IN;
	short PARA_THD_Pwr_Rx_AEC_IN_dB;
	short PARA_THD_Pwr_Tx_dB;
	short PARA_THD_Pwr_Tx_Loud_dB;
	short PARA_THD_RxTx_Pwr_Difference;
	int	  PARA_ADF_reference_step;
	short PARA_ADF_reference_step_lowbit; // int to two-short
	short PARA_ADF_reference_step_highbit;
	int	  PARA_ADF_Wvar_THD;
	short PARA_ADF_Wvar_THD_lowbit;
	short PARA_ADF_Wvar_THD_highbit;

	short PARA_reserved_1;
	short PARA_reserved_21;	// PARA_THD_XECC_high : xcorr upper threshold
	short PARA_reserved_22;	// PARA_THD_XECC_low  : xcorr lower threshold
	short PARA_reserved_23;	// PARA_EchoPSD_Gain_highXECC : resi Echo psd gain in high xcorr
	short PARA_reserved_24;	// PARA_EchoPSD_Gain_lowXECC  : resi Echo psd gain in low  xcorr
	short PARA_reserved_25;	// ringback sig pwrdiff thd lowbit
	short PARA_reserved_26;	// ringback sig pwrdiff thd lowbit
	short PARA_reserved_27;	// PwrDiff_TxRx_to detect strong ST
	short PARA_reserved_28;// PARA_RxClipping_Bound
	short PARA_reserved_29;	// PARA_THD_Pwr_Tx_AECin_low
	short PARA_reserved_30;	// PwrDiff TxRx to detect strong tx-NET only
	short PARA_reserved_33;	// PARA_THD_AECinoutDIFFerence to update Waux

	short PARA_reserved_34;	// reserved
	short PARA_reserved_35;
	short PARA_reserved_36;
	short PARA_reserved_37;
	short PARA_reserved_38;
	short PARA_reserved_39;
	short PARA_reserved_40;

} SamsungSolomonVoiceWTxAECParam;

typedef struct {
	short tmp;
#ifndef DIVIDE_TEST2
	int OvrSubFactor[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;
#else
	short OvrSubFactor[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;
#endif
	short a_cnst[DVTX_M_FFT_HALFLEN_WB + 1] ALIGN64SFX;

	short fl;
	short fh;

	short q1st;
	short qend;
	short beta;

} SamsungSolomonVoiceWTxBFParam;

typedef struct {

	short PARA_Gain_EchoPSD_RES;
	short PARA_NoiseFloor_RES;
	short PARA_Gain_Echo_PSD[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short PARA_reserved_2; // flag FNLMS on off
	short PARA_reserved_3; // flag RES on off
	short PARA_reserved_31;// PARA_RESgainlIMIT_IniRxSigOnSet
	short PARA_reserved_32;// PARA_RES_prioSNRga in ST interval : not used

	short PARA_reserved_41;	// Fadf oversubtraction bit sifht 0~1kHz
	short PARA_reserved_42;	// Fadf oversubtraction bit sifht 1~4kHz
	short PARA_reserved_43;	// Fadf oversubtraction bit sifht 4~8kHz
	short PARA_reserved_44;	// over Rx psd estimation for single NET flag
	short PARA_reserved_45;	// single NET flag, Wiener gain THD 0~1.0
	short PARA_reserved_46;	// Wfnlms ini value
	short PARA_reserved_47; // reserved
	short PARA_reserved_48;
	short PARA_reserved_49;
	short PARA_reserved_50;
	short PARA_reserved_51;
	short PARA_reserved_52;
	short PARA_reserved_53;
	short PARA_reserved_54;
	short PARA_reserved_55;
	short PARA_reserved_56;
	short PARA_reserved_57;
	short PARA_reserved_58;
	short PARA_reserved_59;
	short PARA_reserved_60;

} SamsungSolomonVoiceWTxRESParam;

typedef struct {

	short PARA_ns_level;

	short PARA_HangOver_Cnt_NoiseFree;
	short PARA_Gain_EchoPSD_NS;	// Echo psd gain for Noisd psd calculation 0 to 32767 q15
	short PARA_xi_for_SPP_Table;	// 0 to 15 [dB] scale
	short PARA_Npsd_Gain_MIN;	//	Npsd	gain	in	silence	interval
	short PARA_NoiseFloor_Offset_MAX;	//	Gain	floor	offset	in	silence	interval
	short PARA_MIN_CHAN_PWR;
	short PARA_MIN_NOISE_PWR;
	short PARA_NoiseFloorOffset_0_250Hz_low;		// 0.2 Q15
	short PARA_NoiseFloorOffset_0_250Hz_high;		// 0.25 Q15
	short PARA_NoiseFloorOffset_250_4000Hz_low;	// 0.12 Q15
	short PARA_NoiseFloorOffset_250_4000Hz_high;	// 0.3 Q15
	short PARA_NoiseFloorOffset_4000_8000Hz_low;	// 0.04 Q15
	short PARA_NoiseFloorOffset_4000_8000Hz_high;	// 0.3 Q15
	int PARA_THD_Pwr_Lo_1k_4k;
	short PARA_THD_Pwr_Lo_1k_4k_lowbit;
	short PARA_THD_Pwr_Lo_1k_4k_highbit;
	short PARA_Slop_SNRiniAvg_for_beta;
	int PARA_THD_Lo_SNRiniAvg_for_beta;
	short PARA_THD_Lo_SNRiniAvg_for_beta_lowbit;
	short PARA_THD_Lo_SNRiniAvg_for_beta_highbit;
	int PARA_THD_Hi_SNRiniAvg_for_beta;
	short PARA_THD_Hi_SNRiniAvg_for_beta_lowbit;
	short PARA_THD_Hi_SNRiniAvg_for_beta_highbit;
	short PARA_slope_prioriSNR_for_NoiseFloor;
	int PARA_THD_Lo_prioriSNR_for_NoiseFloor;
	short PARA_THD_Lo_prioriSNR_for_NoiseFloor_lowbit;
	short PARA_THD_Lo_prioriSNR_for_NoiseFloor_highbit;
	int PARA_THD_Hi_prioriSNR_for_NoiseFloor;
	short PARA_THD_Hi_prioriSNR_for_NoiseFloor_lowbit;
	short PARA_THD_Hi_prioriSNR_for_NoiseFloor_highbit;
	short PARA_FixedXi[DVTX_M_NUM_CHAN_WB][3] ALIGN64SFX;
	short PARA_FixedXi_iniSNR[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short PARA_FixedXi_srtSNR[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;
	short PARA_FixedXi_lotSNR[DVTX_M_NUM_CHAN_WB] ALIGN64SFX;

	short PARA_reserved_4; // flag NS on off
	short PARA_reserved_61;  // PARA_post_fDRC_OnOff_FLAG : 0(off), 1(on)
	short PARA_reserved_62;// PARA_THD_TxPwr_LOWER
	short PARA_reserved_63;  // PARA_THD_TxPwr_UPPER
	short PARA_reserved_64; // PARA_fDRC_SNT_Gain : Rx off fDRC gain
	short PARA_reserved_65;

	short PARA_reserved_66;
	short PARA_reserved_67;
	short PARA_reserved_68;
	short PARA_reserved_69;
	short PARA_reserved_70;
	short PARA_reserved_71;
	short PARA_reserved_72;
	short PARA_reserved_73;
	short PARA_reserved_74;
	short PARA_reserved_75;
	short PARA_reserved_76;
	short PARA_reserved_77;
	short PARA_reserved_78;
	short PARA_reserved_79;
	short PARA_reserved_80;

} SamsungSolomonVoiceWTxNSParam;

typedef struct {

	short PreNS_onoff;
	short PARA_wl;
	short PARA_fh;

} SamsungSolomonVoiceWTxPRENSParam;

typedef struct {
	short ANC_onoff;
	short fl;
	short fh;

	short mu_in;
	short mu_out;

} SamsungSolomonVoiceWTxANCParam;


typedef struct {
	short	Mix_Freq_onoff;
	short	Mix_Time_onoff;
	short 	PARA_reserved_9; //in/out Mixing flag
	short 	PARA_reserved_5; //PARA_Modechange_Hangover
	short 	PARA_reserved_6; // PARA_TxRxHPFcoef_index for BT path

} SamsungSolomonVoiceWTxMixParam;


typedef struct {

	short denom;
	short size;

	short agc_comThd;
	short agc_comSlope;
	short agc_expThd;
	short agc_expSlope;

	short latt;			// level attack
	short lrlt;			// level release
	short gat;			// gain attack time
	short grt;			// gain release time	
	short compthd;
	short expthd;
	short compslop;
	short expslop;
	short maxboost1;
	short maxboost2;

} SamsungSolomonVoiceWTxAGCParam;


typedef struct {

	short FIRCoef_out_WB[SF_FIRFILTERNUM + 1] ALIGN64SFX;
	short FIRCoefCur_out_WB[SF_FIRFILTERNUM + 1] ALIGN64SFX;
	short FIRCoefDEST_out_WB[FIRFILTERTEMP] ALIGN64SFX;

	short FIRCoef_out_NB[SF_FIRFILTERNUM + 1] ALIGN64SFX;
	short FIRCoefCur_out_NB[SF_FIRFILTERNUM + 1] ALIGN64SFX;
	short FIRCoefDEST_out_NB[FIRFILTERTEMP] ALIGN64SFX;

} SamsungSolomonVoiceWTxFIRParam;

// tunning parameters
typedef struct {

	short PARA_txMode;// DO NOT CHANGE

	SamsungSolomonVoiceWTxFRAMEParam	FRAME_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param_1 ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param_2 ALIGN64SFX;
	SamsungSolomonVoiceWTxBFParam		BF_param ALIGN64SFX;
	SamsungSolomonVoiceWTxRESParam		RES_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxRESParam		RES_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxNSParam		NS_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxNSParam		NS_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxANCParam		ANC_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxANCParam		ANC_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxMixParam		Mix_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAGCParam		AGC_param_2input ALIGN64SFX;
	SamsungSolomonVoiceWTxAGCParam		AGC_param_output ALIGN64SFX;
	SamsungSolomonVoiceWTxFIRParam		FIR_param ALIGN64SFX;
	
}SamsungSolomonVoiceParam;


typedef struct {
	short *Speech_Tx_Inner;
	short *Speech_Tx_Outer_1;
	short *Speech_Tx_Outer_2;
	short *Speech_Rx_Inner;
	short *Speech_Rx_Outer;

	short *OutSignal_Inner;
	short *OutSignal_Outer;

#if(FLAG_SELECT_C_DSP == 1)
	short *dbgOutput_buf_Inner_NB;
	short *dbgOutput_buf_Inner_WB;
	short *dbgOutput_buf_Outer;
#endif

	short TX_bandwidth_Inner;
	short TX_bandwidth_Outer;

	COMMONBUF   COMMON_buf ALIGN64SFX;

	FRAMEStatus FRAME_buf ALIGN64SFX;
	AECStatus	AEC_Inner_buf ALIGN64SFX;
	AECStatus	AEC_Outer_buf_1 ALIGN64SFX;
	AECStatus	AEC_Outer_buf_2 ALIGN64SFX;
	BFStatus	BF_buf ALIGN64SFX;
	RESStatus	RES_Inner_buf ALIGN64SFX;
	RESStatus	RES_Outer_buf ALIGN64SFX;
	NSStatus	NS_Inner_buf ALIGN64SFX;
	NSStatus	NS_Outer_buf ALIGN64SFX;
	PRENSStatus PRENS_Inner_buf ALIGN64SFX;
	PRENSStatus PRENS_Outer_buf ALIGN64SFX;
	ANCStatus	ANC_Inner_buf ALIGN64SFX;
	ANCStatus	ANC_Outer_buf ALIGN64SFX;
	MixingStatus Mix_buf ALIGN64SFX;
	AGCStatus	AGC_buf_2input ALIGN64SFX;
	AGCStatus	AGC_buf_output ALIGN64SFX;

	SamsungSolomonVoiceWTxFRAMEParam	FRAME_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param_1 ALIGN64SFX;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param_2 ALIGN64SFX;
	SamsungSolomonVoiceWTxBFParam		BF_param ALIGN64SFX;
	SamsungSolomonVoiceWTxRESParam		RES_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxRESParam		RES_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxNSParam		NS_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxNSParam		NS_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxANCParam		ANC_Inner_param ALIGN64SFX;
	SamsungSolomonVoiceWTxANCParam		ANC_Outer_param ALIGN64SFX;
	SamsungSolomonVoiceWTxMixParam		Mix_param ALIGN64SFX;
	SamsungSolomonVoiceWTxAGCParam		AGC_param_2input ALIGN64SFX;
	SamsungSolomonVoiceWTxAGCParam		AGC_param_output ALIGN64SFX;
	SamsungSolomonVoiceWTxFIRParam		FIR_param ALIGN64SFX;

	FIRStatus	FIR_buf_out_WB ALIGN64SFX;
	FIRStatus	FIR_buf_out_NB ALIGN64SFX;

} DVTX_ECNS_Cfg_t;


typedef struct {
	short *Speech_Tx_Inner;
	short *Speech_Tx_Outer_1;
	short *Speech_Tx_Outer_2;
	short *Speech_Rx_Inner;
	short *Speech_Rx_Outer;

	short *OutSignal;

	short Mode;
	short BandWidth_Inner;
	short BandWidth_Outer;

	DVTX_ECNS_Cfg_t* DVTX_ECNS_vars ALIGN64SFX;
	DVTX_ECNS_Cfg_t DVTX_ECNS_vars_STRUCT ALIGN64SFX;

} SamsungSolomonVoiceEngine_Handle_t;



/******************************************************************************
*  FUNCTION PROTOTYPES
*****************************************************************************/
extern void SamsungSolomonVoiceWEngineInit(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx);

extern void SamsungSolomonVoiceWParamSetting(SamsungSolomonVoiceParam* DiamondVoice_DV_TX_Config, short bandwidth);

#if(FLAG_SELECT_C_DSP == 1)
extern void SamsungSolomonVoiceWEngineExe(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam *SamsungDiamondParam_varsTx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_rx_Inner, short *Speech_rx_Outer, short *OutSignal,
	short *Output_buf_Inner_NB, short *Output_buf_Inner_WB, short *Output_buf_Outer);
#else
extern void SamsungSolomonVoiceWEngineExe(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam *SamsungDiamondParam_varsTx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_rx_Inner, short *Speech_rx_Outer, short *OutSignal);
#endif

extern void SamsungSolomonVoiceWEngineConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,	SamsungSolomonVoiceParam* SamsungDiamondParam_varsTx);

#endif

