
#ifndef	SolmonVoice_H
#define SolmonVoice_H
#include "Define_config.h"
/****************************************************************************************
*  HEADER FILE
****************************************************************************************/

/*   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

// 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
} CHANNEL;

typedef struct { //COMMONBUF
	// Inner output
	short Output_buf_Inner[SAMSUNGDIAMONDVOICEWIDEBAND_TX];

	// common buffer
	int Buff_L_NB[DVTX_M_FRM_LEN_NB]; //sBuff1
	int Buff_L_WB[DVTX_M_FFT_LEN_WB]; //sBuff

	// PreNS
	short	Gmin;
	int  gL_EEii[DVTX_M_FFT_HALFLEN_NB];
	short gf0contourAvg[DVTX_M_FFT_HALFLEN_WB];
	int  *gL_EEoo_07;
	short gtmpf0contour[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_WB]; // tmporay vector

	// RES
	int     gL_DDBin[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	int     gL_EEBin[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	short   gGpwrres[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	short 	gW_fnlms_reression[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	short 	gW_fnlms_reression2[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	short 	gG_fnlms[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];

	// NS
	short *gS_tmpfft1;
	int   ECNSbuff_L_SNR_by_Nmmse_ini[DVTX_M_NUM_CHAN_WB];
	int   ECNSbuff_L_SNR_by_Nmmse_global[DVTX_M_NUM_CHAN_WB];
	
	int   ECNSbuff_L_tmpvec[DVTX_M_NUM_CHAN_WB];
	int   ECNSbuff_L_tmpvec1[DVTX_M_NUM_CHAN_WB];
	short  ECNSbuff_S_tmpvec[DVTX_M_NUM_CHAN_WB];
	short  ECNSbuff_S_noise_floor[DVTX_M_NUM_CHAN_WB];
	short  ECNSbuff_S_spp_ns[DVTX_M_NUM_CHAN_WB];
	
	short  ECNSbuff_P_H1[DVTX_M_NUM_CHAN_WB];
	short  ECNSbuff_P_H1_GbyL[DVTX_M_NUM_CHAN_WB];
	int   ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth[DVTX_M_NUM_CHAN_WB];
	int   ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth_fix[DVTX_M_NUM_CHAN_WB];
	
	short  ECNSbuff_tmpvec_ceps[DVTX_M_Nfft_ceps_WB];
	short  ECNSbuff_SNR_ini_ceps[DVTX_M_Nfft_ceps_WB];
	short  ECNSbuff_tmp_beta_ceps[DVTX_M_Nfft_ceps_WB];

	int     gL_RRBin_step[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	
	// AEC
	short gRxFrm_Delay_AEC[2000 + 1000];
	short gRxFrm_AECin_AEC[DVTX_M_FRM_LEN_WB + DVTX_Nadf_MAX - 1 + DVTX_M_FRM_LEN_NB + DVTX_Nadf_MAX - 1];
	short gE_tx_AEC[DVTX_M_FRM_LEN_WB + DVTX_M_FRM_LEN_NB];
	short gE_tx_AECaux[DVTX_M_FRM_LEN_WB + DVTX_M_FRM_LEN_NB];
	short gRxFFTfrm_AEC[DVTX_M_FRM_LEN_WB + DVTX_M_FRM_LEN_NB];
	short gRxFFTfrm_clp_AEC[DVTX_M_FRM_LEN_WB + DVTX_M_FRM_LEN_NB];

	// FrmVAD
	int gavg_ANC_sigPwr[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];

	// ANC
	int gANC_sigPwr[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
	int  	gANC_sigPwr_inner[DVTX_M_FFT_HALFLEN_WB];//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];
	short 	gANC_W_Filter[DVTX_M_FFT_LEN_WB + DVTX_M_FFT_LEN_NB];

	// BWE
	short ginner_x_win[DVTX_M_FFT_LEN_WB];
	short ginner_x_win_256[DVTX_M_FFT_LEN_WB / 2];
	short ginner_a_nbf[LPCORDER_NB + 1];
	short gouter_a_wbf[LPCORDER + 1];
	short ginner_e_wb[DVTX_M_FFT_LEN_WB];
	long greSampleBuf3[8];
	long greSampleBuf4[8];
	
	// Mixing
	int  ECNSbuff_L_EEBin_forMixing[DVTX_M_FFT_HALFLEN_WB];

}COMMONBUF;

typedef struct {
	short PRE_EMP;
	short BLK_NORM;
	short NORM_PRV;
	short data_buffer[DVTX_M_FFT_LEN_NB];
	short WINDOW_OVERLAP[DVTX_M_DELAY_NB];
}FFTBUF_NB;

typedef struct {
	short PRE_EMP;
	short BLK_NORM;
	short NORM_PRV;
	short data_buffer[DVTX_M_FFT_LEN_WB];
	short WINDOW_OVERLAP[DVTX_M_DELAY_WB];
}FFTBUF_WB;

typedef struct {
	short DE_EMP;
	short OVERLAP[DVTX_M_FFT_LEN_WB - DVTX_M_FRM_LEN_WB];
}IFFTBUF_NB;

typedef struct {
	short DE_EMP;
	short OVERLAP[DVTX_M_FFT_LEN_WB - DVTX_M_FRM_LEN_WB];
}IFFTBUF_WB;

typedef struct {//Inner, Outer °ψΕλ
	
	short Flag_Tx_Clipping_Inner;
	short Flag_Tx_Clipping_Outer;
	
	// back up inner 16kHz input signal
	short Speech_Tx_Inner_WB[SAMSUNGDIAMONDVOICEWIDEBAND_TX];
	short dbg_buffer_Outer[DVTX_M_FFT_LEN_WB];
	short data_buffer_forMixing[DVTX_M_FFT_LEN_WB];
	
	// OLA
	FFTBUF_NB fftbuf_Inner;		//data_buffer_NB
	FFTBUF_NB fftbuf_RX_Inner;	//data_buffer_rx_NB
	FFTBUF_NB fftbuf_RX2_Inner; //data_buffer_rx2_NB
	FFTBUF_WB fftbuf_Inner_WB;	//data_buffer_inner_WB
	FFTBUF_WB fftbuf_Outer;		//data_buffer_WB
	FFTBUF_WB fftbuf_RX_Outer;	//data_buffer_rx_WB
	FFTBUF_WB fftbuf_RX2_Outer; //data_buffer_rx2_WB
	
	// IOLA
	IFFTBUF_WB Ifftbuf_Output;
	IFFTBUF_WB Ifftbuf_Inner_WB;
	IFFTBUF_WB Ifftbuf_Outer_WB;
	IFFTBUF_WB Ifftbuf_BWE;
	
	int  *L_EEBin_forMixing;

	/********* outer IIR Filtering ********/
	int HPFstateOuterTx[5];
	int HPFstateOuterRx[5];

	/********* inner downsampling : 16kHz to 8kHz ********/
	long Buf_Downsample_InnerRx[8];
	long Buf_Downsample_InnerTx[8];
	
	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*/];
	short MinVal_FrmPiLowBand;

} FRAMEStatus; 

