#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "Define_config.h"
#include "SamsungSolomonVoiceW.h"
#include "SamsungSolomonVoiceW_Int.h"

#include "SamsungSolomonVoiceW_Table.h"

short Gmin = 32767;

int sBuff[DVTX_M_FFT_LEN_WB];
int sBuff1[DVTX_M_FRM_LEN_WB >> 1];

int  gL_EEii[DVTX_M_FFT_HALFLEN_NB];

short gf0contourAvg[DVTX_M_FFT_HALFLEN_WB];

int  *gL_EEoo_07 = (int *)&sBuff[DVTX_M_FFT_LEN_WB - (DVTX_M_FFT_HALFLEN_WB)];//[DVTX_M_FFT_HALFLEN_WB];
short *gS_tmpfft1 = (short *)&sBuff[DVTX_M_FFT_LEN_WB - (DVTX_M_FFT_HALFLEN_WB >> 1)];//[DVTX_M_FFT_HALFLEN_WB];

// data for inner 16kHz FFT
short gspeech_inner_WB[DVTX_M_FRM_LEN_WB];  // back up inner 16kHz input signal
short gInner_WINDOW_OVERLAP[DVTX_M_DELAY_WB]; // previsou overlapped inner signal
short gdata_buffer_inner_WB[DVTX_M_FFT_LEN_WB];  // FFT

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];

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];

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];
int     gL_RRBin_step[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
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];
int     gavg_ANC_sigPwr[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_NB];
short   gtmpf0contour[DVTX_M_FFT_HALFLEN_WB + DVTX_M_FFT_HALFLEN_WB]; // tmporay vector

int		*fftbuf_32b = sBuff;//[DVTX_M_FFT_LEN_WB];	// FFT/IFFT buffer

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  ECNSbuff_L_EsqrNS_forMixing[DVTX_M_NUM_CHAN_WB];
int  ECNSbuff_L_EsqrNS_q30_forMixing[DVTX_M_NUM_CHAN_WB];
int  ECNSbuff_L_EEBin_forMixing[DVTX_M_FFT_HALFLEN_WB];

int DVTX_fft_halflen = DVTX_FFT_HALFLEN_WB;
int DVTX_fft_len = DVTX_FFT_LEN_WB;

short	F0flag = 0;
short	ANCflag_inner = 0;
short	ANCflag_outer = 0;

extern MixingStruct Mixing;
extern short data_buffer_NB[DVTX_FFT_LEN_NB];
extern short data_buffer_WB[DVTX_FFT_LEN_WB];

int HPFcoeff[5] = { 1058936990, -2117873982, 1058936990, 2117669841, -1044336298 };