typedef struct {//Inner, Outer Ί°΅΅
	short *adf_var;

	short ADF_IN[DVTX_Nadf_MAX];

	short W[DVTX_Nadf_WB];
	short Waux[DVTX_Nadf_WB];

	short Buff_RxOnset_aecout[DVTX_RxSigon_BuffLen_MAX]; // max 4 frmae 320*4=1280, NB/WB common
	short Buff_RxOnset_txin[DVTX_RxSigon_BuffLen_MAX];

	short ADF_IN_short[DVTX_Nadfshort_WB];

	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 {
	int   L_SNRMTX[DVTX_M_NUM_CHAN_WB][4];

	int  L_Npsd[DVTX_M_NUM_CHAN_WB];
	int  L_Npsd_MMSE_ini[DVTX_M_NUM_CHAN_WB];
	int  L_Npsd_MMSE_TMP[DVTX_M_NUM_CHAN_WB];

	short P_H1_ravg[DVTX_M_NUM_CHAN_WB];
	int  L_SNRpost_prv[DVTX_M_NUM_CHAN_WB];
	int  L_SERpost_prv[DVTX_M_NUM_CHAN_WB];
	short Gmmse[DVTX_M_NUM_CHAN_WB];
	short Gres[DVTX_M_NUM_CHAN_WB];
	short spp[DVTX_M_NUM_CHAN_WB];

	int  L_SNRprio_avg[DVTX_M_NUM_CHAN_WB];
	int  L_SNR_by_Nmmse_ini_avg[DVTX_M_NUM_CHAN_WB];

	short beta_ceps[DVTX_M_Nfft_ceps_WB];
	short SNR_ini_ceps_avg[DVTX_M_Nfft_ceps_WB];
	short SNR_ini_ceps_Fixedavg[DVTX_M_Nfft_ceps_WB];

	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];
	int  L_Esqr_q30[DVTX_M_NUM_CHAN_WB];

	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];

	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];

} ANCStatus;

typedef struct {
	int  L_Esqr_ravg_silence[DVTX_M_NUM_CHAN_WB];
	int  L_Dsqr_ravg[DVTX_M_NUM_CHAN_WB];

	short   *GmmseNFFT;
	int     *L_DDBin2;
	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 {
	int outer_gain_x_win;

	short *inner_x_win;
	short *inner_x_win_256;

	short *inner_a_nbf;
	short *outer_a_wbf;

	short *inner_e_wb;

	int inner_g;
	int outer_g;

	long *reSampleBuf3;
	long *reSampleBuf4;

	short BWE_pwr_in_dB;

	short data_buffer_lpc[DVTX_M_FFT_LEN_WB];

	short F0;

} BWEStatus;

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_bwe;
	int		w_outer;
	int		w_inner;
	short	WND_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*/];
	short FreqMix_BLK_NORM;
	int	eng_mean_high, eng_mean_low;
	short HPFouter;
	short LPFouter;

	int Inner_EEBin_UnFit[DVTX_M_FFT_HALFLEN_WB];

} MixingStatus;

#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_BWE_ONOFF_Inner; // Outer_PARA_BWE_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_BWE_IN;
	short PARA_Gain_TxSig_BWE_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 PARA_Gain_EchoPSD_RES;
	short PARA_NoiseFloor_RES;
	short PARA_Gain_Echo_PSD[DVTX_M_NUM_CHAN_WB];

	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];
	short PARA_FixedXi_iniSNR[DVTX_M_NUM_CHAN_WB];
	short PARA_FixedXi_srtSNR[DVTX_M_NUM_CHAN_WB];
	short PARA_FixedXi_lotSNR[DVTX_M_NUM_CHAN_WB];

	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 PARA_wl;
	short PARA_fh;

} SamsungSolomonVoiceWTxPRENSParam;

typedef struct {

	short fl;
	short fh;

	short mu_in;
	short mu_out;

} SamsungSolomonVoiceWTxANCParam;

typedef struct {
	 
	short 	PARA_reserved_8;// 
	short 	PARA_reserved_10;// THD BWE_pwr_in_dB

} SamsungSolomonVoiceWTxBWEParam;