int SolomonVoiceECNSINIT(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars, short  bandwidth, int outer_flag)
{
	short i, k;

	/* ECNS in/out pointer initialization */
	DVTX_ECNS_vars->Speech = NULL;
	DVTX_ECNS_vars->Speech_rx = NULL;
	DVTX_ECNS_vars->OutSignal = NULL;
	DVTX_ECNS_vars->Temp = NULL;
	DVTX_ECNS_vars->TX_bandwidth = bandwidth;

	DVTX_ECNS_vars->Flag_mode_change = 1;
	DVTX_ECNS_vars->Flag_mode_change_Count = 0;

	DVTX_ECNS_vars->preNS.L_tmp256 = (int *)sBuff;
	DVTX_ECNS_vars->preNS.L_EEoo_07 = (int *)gL_EEoo_07;
	DVTX_ECNS_vars->preNS.L_Eoo = sBuff;
	DVTX_ECNS_vars->preNS.L_EEii = gL_EEii;

	DVTX_ECNS_vars->preNS.f0contourAvg = gf0contourAvg;

	DVTX_ECNS_vars->preNS.G_NS = sBuff1;
	DVTX_ECNS_vars->preNS.speech_inner_WB = gspeech_inner_WB;
	DVTX_ECNS_vars->preNS.Inner_WINDOW_OVERLAP = gInner_WINDOW_OVERLAP;
	DVTX_ECNS_vars->preNS.data_buffer_inner_WB = gdata_buffer_inner_WB;
	DVTX_ECNS_vars->ECNSbuff.S_tmpfft1 = gS_tmpfft1;

	DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini = ECNSbuff_L_SNR_by_Nmmse_ini;
	DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_global = ECNSbuff_L_SNR_by_Nmmse_global;

	DVTX_ECNS_vars->ECNSbuff.L_tmpvec = ECNSbuff_L_tmpvec;
	DVTX_ECNS_vars->ECNSbuff.L_tmpvec1 = ECNSbuff_L_tmpvec1;

	DVTX_ECNS_vars->ECNSbuff.S_tmpvec = ECNSbuff_S_tmpvec;
	DVTX_ECNS_vars->ECNSbuff.S_noise_floor = ECNSbuff_S_noise_floor;
	DVTX_ECNS_vars->ECNSbuff.S_spp_ns = ECNSbuff_S_spp_ns;

	DVTX_ECNS_vars->ECNSbuff.P_H1 = ECNSbuff_P_H1;
	DVTX_ECNS_vars->ECNSbuff.P_H1_GbyL = ECNSbuff_P_H1_GbyL;

	DVTX_ECNS_vars->ECNSbuff.L_SNRpost = (int *)gE_tx_AEC;
	DVTX_ECNS_vars->ECNSbuff.L_SNRprio = (int *)(&gE_tx_AEC[80]);
	DVTX_ECNS_vars->ECNSbuff.L_Dsqr_q30 = (int *)(&gE_tx_AEC[160]);
	DVTX_ECNS_vars->ECNSbuff.L_PSD_resiEcho = (int *)(&gE_tx_AEC[240]);
	DVTX_ECNS_vars->ECNSbuff.L_SERpost = (int *)gE_tx_AECaux;
	DVTX_ECNS_vars->ECNSbuff.L_SERprio = (int *)(&gE_tx_AECaux[80]);
	DVTX_ECNS_vars->ECNSbuff.L_EsqrNS = (int *)(&gE_tx_AECaux[160]);
	DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30 = (int *)(&gE_tx_AECaux[240]);
	DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth = ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth;
	DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth_fix = ECNSbuff_L_SNR_by_Nmmse_ini_cepsmooth_fix;

	DVTX_ECNS_vars->ECNSbuff.tmpvec_ceps = ECNSbuff_tmpvec_ceps;
	DVTX_ECNS_vars->ECNSbuff.SNR_ini_ceps = ECNSbuff_SNR_ini_ceps;
	DVTX_ECNS_vars->ECNSbuff.tmp_beta_ceps = ECNSbuff_tmp_beta_ceps;

	DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_forMixing = ECNSbuff_L_EsqrNS_forMixing;
	DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30_forMixing = ECNSbuff_L_EsqrNS_q30_forMixing;
	DVTX_ECNS_vars->ECNSbuff.L_EEBin_forMixing = ECNSbuff_L_EEBin_forMixing;


	if (outer_flag)
	{
		DVTX_fft_halflen = DVTX_FFT_HALFLEN_WB;
		DVTX_fft_len = DVTX_FFT_LEN_WB;
		DVTX_ECNS_vars->preNS.avg_ANC_sigPwr = gavg_ANC_sigPwr;
		DVTX_ECNS_vars->preNS.tmpf0contour = gtmpf0contour;
		DVTX_ECNS_vars->AECADF.E_tx_AEC = gE_tx_AEC;
		DVTX_ECNS_vars->AECADF.E_tx_AECaux = gE_tx_AECaux;

		DVTX_ECNS_vars->AECADF.RxFFTfrm_AEC = gRxFFTfrm_AEC;
		DVTX_ECNS_vars->AECADF.RxFFTfrm_clp_AEC = gRxFFTfrm_clp_AEC;

		DVTX_ECNS_vars->AECADF.RxFrm_Delay_AEC = gRxFrm_Delay_AEC;
		DVTX_ECNS_vars->AECADF.RxFrm_AECin_AEC = gRxFrm_AECin_AEC;
		DVTX_ECNS_vars->ECNSbuff.L_DDBin = gL_DDBin;
		DVTX_ECNS_vars->ECNSbuff.L_EEBin = gL_EEBin;
		DVTX_ECNS_vars->ECNSbuff.Gpwrres = gGpwrres;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression = gW_fnlms_reression;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression2 = gW_fnlms_reression2;
		DVTX_ECNS_vars->ECNSbuff.G_fnlms = gG_fnlms;
		DVTX_ECNS_vars->ECNSbuff.L_RRBin_step = gL_RRBin_step;
		DVTX_ECNS_vars->preNS.ANC_sigPwr = gANC_sigPwr;
		DVTX_ECNS_vars->preNS.ANC_sigPwr_inner = gANC_sigPwr_inner;
		DVTX_ECNS_vars->preNS.Enhenced_Signal = gEnhenced_Signal;
		DVTX_ECNS_vars->preNS.ANC_W_Filter = gANC_W_Filter;
	}
	else
	{
		DVTX_fft_halflen = DVTX_FFT_HALFLEN_NB;
		DVTX_fft_len = DVTX_FFT_LEN_NB;
		DVTX_ECNS_vars->preNS.avg_ANC_sigPwr = gavg_ANC_sigPwr + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->preNS.tmpf0contour = gtmpf0contour + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->AECADF.E_tx_AEC = gE_tx_AEC + DVTX_M_FRM_LEN_WB;
		DVTX_ECNS_vars->AECADF.E_tx_AECaux = gE_tx_AECaux + DVTX_M_FRM_LEN_WB;

		DVTX_ECNS_vars->AECADF.RxFFTfrm_AEC = gRxFFTfrm_AEC + DVTX_M_FRM_LEN_WB;
		DVTX_ECNS_vars->AECADF.RxFFTfrm_clp_AEC = gRxFFTfrm_clp_AEC + DVTX_M_FRM_LEN_WB;

		DVTX_ECNS_vars->AECADF.RxFrm_Delay_AEC = gRxFrm_Delay_AEC + 2000;
		DVTX_ECNS_vars->AECADF.RxFrm_AECin_AEC = gRxFrm_AECin_AEC + DVTX_M_FRM_LEN_WB + DVTX_Nadf_MAX - 1;
		DVTX_ECNS_vars->ECNSbuff.L_DDBin = gL_DDBin + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.L_EEBin = gL_EEBin + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.Gpwrres = gGpwrres + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression = gW_fnlms_reression + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression2 = gW_fnlms_reression2 + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.G_fnlms = gG_fnlms + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->ECNSbuff.L_RRBin_step = gL_RRBin_step + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->preNS.ANC_sigPwr = gANC_sigPwr + DVTX_M_FFT_HALFLEN_WB;
		DVTX_ECNS_vars->preNS.ANC_sigPwr_inner = gANC_sigPwr_inner/*+DVTX_M_FFT_HALFLEN_WB*/;
		DVTX_ECNS_vars->preNS.Enhenced_Signal = gEnhenced_Signal + DVTX_M_FFT_LEN_WB;
		DVTX_ECNS_vars->preNS.ANC_W_Filter = gANC_W_Filter + DVTX_M_FFT_LEN_WB;
	}
	DVTX_ECNS_vars->PARA_ECNS_mode = 0;


	// AECNS initialization-----------------------------------------------------------//
	// AECNS : WB
	for (i = 0; i < (DVTX_fft_len - DVTX_fft_halflen); i++)
	{
		DVTX_ECNS_vars->AECNS.OVERLAP[i] = 0;
	}
	for (i = 0; i < DVTX_DELAY_WB; i++)
	{
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP[i] = 0;
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP_RX[i] = 0;
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP_RX2[i] = 0;
	}
	for (i = 0; i < DVTX_NUM_CHAN_WB; i++)
	{

		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][0] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][1] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][2] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][3] = 0;

		DVTX_ECNS_vars->AECNS.L_Esqr_ravg_silence[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Dsqr_ravg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd_MMSE_ini[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd_MMSE_TMP[i] = 0;
		DVTX_ECNS_vars->AECNS.P_H1_ravg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRpost_prv[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SERpost_prv[i] = 0;
		DVTX_ECNS_vars->AECNS.Gmmse[i] = DVTX_MAX_16;
		DVTX_ECNS_vars->AECNS.Gres[i] = DVTX_MAX_16;
		DVTX_ECNS_vars->AECNS.spp[i] = DVTX_MAX_16;
		DVTX_ECNS_vars->AECNS.L_SNRprio_avg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SNR_by_Nmmse_ini_avg[i] = 0;
	}
	for (i = 0; i < DVTX_Nfft_ceps; i++)
	{
		DVTX_ECNS_vars->AECNS.beta_ceps[i] = 0;
		DVTX_ECNS_vars->AECNS.SNR_ini_ceps_avg[i] = 0;
		DVTX_ECNS_vars->AECNS.SNR_ini_ceps_Fixedavg[i] = 0;
	}
	DVTX_ECNS_vars->AECNS.INDEX_SNRMTX = 0;
	DVTX_ECNS_vars->AECNS.PRE_EMP = 0;
	DVTX_ECNS_vars->AECNS.PRE_EMP_RX = 0;
	DVTX_ECNS_vars->AECNS.DE_EMP = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV_RX = 0;

	DVTX_ECNS_vars->AECNS.PRE_EMP_RX2 = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV_RX2 = 0;

	DVTX_ECNS_vars->AECNS.hov_tx_noisefree_cnt = 0;
	DVTX_ECNS_vars->AECNS.noise_floor_offset = 0;
	DVTX_ECNS_vars->AECNS.gain_Npsd = DVTX_MAX_16;

	// AEC WB
	//AECADF : WB	
	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->AECADF.E_tx_AEC[k] = 0;
		DVTX_ECNS_vars->AECADF.E_tx_AECaux[k] = 0;

		DVTX_ECNS_vars->AECADF.RxFFTfrm_AEC[k] = 0;
		DVTX_ECNS_vars->AECADF.RxFFTfrm_clp_AEC[k] = 0;
	}
	for (k = 0; k < 2000; k++)
	{
		DVTX_ECNS_vars->AECADF.RxFrm_Delay_AEC[k] = 0;
	}
	for (k = 0; k < DVTX_fft_halflen + DVTX_Nadf_MAX - 1; k++)
	{
		DVTX_ECNS_vars->AECADF.RxFrm_AECin_AEC[k] = 0;
	}
	DVTX_ECNS_vars->AECADF.Flag_Tx_Clipping = 0;
	DVTX_ECNS_vars->AECADF.Flag_RxVAD_AEC = 0;
	DVTX_ECNS_vars->AECADF.Flag_TxSilence_AEC = 1;
	DVTX_ECNS_vars->AECADF.Flag_Tx_LoudSig = 1;
	DVTX_ECNS_vars->AECADF.Flag_SingleTalk = 0;
	DVTX_ECNS_vars->AECADF.L_ADF_err_pwr = 0;
	DVTX_ECNS_vars->AECADF.Gain_echo_PSD_RES = DVTX_MAX_16;
	DVTX_ECNS_vars->AECADF.hangover_cnt_flag_RxVAD_First = 0;// DVTX_hangover_cnt_flag_RxVAD_First;

	DVTX_ECNS_vars->AECADF.Qex_q = 0;
	DVTX_ECNS_vars->AECADF.Qxx_q = 0;
	DVTX_ECNS_vars->AECADF.L_Qex = 1;
	DVTX_ECNS_vars->AECADF.L_Qxx = 1;
	DVTX_ECNS_vars->AECADF.XECC = 0;
	DVTX_ECNS_vars->AECADF.Threshold_XECC = 1000; //0.2*2^13

	DVTX_ECNS_vars->AECADF.L_Perr = 0;
	DVTX_ECNS_vars->AECADF.L_Perr_aux = 0;

	DVTX_ECNS_vars->AECADF.Flag_SingleNET = 0;

	// ECNSbuff initialization-----------------------------------------------------------//
	// actually, ECNSbuff parameter initialization is not needed, but, redundantly considered at below
	for (k = 0; k < DVTX_RxSigon_BuffLen_MAX; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.Buff_RxOnset_aecout[k] = 0; // max 4 frmae 320*4=1280, NB/WB common
		DVTX_ECNS_vars->ECNSbuff.Buff_RxOnset_txin[k] = 0;
	}

	for (k = 0; k < DVTX_Nadf_MAX; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.ADF_IN[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.W[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.Waux[k] = 0;
	}

	for (k = 0; k < DVTX_Nadfshort_WB; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.ADF_IN_short[k] = 0;
	}

	for (k = 0; k < DVTX_NUM_CHAN_WB; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_global[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Esqr[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Esqr_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_tmpvec[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_tmpvec1[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_tmpvec[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_noise_floor[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_spp_ns[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_Gns_final[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.P_H1[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.P_H1_GbyL[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNRpost[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNRprio[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Dsqr_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_PSD_resiEcho[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SERpost[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SERprio[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth_fix[k] = 0;
	}

	for (k = 0; k < DVTX_fft_halflen; k++)
	{

		DVTX_ECNS_vars->ECNSbuff.L_DDBin[k] = 0;      
		DVTX_ECNS_vars->ECNSbuff.L_EEBin[k] = 0;

		DVTX_ECNS_vars->ECNSbuff.L_EEBin_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_tmpfft1[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.Gpwrres[k] = DVTX_MAX_16;
		
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression[k] = 20000;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression2[k] = 20000;
		DVTX_ECNS_vars->ECNSbuff.G_fnlms[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->ECNSbuff.L_RRBin_step[k] = 0;
	}
	DVTX_ECNS_vars->ECNSbuff.CntFrmRxVADon = 0;

	DVTX_ECNS_vars->AECADF.Flag_IniRxSigOnset = 0;
	DVTX_ECNS_vars->ECNSbuff.DelayCompensation = 0;

	DVTX_ECNS_vars->ECNSbuff.Pwr_RX_AECIN_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECIN_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECOUT_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECauxOUT_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.PwrDiff_AECinout_dB = 0;
	DVTX_ECNS_vars->AECADF.Flag_Waux_update = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Flag_Tx_silent_mode = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Cnt_Cascade_tx_silent_frames = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Pwr_1kHz_to_4kHz = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Pwr_100Hz_to_1kHz = 0; //1 for large for single talk


	DVTX_ECNS_vars->ECNSbuff.PwrDiff_Tx_Rx_Frm = 0;

	DVTX_ECNS_vars->ECNSbuff.Count_DelayCompensation_function_exe = 0;
	DVTX_ECNS_vars->ECNSbuff.Hangover_Cnt_NET_Onset = DVTX_MAX_16;

	DVTX_ECNS_vars->ECNSbuff.L_Pwr_tonality_ringband = 0;
	DVTX_ECNS_vars->ECNSbuff.L_Pwr_tonality_otherband = 0;
	DVTX_ECNS_vars->AECADF.Flag_ringbakctone = 0;


	for (k = 0; k < DVTX_Nfft_ceps; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.tmpvec_ceps[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.SNR_ini_ceps[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.tmp_beta_ceps[k] = 0;
	}


	DVTX_ECNS_vars->ECNSbuff.Cnt_Samples_NLMSupdate = 0;

	for (k = 0; k < 5; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.HPFstateTx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.HPFstateRx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.LPFstateTx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.LPFstateRx[k] = 0;
	}

	// f0-based pre NS initialize
	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->preNS.L_tmp256[k] = 0;
		DVTX_ECNS_vars->preNS.L_EEoo_07[k] = 0;
		DVTX_ECNS_vars->preNS.tmpf0contour[k] = DVTX_MAX_16;
		DVTX_ECNS_vars->preNS.f0contourAvg[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->preNS.L_Eoo[k] = 0;
		DVTX_ECNS_vars->preNS.G_NS[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->preNS.Aeq[k] = 16384;		//1 in Q14

		DVTX_ECNS_vars->preNS.ANC_sigPwr[k] = 0;
		DVTX_ECNS_vars->preNS.avg_ANC_sigPwr[k] = 0;

		DVTX_ECNS_vars->preNS.ANC_sigPwr_inner[k] = 0;
	}
	for (k = 0; k < DVTX_FFT_HALFLEN_NB; k++)
	{
		DVTX_ECNS_vars->preNS.L_EEii[k] = 0;
	}
	for (k = 0; k < DVTX_fft_len; k++)
	{
		DVTX_ECNS_vars->preNS.ANC_W_Filter[k] = 0;
		DVTX_ECNS_vars->preNS.Enhenced_Signal[k] = 0;
		DVTX_ECNS_vars->preNS.data_buffer_inner_WB[k] = 0;
	}

	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->preNS.speech_inner_WB[k] = 0;
	}
	for (k = 0; k < DVTX_M_DELAY_WB; k++)
	{
		DVTX_ECNS_vars->preNS.Inner_WINDOW_OVERLAP[k] = 0;
	}

	DVTX_ECNS_vars->preNS.FrmVAD = 0;
	DVTX_ECNS_vars->preNS.FrmPiLowBand = 0;
	DVTX_ECNS_vars->preNS.FrmRioLowBand = 0;
	DVTX_ECNS_vars->preNS.VariableTHD_Ratio_LowBandPwr = 2000;// initial THD
	DVTX_ECNS_vars->preNS.VariableTHD_THD_Pwr_inner = 1000;
	DVTX_ECNS_vars->preNS.PwrDiffOuterInner = 0;
	DVTX_ECNS_vars->preNS.FrmDT = 0;

	DVTX_ECNS_vars->preNS.BLK_NORM_inner_WB = 0;
	DVTX_ECNS_vars->preNS.PRE_EMP_inner = 0;
	DVTX_ECNS_vars->preNS.NORM_PRV_inner = 0;

	// tunning parameter initialization-----------------------------------------------------------//
	// actually, tunning parameter initialization is not needed

	return 0;
}

int SolomonVoiceECNSParameterConfig(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars, SamsungSolomonVoiceParam* SamsungDiamondParam_varsTx, int outer_flag)
{
	short i, k;


	if (outer_flag)
	{
		DVTX_fft_halflen = DVTX_FFT_HALFLEN_WB;
		DVTX_fft_len = DVTX_FFT_LEN_WB;
	}
	else
	{
		DVTX_fft_halflen = DVTX_FFT_HALFLEN_NB;
		DVTX_fft_len = DVTX_FFT_LEN_NB;
	}
	DVTX_ECNS_vars->Flag_mode_change = 1;
	DVTX_ECNS_vars->Flag_mode_change_Count = 0;


	DVTX_ECNS_vars->PARA_ns_level = SamsungDiamondParam_varsTx->InPARA_ns_level;
	DVTX_ECNS_vars->PARA_FLAG_FIRST_FRM = SamsungDiamondParam_varsTx->InPARA_FLAG_FIRST_FRM; // should be ini by 1 
	DVTX_ECNS_vars->PARA_FLAG_RxVAD_First_AEC = SamsungDiamondParam_varsTx->InPARA_FLAG_RxVAD_First_AEC; //should be ini by 1 
	DVTX_ECNS_vars->PARA_call_mode_HS_HF_EAR = SamsungDiamondParam_varsTx->InPARA_call_mode_HS_HF_EAR;

	DVTX_ECNS_vars->PARA_Nadfdelay = SamsungDiamondParam_varsTx->InPARA_Nadfdelay;
	DVTX_ECNS_vars->PARA_ADF_reference_step = ((SamsungDiamondParam_varsTx->InPARA_ADF_reference_step_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_ADF_reference_step_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_ADF_Wvar_THD = ((SamsungDiamondParam_varsTx->InPARA_ADF_Wvar_THD_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_ADF_Wvar_THD_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_Gain_EchoPSD_RES = SamsungDiamondParam_varsTx->InPARA_Gain_EchoPSD_RES;
	DVTX_ECNS_vars->PARA_NoiseFloor_RES = SamsungDiamondParam_varsTx->InPARA_NoiseFloor_RES;
	DVTX_ECNS_vars->PARA_Pwr_LoTHD_ADF_IN = SamsungDiamondParam_varsTx->InPARA_Pwr_LoTHD_ADF_IN;
	DVTX_ECNS_vars->PARA_THD_Pwr_Rx_AEC_IN_dB = SamsungDiamondParam_varsTx->InPARA_THD_Pwr_Rx_AEC_IN_dB;
	DVTX_ECNS_vars->PARA_THD_Pwr_Tx_dB = SamsungDiamondParam_varsTx->InPARA_THD_Pwr_Tx_dB;
	DVTX_ECNS_vars->PARA_THD_Pwr_Tx_Loud_dB = SamsungDiamondParam_varsTx->InPARA_THD_Pwr_Tx_Loud_dB;
	DVTX_ECNS_vars->PARA_THD_RxTx_Pwr_Difference = SamsungDiamondParam_varsTx->InPARA_THD_RxTx_Pwr_Difference;
	DVTX_ECNS_vars->PARA_Q_for_InSigGain = SamsungDiamondParam_varsTx->InPARA_Q_for_InSigGain;
	DVTX_ECNS_vars->PARA_Gain_TxSig = SamsungDiamondParam_varsTx->InPARA_Gain_TxSig;
	DVTX_ECNS_vars->PARA_Gain_RxSig = SamsungDiamondParam_varsTx->InPARA_Gain_RxSig;
	DVTX_ECNS_vars->PARA_Gain_TxSig_NS_IN = SamsungDiamondParam_varsTx->InPARA_Gain_TxSig_NS_IN;
	DVTX_ECNS_vars->PARA_Gain_TxSig_BWE_IN = SamsungDiamondParam_varsTx->InPARA_Gain_TxSig_BWE_IN;
	DVTX_ECNS_vars->PARA_Gain_RxSig_NS_IN = SamsungDiamondParam_varsTx->InPARA_Gain_RxSig_NS_IN;
	DVTX_ECNS_vars->PARA_Gain_TxSig_NS_Out = SamsungDiamondParam_varsTx->InPARA_Gain_TxSig_NS_Out;
	DVTX_ECNS_vars->PARA_Gain_TxSig_BWE_Out = SamsungDiamondParam_varsTx->InPARA_Gain_TxSig_BWE_Out;
	DVTX_ECNS_vars->PARA_THD_Pwr_Lo_1k_4k = ((SamsungDiamondParam_varsTx->InPARA_THD_Pwr_Lo_1k_4k_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_THD_Pwr_Lo_1k_4k_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_HangOver_Cnt_NoiseFree = SamsungDiamondParam_varsTx->InPARA_HangOver_Cnt_NoiseFree;
	DVTX_ECNS_vars->PARA_Gain_EchoPSD_NS = SamsungDiamondParam_varsTx->InPARA_Gain_EchoPSD_NS;
	DVTX_ECNS_vars->PARA_THD_Lo_SNRiniAvg_for_beta = ((SamsungDiamondParam_varsTx->InPARA_THD_Lo_SNRiniAvg_for_beta_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_THD_Lo_SNRiniAvg_for_beta_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_THD_Hi_SNRiniAvg_for_beta = ((SamsungDiamondParam_varsTx->InPARA_THD_Hi_SNRiniAvg_for_beta_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_THD_Hi_SNRiniAvg_for_beta_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_Slop_SNRiniAvg_for_beta = SamsungDiamondParam_varsTx->InPARA_Slop_SNRiniAvg_for_beta;
	DVTX_ECNS_vars->PARA_MIN_CHAN_PWR = SamsungDiamondParam_varsTx->InPARA_MIN_CHAN_PWR;
	DVTX_ECNS_vars->PARA_MIN_NOISE_PWR = SamsungDiamondParam_varsTx->InPARA_MIN_NOISE_PWR;
	DVTX_ECNS_vars->PARA_xi_for_SPP_Table = SamsungDiamondParam_varsTx->InPARA_xi_for_SPP_Table;
	DVTX_ECNS_vars->PARA_Npsd_Gain_MIN = SamsungDiamondParam_varsTx->InPARA_Npsd_Gain_MIN;
	DVTX_ECNS_vars->PARA_NoiseFloor_Offset_MAX = SamsungDiamondParam_varsTx->InPARA_NoiseFloor_Offset_MAX;
	DVTX_ECNS_vars->PARA_THD_Lo_prioriSNR_for_NoiseFloor = ((SamsungDiamondParam_varsTx->InPARA_THD_Lo_prioriSNR_for_NoiseFloor_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_THD_Lo_prioriSNR_for_NoiseFloor_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_THD_Hi_prioriSNR_for_NoiseFloor = ((SamsungDiamondParam_varsTx->InPARA_THD_Hi_prioriSNR_for_NoiseFloor_highbit << 16) + (SamsungDiamondParam_varsTx->InPARA_THD_Hi_prioriSNR_for_NoiseFloor_lowbit & 0x0000ffff));
	DVTX_ECNS_vars->PARA_slope_prioriSNR_for_NoiseFloor = SamsungDiamondParam_varsTx->InPARA_slope_prioriSNR_for_NoiseFloor;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_0_250Hz_low = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_0_250Hz_low;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_0_250Hz_high = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_0_250Hz_high;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_250_4000Hz_low = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_250_4000Hz_low;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_250_4000Hz_high = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_250_4000Hz_high;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_4000_8000Hz_low = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_4000_8000Hz_low;
	DVTX_ECNS_vars->PARA_NoiseFloorOffset_4000_8000Hz_high = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_4000_8000Hz_high;
	DVTX_ECNS_vars->org_xi_for_SPP_Table = SamsungDiamondParam_varsTx->InPARA_xi_for_SPP_Table;
	DVTX_ECNS_vars->org_NoiseFloorOffset_250_4000Hz_low = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_250_4000Hz_low;
	DVTX_ECNS_vars->org_NoiseFloorOffset_250_4000Hz_high = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_250_4000Hz_high;
	DVTX_ECNS_vars->org_NoiseFloorOffset_4000_8000Hz_low = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_4000_8000Hz_low;
	DVTX_ECNS_vars->org_NoiseFloorOffset_4000_8000Hz_high = SamsungDiamondParam_varsTx->InPARA_NoiseFloorOffset_4000_8000Hz_high;

	for (i = 0; i < 40; i++)
	{
		DVTX_ECNS_vars->PARA_Gain_Echo_PSD[i] = SamsungDiamondParam_varsTx->InPARA_Gain_Echo_PSD[i];
	}
	for (i = 0; i < 40; i++)
	{
		DVTX_ECNS_vars->PARA_FixedXi[i][0] = SamsungDiamondParam_varsTx->InPARA_FixedXi_iniSNR[i];
		DVTX_ECNS_vars->PARA_FixedXi[i][1] = SamsungDiamondParam_varsTx->InPARA_FixedXi_srtSNR[i];
		DVTX_ECNS_vars->PARA_FixedXi[i][2] = SamsungDiamondParam_varsTx->InPARA_FixedXi_lotSNR[i];
		DVTX_ECNS_vars->org_FixedXi[i][0] = SamsungDiamondParam_varsTx->InPARA_FixedXi_iniSNR[i];
		DVTX_ECNS_vars->org_FixedXi[i][1] = SamsungDiamondParam_varsTx->InPARA_FixedXi_srtSNR[i];
		DVTX_ECNS_vars->org_FixedXi[i][2] = SamsungDiamondParam_varsTx->InPARA_FixedXi_lotSNR[i];
	}

	//reserved parameter
	DVTX_ECNS_vars->PARA_reserved_1 = SamsungDiamondParam_varsTx->InPARA_reserved_1;
	DVTX_ECNS_vars->PARA_reserved_2 = SamsungDiamondParam_varsTx->InPARA_reserved_2;
	DVTX_ECNS_vars->PARA_reserved_3 = SamsungDiamondParam_varsTx->InPARA_reserved_3;
	DVTX_ECNS_vars->PARA_reserved_4 = SamsungDiamondParam_varsTx->InPARA_reserved_4;
	DVTX_ECNS_vars->PARA_reserved_5 = SamsungDiamondParam_varsTx->InPARA_reserved_5;
	DVTX_ECNS_vars->PARA_reserved_6 = SamsungDiamondParam_varsTx->InPARA_reserved_6;
	DVTX_ECNS_vars->PARA_reserved_7 = SamsungDiamondParam_varsTx->InPARA_reserved_7;
	DVTX_ECNS_vars->PARA_reserved_8 = SamsungDiamondParam_varsTx->InPARA_reserved_8;
	DVTX_ECNS_vars->PARA_reserved_9 = SamsungDiamondParam_varsTx->InPARA_reserved_9;
	DVTX_ECNS_vars->PARA_reserved_10 = SamsungDiamondParam_varsTx->InPARA_reserved_10;
	DVTX_ECNS_vars->PARA_reserved_11 = SamsungDiamondParam_varsTx->InPARA_reserved_11;
	DVTX_ECNS_vars->PARA_reserved_12 = SamsungDiamondParam_varsTx->InPARA_reserved_12;
	DVTX_ECNS_vars->PARA_reserved_13 = SamsungDiamondParam_varsTx->InPARA_reserved_13;
	DVTX_ECNS_vars->PARA_reserved_14 = SamsungDiamondParam_varsTx->InPARA_reserved_14;
	DVTX_ECNS_vars->PARA_reserved_15 = SamsungDiamondParam_varsTx->InPARA_reserved_15;
	DVTX_ECNS_vars->PARA_reserved_16 = SamsungDiamondParam_varsTx->InPARA_reserved_16;
	DVTX_ECNS_vars->PARA_reserved_17 = SamsungDiamondParam_varsTx->InPARA_reserved_17;
	DVTX_ECNS_vars->PARA_reserved_18 = SamsungDiamondParam_varsTx->InPARA_reserved_18;
	DVTX_ECNS_vars->PARA_reserved_19 = SamsungDiamondParam_varsTx->InPARA_reserved_19;
	DVTX_ECNS_vars->PARA_reserved_20 = SamsungDiamondParam_varsTx->InPARA_reserved_20;
	DVTX_ECNS_vars->PARA_reserved_21 = SamsungDiamondParam_varsTx->InPARA_reserved_21;
	DVTX_ECNS_vars->PARA_reserved_22 = SamsungDiamondParam_varsTx->InPARA_reserved_22;
	DVTX_ECNS_vars->PARA_reserved_23 = SamsungDiamondParam_varsTx->InPARA_reserved_23;
	DVTX_ECNS_vars->PARA_reserved_24 = SamsungDiamondParam_varsTx->InPARA_reserved_24;
	DVTX_ECNS_vars->PARA_reserved_25 = SamsungDiamondParam_varsTx->InPARA_reserved_25;
	DVTX_ECNS_vars->PARA_reserved_26 = SamsungDiamondParam_varsTx->InPARA_reserved_26;
	DVTX_ECNS_vars->PARA_reserved_27 = SamsungDiamondParam_varsTx->InPARA_reserved_27;
	DVTX_ECNS_vars->PARA_reserved_28 = SamsungDiamondParam_varsTx->InPARA_reserved_28;
	DVTX_ECNS_vars->PARA_reserved_29 = SamsungDiamondParam_varsTx->InPARA_reserved_29;
	DVTX_ECNS_vars->PARA_reserved_30 = SamsungDiamondParam_varsTx->InPARA_reserved_30;
	DVTX_ECNS_vars->PARA_reserved_31 = SamsungDiamondParam_varsTx->InPARA_reserved_31;
	DVTX_ECNS_vars->PARA_reserved_32 = SamsungDiamondParam_varsTx->InPARA_reserved_32;
	DVTX_ECNS_vars->PARA_reserved_33 = SamsungDiamondParam_varsTx->InPARA_reserved_33;
	DVTX_ECNS_vars->PARA_reserved_34 = SamsungDiamondParam_varsTx->InPARA_reserved_34;
	DVTX_ECNS_vars->PARA_reserved_35 = SamsungDiamondParam_varsTx->InPARA_reserved_35;
	DVTX_ECNS_vars->PARA_reserved_36 = SamsungDiamondParam_varsTx->InPARA_reserved_36;
	DVTX_ECNS_vars->PARA_reserved_37 = SamsungDiamondParam_varsTx->InPARA_reserved_37;
	DVTX_ECNS_vars->PARA_reserved_38 = SamsungDiamondParam_varsTx->InPARA_reserved_38;
	DVTX_ECNS_vars->PARA_reserved_39 = SamsungDiamondParam_varsTx->InPARA_reserved_39;
	DVTX_ECNS_vars->PARA_reserved_40 = SamsungDiamondParam_varsTx->InPARA_reserved_40;
	DVTX_ECNS_vars->PARA_reserved_41 = SamsungDiamondParam_varsTx->InPARA_reserved_41;
	DVTX_ECNS_vars->PARA_reserved_42 = SamsungDiamondParam_varsTx->InPARA_reserved_42;
	DVTX_ECNS_vars->PARA_reserved_43 = SamsungDiamondParam_varsTx->InPARA_reserved_43;
	DVTX_ECNS_vars->PARA_reserved_44 = SamsungDiamondParam_varsTx->InPARA_reserved_44;
	DVTX_ECNS_vars->PARA_reserved_45 = SamsungDiamondParam_varsTx->InPARA_reserved_45;
	DVTX_ECNS_vars->PARA_reserved_46 = SamsungDiamondParam_varsTx->InPARA_reserved_46;
	DVTX_ECNS_vars->PARA_reserved_47 = SamsungDiamondParam_varsTx->InPARA_reserved_47;
	DVTX_ECNS_vars->PARA_reserved_48 = SamsungDiamondParam_varsTx->InPARA_reserved_48;
	DVTX_ECNS_vars->PARA_reserved_49 = SamsungDiamondParam_varsTx->InPARA_reserved_49;
	DVTX_ECNS_vars->PARA_reserved_50 = SamsungDiamondParam_varsTx->InPARA_reserved_50;
	DVTX_ECNS_vars->PARA_reserved_51 = SamsungDiamondParam_varsTx->InPARA_reserved_51;
	DVTX_ECNS_vars->PARA_reserved_52 = SamsungDiamondParam_varsTx->InPARA_reserved_52;
	DVTX_ECNS_vars->PARA_reserved_53 = SamsungDiamondParam_varsTx->InPARA_reserved_53;
	DVTX_ECNS_vars->PARA_reserved_54 = SamsungDiamondParam_varsTx->InPARA_reserved_54;
	DVTX_ECNS_vars->PARA_reserved_55 = SamsungDiamondParam_varsTx->InPARA_reserved_55;
	DVTX_ECNS_vars->PARA_reserved_56 = SamsungDiamondParam_varsTx->InPARA_reserved_56;
	DVTX_ECNS_vars->PARA_reserved_57 = SamsungDiamondParam_varsTx->InPARA_reserved_57;
	DVTX_ECNS_vars->PARA_reserved_58 = SamsungDiamondParam_varsTx->InPARA_reserved_58;
	DVTX_ECNS_vars->PARA_reserved_59 = SamsungDiamondParam_varsTx->InPARA_reserved_59;
	DVTX_ECNS_vars->PARA_reserved_60 = SamsungDiamondParam_varsTx->InPARA_reserved_60;
	DVTX_ECNS_vars->PARA_reserved_61 = SamsungDiamondParam_varsTx->InPARA_reserved_61;
	DVTX_ECNS_vars->PARA_reserved_62 = SamsungDiamondParam_varsTx->InPARA_reserved_62;
	DVTX_ECNS_vars->PARA_reserved_63 = SamsungDiamondParam_varsTx->InPARA_reserved_63;
	DVTX_ECNS_vars->PARA_reserved_64 = SamsungDiamondParam_varsTx->InPARA_reserved_64;
	DVTX_ECNS_vars->PARA_reserved_65 = SamsungDiamondParam_varsTx->InPARA_reserved_65;
	DVTX_ECNS_vars->PARA_reserved_66 = SamsungDiamondParam_varsTx->InPARA_reserved_66;
	DVTX_ECNS_vars->PARA_reserved_67 = SamsungDiamondParam_varsTx->InPARA_reserved_67;
	DVTX_ECNS_vars->PARA_reserved_68 = SamsungDiamondParam_varsTx->InPARA_reserved_68;
	DVTX_ECNS_vars->PARA_reserved_69 = SamsungDiamondParam_varsTx->InPARA_reserved_69;
	DVTX_ECNS_vars->PARA_reserved_70 = SamsungDiamondParam_varsTx->InPARA_reserved_70;
	DVTX_ECNS_vars->PARA_reserved_71 = SamsungDiamondParam_varsTx->InPARA_reserved_71;
	DVTX_ECNS_vars->PARA_reserved_72 = SamsungDiamondParam_varsTx->InPARA_reserved_72;
	DVTX_ECNS_vars->PARA_reserved_73 = SamsungDiamondParam_varsTx->InPARA_reserved_73;
	DVTX_ECNS_vars->PARA_reserved_74 = SamsungDiamondParam_varsTx->InPARA_reserved_74;
	DVTX_ECNS_vars->PARA_reserved_75 = SamsungDiamondParam_varsTx->InPARA_reserved_75;
	DVTX_ECNS_vars->PARA_reserved_76 = SamsungDiamondParam_varsTx->InPARA_reserved_76;
	DVTX_ECNS_vars->PARA_reserved_77 = SamsungDiamondParam_varsTx->InPARA_reserved_77;
	DVTX_ECNS_vars->PARA_reserved_78 = SamsungDiamondParam_varsTx->InPARA_reserved_78;
	DVTX_ECNS_vars->PARA_reserved_79 = SamsungDiamondParam_varsTx->InPARA_reserved_79;
	DVTX_ECNS_vars->PARA_reserved_80 = SamsungDiamondParam_varsTx->InPARA_reserved_80;
	
	// Parameter Config  ---------------//
	// Parameter Config AECNS : WB
	for (i = 0; i < (DVTX_fft_len - DVTX_fft_halflen); i++)
	{
		DVTX_ECNS_vars->AECNS.OVERLAP[i] = 0;
	}
	for (i = 0; i < DVTX_DELAY_WB; i++)
	{
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP[i] = 0;
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP_RX[i] = 0;
		DVTX_ECNS_vars->AECNS.WINDOW_OVERLAP_RX2[i] = 0;
	}
	for (i = 0; i < DVTX_NUM_CHAN_WB; i++)
	{
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][0] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][1] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][2] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRMTX[i][3] = 0;

		DVTX_ECNS_vars->AECNS.L_Esqr_ravg_silence[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Dsqr_ravg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd_MMSE_ini[i] = 0;
		DVTX_ECNS_vars->AECNS.L_Npsd_MMSE_TMP[i] = 0;
		DVTX_ECNS_vars->AECNS.P_H1_ravg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRpost_prv[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SERpost_prv[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SNRprio_avg[i] = 0;
		DVTX_ECNS_vars->AECNS.L_SNR_by_Nmmse_ini_avg[i] = 0;
	}
	for (i = 0; i < DVTX_Nfft_ceps; i++)
	{
		DVTX_ECNS_vars->AECNS.beta_ceps[i] = 0;
		DVTX_ECNS_vars->AECNS.SNR_ini_ceps_avg[i] = 0;
		DVTX_ECNS_vars->AECNS.SNR_ini_ceps_Fixedavg[i] = 0;
	}
	DVTX_ECNS_vars->AECNS.INDEX_SNRMTX = 0;
	DVTX_ECNS_vars->AECNS.PRE_EMP = 0;
	DVTX_ECNS_vars->AECNS.PRE_EMP_RX = 0;
	DVTX_ECNS_vars->AECNS.DE_EMP = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV_RX = 0;

	DVTX_ECNS_vars->AECNS.PRE_EMP_RX2 = 0;
	DVTX_ECNS_vars->AECNS.NORM_PRV_RX2 = 0;

	DVTX_ECNS_vars->AECNS.hov_tx_noisefree_cnt = 0;
	DVTX_ECNS_vars->AECNS.noise_floor_offset = 0;
	DVTX_ECNS_vars->AECNS.gain_Npsd = DVTX_MAX_16;


	// AEC WB
	//AECADF : WB	
	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->AECADF.E_tx_AEC[k] = 0;
		DVTX_ECNS_vars->AECADF.E_tx_AECaux[k] = 0;

		DVTX_ECNS_vars->AECADF.RxFFTfrm_AEC[k] = 0;
		DVTX_ECNS_vars->AECADF.RxFFTfrm_clp_AEC[k] = 0;
	}
	for (k = 0; k < 2000; k++)
	{
		DVTX_ECNS_vars->AECADF.RxFrm_Delay_AEC[k] = 0;
	}
	for (k = 0; k < DVTX_fft_halflen + DVTX_Nadf_MAX - 1; k++)
	{
		DVTX_ECNS_vars->AECADF.RxFrm_AECin_AEC[k] = 0;
	}
	DVTX_ECNS_vars->AECADF.Flag_Tx_Clipping = 0;
	DVTX_ECNS_vars->AECADF.Flag_RxVAD_AEC = 0;
	DVTX_ECNS_vars->AECADF.Flag_TxSilence_AEC = 1;
	DVTX_ECNS_vars->AECADF.Flag_Tx_LoudSig = 1;
	DVTX_ECNS_vars->AECADF.Flag_SingleTalk = 0;
	DVTX_ECNS_vars->AECADF.L_ADF_err_pwr = 0;
	DVTX_ECNS_vars->AECADF.Gain_echo_PSD_RES = DVTX_MAX_16;

	if (DVTX_ECNS_vars->TX_bandwidth == DVTX_FRAME_LENGTH_NB)
		DVTX_ECNS_vars->AECADF.hangover_cnt_flag_RxVAD_First = (DVTX_RxSigOnset_FRAME_NB - 1);
	else
		DVTX_ECNS_vars->AECADF.hangover_cnt_flag_RxVAD_First = (DVTX_RxSigOnset_FRAME_WB - 1);

	DVTX_ECNS_vars->AECADF.Qex_q = 0;
	DVTX_ECNS_vars->AECADF.Qxx_q = 0;
	DVTX_ECNS_vars->AECADF.L_Qex = 1;
	DVTX_ECNS_vars->AECADF.L_Qxx = 1;
	DVTX_ECNS_vars->AECADF.XECC = 0;
	DVTX_ECNS_vars->AECADF.Threshold_XECC = 1000; //0.2*2^13

	DVTX_ECNS_vars->AECADF.L_Perr = 0;
	DVTX_ECNS_vars->AECADF.L_Perr_aux = 0;

	DVTX_ECNS_vars->AECADF.Flag_SingleNET = 0;
	// ECNSbuff initialization-----------------------------------------------------------//
	// Parameter Config 

	for (k = 0; k < DVTX_RxSigon_BuffLen_MAX; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.Buff_RxOnset_aecout[k] = 0; // max 4 frmae 320*4=1280, NB/WB common
		DVTX_ECNS_vars->ECNSbuff.Buff_RxOnset_txin[k] = 0;
	}

	for (k = 0; k < DVTX_Nadf_MAX; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.ADF_IN[k] = 0;
	}
	for (k = 0; k < /*DVTX_Nadf_MAX*/DVTX_Nadf_WB; k++)
	{
		if (DVTX_ECNS_vars->TX_bandwidth == DVTX_FRAME_LENGTH_NB)
		{
			if (DVTX_ECNS_vars->PARA_call_mode_HS_HF_EAR == 4) //GEAR				
			{
				DVTX_ECNS_vars->ECNSbuff.W[k] = 0;
				DVTX_ECNS_vars->ECNSbuff.Waux[k] = 0;
			}
		}
		if (DVTX_ECNS_vars->TX_bandwidth == DVTX_FRAME_LENGTH_WB)
		{
			if (DVTX_ECNS_vars->PARA_call_mode_HS_HF_EAR == 4) //GEAR				
			{
				DVTX_ECNS_vars->ECNSbuff.W[k] = 0;
				DVTX_ECNS_vars->ECNSbuff.Waux[k] = 0;
			}
		}
	}

	for (k = 0; k < DVTX_Nadfshort_WB; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.ADF_IN_short[k] = 0;
	}

	for (k = 0; k < DVTX_NUM_CHAN_WB; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_global[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Esqr[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Esqr_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_tmpvec[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_tmpvec1[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_tmpvec[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_noise_floor[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_spp_ns[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_Gns_final[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.P_H1[k] = 0;

		DVTX_ECNS_vars->ECNSbuff.P_H1_GbyL[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNRpost[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNRprio[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_Dsqr_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_PSD_resiEcho[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SERpost[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SERprio[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EsqrNS_q30_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_SNR_by_Nmmse_ini_cepsmooth_fix[k] = 0;

	}

	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.L_DDBin[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.L_EEBin[k] = 0;

		DVTX_ECNS_vars->ECNSbuff.L_EEBin_forMixing[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.S_tmpfft1[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.Gpwrres[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression[k] = DVTX_ECNS_vars->PARA_reserved_46;
		DVTX_ECNS_vars->ECNSbuff.W_fnlms_reression2[k] = DVTX_ECNS_vars->PARA_reserved_46;
		DVTX_ECNS_vars->ECNSbuff.G_fnlms[k] = DVTX_MAX_16;
		DVTX_ECNS_vars->ECNSbuff.L_RRBin_step[k] = 0;
	}

	DVTX_ECNS_vars->ECNSbuff.CntFrmRxVADon = 0;

	DVTX_ECNS_vars->AECADF.Flag_IniRxSigOnset = 0;
	DVTX_ECNS_vars->ECNSbuff.DelayCompensation = DVTX_ECNS_vars->PARA_Nadfdelay;

	DVTX_ECNS_vars->ECNSbuff.Pwr_RX_AECIN_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECIN_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECOUT_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.Pwr_TX_AECauxOUT_dB = 0;
	DVTX_ECNS_vars->ECNSbuff.PwrDiff_AECinout_dB = 0;
	DVTX_ECNS_vars->AECADF.Flag_Waux_update = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Flag_Tx_silent_mode = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Cnt_Cascade_tx_silent_frames = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Pwr_1kHz_to_4kHz = 0; //1 for large for single talk
	DVTX_ECNS_vars->AECADF.Pwr_100Hz_to_1kHz = 0; //1 for large for single talk

	DVTX_ECNS_vars->ECNSbuff.PwrDiff_Tx_Rx_Frm = 0;

	DVTX_ECNS_vars->ECNSbuff.Count_DelayCompensation_function_exe = 0;
	DVTX_ECNS_vars->ECNSbuff.Hangover_Cnt_NET_Onset = DVTX_MAX_16;

	DVTX_ECNS_vars->ECNSbuff.L_Pwr_tonality_ringband = 0;
	DVTX_ECNS_vars->ECNSbuff.L_Pwr_tonality_otherband = 0;
	DVTX_ECNS_vars->AECADF.Flag_ringbakctone = 0;


	for (k = 0; k < DVTX_Nfft_ceps; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.tmpvec_ceps[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.SNR_ini_ceps[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.tmp_beta_ceps[k] = 0;
	}

	DVTX_ECNS_vars->ECNSbuff.Cnt_Samples_NLMSupdate = 0;

	for (k = 0; k < 5; k++)
	{
		DVTX_ECNS_vars->ECNSbuff.HPFstateTx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.HPFstateRx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.LPFstateTx[k] = 0;
		DVTX_ECNS_vars->ECNSbuff.LPFstateRx[k] = 0;
	}

	// f0-based pre NS initialize
	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->preNS.L_tmp256[k] = 0;
		DVTX_ECNS_vars->preNS.L_EEoo_07[k] = 0;
		DVTX_ECNS_vars->preNS.tmpf0contour[k] = DVTX_MAX_16;
		DVTX_ECNS_vars->preNS.f0contourAvg[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->preNS.L_Eoo[k] = 0;
		DVTX_ECNS_vars->preNS.G_NS[k] = DVTX_MAX_16;

		DVTX_ECNS_vars->preNS.Aeq[k] = 16384;		//1 in Q14

		DVTX_ECNS_vars->preNS.ANC_sigPwr[k] = 0;
		DVTX_ECNS_vars->preNS.avg_ANC_sigPwr[k] = 0;

		DVTX_ECNS_vars->preNS.ANC_sigPwr_inner[k] = 0;
	}
	for (k = 0; k < DVTX_FFT_HALFLEN_NB; k++)
	{
		DVTX_ECNS_vars->preNS.L_EEii[k] = 0;
	}
	for (k = 0; k < DVTX_fft_len; k++)
	{
		DVTX_ECNS_vars->preNS.ANC_W_Filter[k] = 0;
		DVTX_ECNS_vars->preNS.Enhenced_Signal[k] = 0;
		DVTX_ECNS_vars->preNS.data_buffer_inner_WB[k] = 0;
	}

	for (k = 0; k < DVTX_fft_halflen; k++)
	{
		DVTX_ECNS_vars->preNS.speech_inner_WB[k] = 0;
	}
	for (k = 0; k < DVTX_M_DELAY_WB; k++)
	{
		DVTX_ECNS_vars->preNS.Inner_WINDOW_OVERLAP[k] = 0;
	}


	DVTX_ECNS_vars->preNS.FrmVAD = 0;
	DVTX_ECNS_vars->preNS.FrmPiLowBand = 0;
	DVTX_ECNS_vars->preNS.FrmRioLowBand = 0;
	DVTX_ECNS_vars->preNS.VariableTHD_Ratio_LowBandPwr = 2000;// initial THD
	DVTX_ECNS_vars->preNS.VariableTHD_THD_Pwr_inner = 1000;
	DVTX_ECNS_vars->preNS.PwrDiffOuterInner = 0;
	DVTX_ECNS_vars->preNS.FrmDT = 0;

	DVTX_ECNS_vars->preNS.BLK_NORM_inner_WB = 0;
	DVTX_ECNS_vars->preNS.PRE_EMP_inner = 0;
	DVTX_ECNS_vars->preNS.NORM_PRV_inner = 0;

	//Parameter Config


	return 0;
}

int SolomonVoiceECNSInOutConfig(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars, DVTX_ECNS_Cfg_t* DVTX_ECNS_vars_Outer, short *Speech, short *Speech_rx, short *OutSignal, short *Speech_Outer, short *OutSignal_Outer, short *Speech_rx_Outer, short *OutSignal_Outer_BWE, short *OutSignal_Outer_Outer, short *OutSignal_Outer_Inner)
{
	DVTX_ECNS_vars->Speech = Speech;
	DVTX_ECNS_vars->Speech_rx = Speech_rx;
	DVTX_ECNS_vars->OutSignal = OutSignal;

	DVTX_ECNS_vars_Outer->Speech = Speech_Outer;
	DVTX_ECNS_vars_Outer->Speech_rx = Speech_rx_Outer;
	DVTX_ECNS_vars_Outer->OutSignal = OutSignal_Outer;
	DVTX_ECNS_vars_Outer->OutSignal_BWE = OutSignal_Outer_BWE;
	DVTX_ECNS_vars_Outer->OutSignal_Outer = OutSignal_Outer_Outer;
	DVTX_ECNS_vars_Outer->OutSignal_Inner = OutSignal_Outer_Inner;

	return 0;
}

int SolomonVoiceWECNSExe(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars_Inner, DVTX_ECNS_Cfg_t* DVTX_ECNS_vars_Outer)
{
	short i, ret;
	short *pTxinner, *pRxinner, *pTxouter, *pRxouter, *pOutouter;
	short *pOutinner;

	short rx_temp[DVTX_FRAME_LENGTH_NB] = { 0, };
	short tx_temp[DVTX_FRAME_LENGTH_NB] = { 0, };

	/********* Copy Input data into output data buffer ********/
	pTxinner = DVTX_ECNS_vars_Inner->Speech;
	pRxinner = DVTX_ECNS_vars_Inner->Speech_rx;
	pOutinner = DVTX_ECNS_vars_Inner->OutSignal;
	pTxouter = DVTX_ECNS_vars_Outer->Speech;
	pRxouter = DVTX_ECNS_vars_Outer->Speech_rx;
	pOutouter = DVTX_ECNS_vars_Outer->OutSignal;

	/********* inner tx clipping detection in time domain ********/
	DVTX_ECNS_vars_Inner->AECADF.Flag_Tx_Clipping = 0;
	for (i = 0; i < DVTX_ECNS_vars_Inner->TX_bandwidth; i++)
	{
		if (*(pTxinner + i) > 18000)
		{
			DVTX_ECNS_vars_Inner->AECADF.Flag_Tx_Clipping = 1;
			break;
		}
	}

	/********* outer tx clipping detection in time domain ********/
	DVTX_ECNS_vars_Outer->AECADF.Flag_Tx_Clipping = 0;
	for (i = 0; i < DVTX_ECNS_vars_Outer->TX_bandwidth; i++)
	{
		if (*(pTxouter + i) > 18000)
		{
			DVTX_ECNS_vars_Outer->AECADF.Flag_Tx_Clipping = 1;
			break;
		}
	}

	if (DVTX_ECNS_vars_Outer->TX_bandwidth == DVTX_FRM_LEN_WB)
	{
		FN_2ndIIR_FILTERING(DVTX_ECNS_vars_Outer->Speech, DVTX_ECNS_vars_Outer->TX_bandwidth, HPFcoeff, DVTX_ECNS_vars_Outer->ECNSbuff.HPFstateTx);
		FN_2ndIIR_FILTERING(DVTX_ECNS_vars_Outer->Speech_rx, DVTX_ECNS_vars_Outer->TX_bandwidth, HPFcoeff, DVTX_ECNS_vars_Outer->ECNSbuff.HPFstateRx);

		/********* copy inner 16kHz data for VAD and ANC and pref0NS ********/
		for (i = 0; i < DVTX_FRM_LEN_WB; i++)
		{
			DVTX_ECNS_vars_Inner->preNS.speech_inner_WB[i] = *(DVTX_ECNS_vars_Inner->Speech + i);
		}

		/********* inner downsampling : 16kHz to 8kHz ********/
		for (i = 0; i < DVTX_FRAME_LENGTH_NB; i++) {
			rx_temp[i] = 0;
			tx_temp[i] = 0;
		}
		/********* Downsampling for Rx/Tx Signal ********/
		WebRtcSpl_DownsampleBy2(DVTX_ECNS_vars_Inner->Speech_rx, DVTX_FRAME_LENGTH_WB, &rx_temp[0], DVTX_ECNS_vars_Inner->arr.reSampleBuf1);
		WebRtcSpl_DownsampleBy2(DVTX_ECNS_vars_Inner->Speech, DVTX_FRAME_LENGTH_WB, &tx_temp[0], DVTX_ECNS_vars_Inner->arr.reSampleBuf2);

		for (i = 0; i < DVTX_FRAME_LENGTH_NB; i++) {
			DVTX_ECNS_vars_Inner->Speech_rx[2 * i] = 0;
			DVTX_ECNS_vars_Inner->Speech_rx[2 * i + 1] = 0;

			DVTX_ECNS_vars_Inner->Speech[2 * i] = 0;
			DVTX_ECNS_vars_Inner->Speech[2 * i + 1] = 0;

			DVTX_ECNS_vars_Inner->Speech_rx[i] = rx_temp[i];
			DVTX_ECNS_vars_Inner->Speech[i] = tx_temp[i];
		}

		/********* EC inner : 8kHz Fs ********/
		FN_DVTX_AEC(DVTX_ECNS_vars_Inner);

		/********* EC outer : 16kHz Fs ********/
		FN_DVTX_AEC(DVTX_ECNS_vars_Outer);

		/********* input signal gain for NS module ********/
		Fx_vector_gain(DVTX_ECNS_vars_Inner->Speech, DVTX_ECNS_vars_Inner->PARA_Gain_TxSig_NS_IN, DVTX_ECNS_vars_Inner->PARA_Q_for_InSigGain, DVTX_FRM_LEN_NB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Inner->AECADF.RxFFTfrm_AEC, DVTX_ECNS_vars_Inner->PARA_Gain_RxSig_NS_IN, DVTX_ECNS_vars_Inner->PARA_Q_for_InSigGain, DVTX_FRM_LEN_NB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Inner->AECADF.RxFFTfrm_clp_AEC, DVTX_ECNS_vars_Inner->PARA_Gain_RxSig_NS_IN, DVTX_ECNS_vars_Inner->PARA_Q_for_InSigGain, DVTX_FRM_LEN_NB); // gain is Q4.11 format... 

		Fx_vector_gain(DVTX_ECNS_vars_Outer->Speech, DVTX_ECNS_vars_Outer->PARA_Gain_TxSig_NS_IN, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FRM_LEN_WB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Outer->AECADF.RxFFTfrm_AEC, DVTX_ECNS_vars_Outer->PARA_Gain_RxSig_NS_IN, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FRM_LEN_WB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Outer->AECADF.RxFFTfrm_clp_AEC, DVTX_ECNS_vars_Outer->PARA_Gain_RxSig_NS_IN, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FRM_LEN_WB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Inner->preNS.speech_inner_WB, DVTX_ECNS_vars_Outer->PARA_Gain_TxSig_NS_IN, DVTX_ECNS_vars_Inner->PARA_Q_for_InSigGain, DVTX_FRM_LEN_WB); // gain is Q4.11 format... 
		
		/********* FFT ********/
		FFT_functions(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		fn_FrmVAD(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		if (FLAG_WB_OuterECNSOnly == 1) // WB Á¤·®ÃøÁ¤
		{
			DVTX_ECNS_vars_Outer->preNS.FrmVAD = 1;
			DVTX_ECNS_vars_Outer->preNS.FrmDT = 1;

			DVTX_ECNS_vars_Outer->PARA_xi_for_SPP_Table = 0;// 0 to 15 [dB] scale
			DVTX_ECNS_vars_Outer->PARA_Npsd_Gain_MIN = 22000;//DVTX_FLOAT2FIXED(0.67f, 15);//	Npsd	gain	in	silence	interval
			DVTX_ECNS_vars_Outer->PARA_NoiseFloor_Offset_MAX = 5500;// DVTX_FLOAT2FIXED(0.18f, 15);//	Gain	floor	offset	in	silence	interval
			DVTX_ECNS_vars_Outer->PARA_reserved_9 = 0;	// in/out Mixing flag

			DVTX_ECNS_vars_Outer->PARA_THD_Pwr_Tx_dB = 7168;// DVTX_FLOAT2FIXED(35.0f, 8);
			DVTX_ECNS_vars_Outer->PARA_THD_Pwr_Lo_1k_4k = 5000;

			DVTX_ECNS_vars_Outer->PARA_reserved_61 = 0;
			Gmin = 32767;
		}
		else
		{
			ret = fn_Adaptive_NC(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer, ANCflag_inner, ANCflag_outer); // ACN inner on, ANC outer off
			ret = FN_f0_based_pre_Noise_suppression(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer, F0flag); // f0 always		
		}

		DVTX_ECNS_vars_Inner->TX_bandwidth = DVTX_FRAME_LENGTH_NB;
		
		/********* NS inner : 8kHz Fs ********/
		FN_DVTX_NS(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		DVTX_ECNS_vars_Outer->TX_bandwidth = DVTX_FRAME_LENGTH_WB;
		
		/********* ECNS outer : 16kHz Fs ********/
		FN_DVTX_NS(DVTX_ECNS_vars_Outer, DVTX_ECNS_vars_Inner);

		/********* Mixing (Frequency Domain) ********/
		FN_Mixing_FreqDomain(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		/********* IFFT ********/
		IFFT_functions(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		/********* output signal gain ********/
		Fx_vector_gain(data_buffer_NB, DVTX_ECNS_vars_Inner->PARA_Gain_TxSig_NS_Out, DVTX_ECNS_vars_Inner->PARA_Q_for_InSigGain, DVTX_FFT_LEN_NB); // gain is Q4.10 format... 
		Fx_vector_gain(data_buffer_WB, DVTX_ECNS_vars_Outer->PARA_Gain_TxSig_NS_Out, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FFT_LEN_WB); // gain is Q4.10 format... 
		if (Mixing.State > 1)
			Fx_vector_gain(data_buffer_WB, 1149, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FFT_LEN_WB); // +1dB for high noise gain is Q4.10 format... 
		// Txinput gain applying to inner signal for mixing	
		Fx_vector_gain(DVTX_ECNS_vars_Inner->arr.inner_x_win, DVTX_ECNS_vars_Outer->PARA_Gain_TxSig, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FFT_LEN_WB); // gain is Q4.11 format... 
		Fx_vector_gain(DVTX_ECNS_vars_Inner->arr.inner_x_win, DVTX_ECNS_vars_Outer->PARA_Gain_TxSig_NS_Out, DVTX_ECNS_vars_Outer->PARA_Q_for_InSigGain, DVTX_FFT_LEN_WB); // gain is Q4.11 format... 
		

		/********* BWE ********/
		FN_BWE(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		/********* Mixing (mixing state, gain»êÃâ) ********/
		FN_Set_Mixing(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		/********* Mixing (Time Domain) ********/
		FN_Mixing_TimeDomain(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

		/********* OLA ********/
		IOLA_functions(DVTX_ECNS_vars_Inner, DVTX_ECNS_vars_Outer);

	}
	else // NarrowBand
	{
		/*if (DVTX_ECNS_vars_Outer->PARA_FLAG_FIRST_FRM == DVTX_TRUE)
		{
			FN_NBcall_ParaConfig(DVTX_ECNS_vars_Outer);
		}

		FN_2ndIIR_FILTERING(DVTX_ECNS_vars_Outer->Speech, DVTX_ECNS_vars_Outer->TX_bandwidth, HPFcoeff, DVTX_ECNS_vars_Outer->ECNSbuff.HPFstateTx);
		FN_2ndIIR_FILTERING(DVTX_ECNS_vars_Outer->Speech_rx, DVTX_ECNS_vars_Outer->TX_bandwidth, HPFcoeff, DVTX_ECNS_vars_Outer->ECNSbuff.HPFstateRx);

		DVTX_ECNS_vars_Outer->preNS.FrmVAD = 1;
		DVTX_ECNS_vars_Outer->preNS.FrmDT = 1;

		FN_DVTX_AEC(DVTX_ECNS_vars_Outer);
		FN_DVTX_NS_NBBT(DVTX_ECNS_vars_Outer);*/
	}

	return 0;
}