typedef struct {

	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;

// tunning parameters
typedef struct {

	short PARA_txMode;// DO NOT CHANGE

	SamsungSolomonVoiceWTxFRAMEParam	FRAME_param;
	SamsungSolomonVoiceWTxAECParam		AEC_Inner_param;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param;
	SamsungSolomonVoiceWTxRESParam		RES_Inner_param;
	SamsungSolomonVoiceWTxRESParam		RES_Outer_param;
	SamsungSolomonVoiceWTxNSParam		NS_Inner_param;
	SamsungSolomonVoiceWTxNSParam		NS_Outer_param;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Inner_param;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Outer_param;
	SamsungSolomonVoiceWTxANCParam		ANC_Inner_param;
	SamsungSolomonVoiceWTxANCParam		ANC_Outer_param;
	SamsungSolomonVoiceWTxBWEParam		BWE_param;
	SamsungSolomonVoiceWTxMixParam		Mix_param;
	
}SamsungSolomonVoiceParam;


typedef struct {
	short *Speech_Tx_Inner;
	short *Speech_Tx_Outer;
	short *Speech_Rx_Inner;
	short *Speech_Rx_Outer;

	short *OutSignal_Inner;
	short *OutSignal_Outer;

	short *dbgOutput_buf_Inner_NB;
	short *dbgOutput_buf_Inner_WB;
	short *dbgOutput_buf_BWE;
	short *dbgOutput_buf_Outer;

	short TX_bandwidth_Inner;
	short TX_bandwidth_Outer;

	COMMONBUF   COMMON_buf;

	FRAMEStatus FRAME_buf;
	AECStatus	AEC_Inner_buf;
	AECStatus	AEC_Outer_buf;
	RESStatus	RES_Inner_buf;
	RESStatus	RES_Outer_buf;
	NSStatus	NS_Inner_buf;
	NSStatus	NS_Outer_buf;
	PRENSStatus PRENS_Inner_buf;
	PRENSStatus PRENS_Outer_buf;
	ANCStatus	ANC_Inner_buf;
	ANCStatus	ANC_Outer_buf;
	BWEStatus	BWE_buf;
	MixingStatus Mix_buf;

	SamsungSolomonVoiceWTxFRAMEParam	FRAME_param;
	SamsungSolomonVoiceWTxAECParam		AEC_Inner_param;
	SamsungSolomonVoiceWTxAECParam		AEC_Outer_param;
	SamsungSolomonVoiceWTxRESParam		RES_Inner_param;
	SamsungSolomonVoiceWTxRESParam		RES_Outer_param;
	SamsungSolomonVoiceWTxNSParam		NS_Inner_param;
	SamsungSolomonVoiceWTxNSParam		NS_Outer_param;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Inner_param;
	SamsungSolomonVoiceWTxPRENSParam	PreNS_Outer_param;
	SamsungSolomonVoiceWTxANCParam		ANC_Inner_param;
	SamsungSolomonVoiceWTxANCParam		ANC_Outer_param;
	SamsungSolomonVoiceWTxBWEParam		BWE_param;
	SamsungSolomonVoiceWTxMixParam		Mix_param;

} DVTX_ECNS_Cfg_t;


typedef struct {
	short *Speech_Tx_Inner;
	short *Speech_Tx_Outer;
	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;
	DVTX_ECNS_Cfg_t DVTX_ECNS_vars_STRUCT;
	
} SamsungSolomonVoiceEngine_Handle_t;



/******************************************************************************
*  FUNCTION PROTOTYPES
*****************************************************************************/
extern void SamsungSolomonVoiceWEngineInit(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx);

extern void SamsungSolomonVoiceWParamSetting(SamsungSolomonVoiceParam* DiamondVoice_DV_TX_Config);

extern void SamsungSolomonVoiceWEngineExe(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam *SamsungDiamondParam_varsTx, 
	short *Speech_Tx_Inner, short *Speech_Tx_Outer, short *Speech_rx_Inner, short *Speech_rx_Outer, short *OutSignal,
	short *Output_buf_Inner_NB, short *Output_buf_Inner_WB, short *Output_buf_BWE, short *Output_buf_Outer);

extern void SamsungSolomonVoiceWEngineConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,	SamsungSolomonVoiceParam* SamsungDiamondParam_varsTx);

#endif

