#include "SamsungSolomonVoiceW_ANC.h"
#include "SamsungSolomonVoiceW_BF.h"


#ifdef __SV_ANC_DEBUG__
#include "debug_bf.h"
#endif
#if(FLAG_SELECT_C_DSP == 1)
extern FILE *fp_debug1, *fp_deg_2micBF[N_fp_2micBF_debuffiles];
extern FILE *fp_dbg_AMSState;
#endif

void SolomonVoiceWBFInit(BFStatus* BF_buf, SamsungSolomonVoiceWTxBFParam* BF_param, COMMONBUF* common_buf)
{
	short i, j;
	short k1;
	short k2 ;
	/**** Buffer *****/
	BF_buf->qXX01EQ = 30;
	BF_buf->qXX02EQ = 30;

	for (i = 0; i < DVTX_M_FFT_LEN_WB; i++)
	{
		BF_buf->XoutGSC[i] = 0;
	}

	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++)
	{
		BF_buf->XXo1[i] = 0;
		BF_buf->XXo2[i] = 0;

		BF_buf->GXo1Xo2EQ[i] = (1 << 28); //1.0 (Q3.28?)
		BF_buf->PwrXo1EQ[i] = (1 << 22); //1/256 (Q1.30)
		BF_buf->PwrXo2EQ[i] = (1 << 22); //1/256 (Q1.30)

		BF_buf->XXgsc[i] = 100;

		BF_buf->tmpvec256A[i] = 0;
		BF_buf->tmpvec256B[i] = 0;

		BF_buf->pH1mic[i]     = 0;
		BF_buf->pH1micavg[i]  = 0;
		BF_buf->Npsdmic[i]    = 1;
		BF_buf->Npsdsppmic[i] = 1;

		BF_buf->pH1gsc[i] = 0;
		BF_buf->pH1gscavg[i] = 0;
		BF_buf->Npsdgsc[i] = 1;
		BF_buf->Npsdsppgsc[i] = 1;

		//BF_buf->PwrXXgsc[i] = 1000;
		//BF_buf->PwrXXbm[i] = 1000;
		BF_buf->NpsdBM[i]   = 1000;
		//BF_buf->G_gsc_bm[i] = 1000;

		BF_buf->NpsdBFout[i] = 0;
	}

	BF_buf->PwrMic1Avg = 0;
	BF_buf->PwrMic2Avg = 0;

	BF_buf->AMSweightSubMicAvg = 0;

#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__

	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB + 1; i++)
	{
		BF_buf->ps[i] = 0;
		BF_buf->a_ceps[i] = 0;
		BF_buf->gain_postNS[i] = DVTX_MAX_16;
	}

	
	for (i = 0; i < DVTX_M_FFT_LEN_WB; i++)
	{
		BF_buf->ps_ceps[i] = 0;
		BF_buf->ps_cepsavg[i] = 0;
		BF_buf->XX_GSCcpes[i] = 0;
	}

	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++)
	{
		BF_buf->ps_cepsHalfFixAvg[i] = 0;		
	}
#endif

	// LTSV
	for (i = 0; i < DVTX_M_LTSV_Nbin; i++)
	{
		for (j = 0; j < DVTX_M_LTSV_R; j++)
		{
			BF_buf->SxMtxLtsv[i][j] = 0;
		}
	}
	BF_buf->ColIndexSxMtx = 0;

	BF_buf->Flag_AbnormalMic = 0;
	BF_buf->Flag_NoiseOnly = 0;

	BF_buf->LSTV_value_BF = 0;
	BF_buf->VAD_LTSVgsc_multiFlag = 0;


	BF_buf->wBF = NULL;
	BF_buf->wMaxNSR = NULL;

	for (i = 0; i < (DVTX_M_FFT_HALFLEN_WB/* + 1*/) * 2; i++)
	{
		BF_buf->X_F_NSR[i] = 0;
		BF_buf->X_B_NSR[i] = 0;
		//BF_buf->XoBcNSRNfrm[0][i] = 0;
		//BF_buf->XoBcNSRNfrm[1][i] = 0;
		BF_buf->WgscNSR[i] = 0;
		//BF_buf->WgscNSRNfrm[0][i] = 0;
		//BF_buf->WgscNSRNfrm[1][i] = 0;

		//BF_buf->WabmNSR[i] = 0;
	}

	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		BF_buf->XXgsc[i] = 0;
	}
	BF_buf->qXXgsc = 30;


	/**** Params *****/
#ifndef DIVIDE_TEST2
	for (i = 0; i < 2/*(short)(100. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++) // Initialize
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.2
	for (; i < 15/*(short)(500. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.2
	for (; i < 63/*(short)(2000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.4
	for (; i < 127/*(short)(4000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.4
	for (; i < 255/*(short)(8000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.8
	for (; i < DVTX_FFT_HALFLEN_WB + 1; i++)
		BF_param->OvrSubFactor[i] = 32768/*Q15*/; //1.8
#else
	for (i = 0; i < 2/*(short)(100. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++) // Initialize
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; // 81920/*Q15*/; //1.8
	for (; i < 15/*(short)(500. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; // 58982/*Q15*/; //1.2
	for (; i < 63/*(short)(2000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; // 52428/*Q15*/; //1.6
	for (; i < 127/*(short)(4000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; //52428/*Q15*/; //1.6
	for (; i < 255/*(short)(8000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1*/; i++)
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; // 114688/*Q15*/; //1.8
	for (; i < DVTX_FFT_HALFLEN_WB + 1; i++)
		BF_param->OvrSubFactor[i] = 8192/*Q13*/; // 32768/*Q15*/; //1.8
#endif


	k1 = 3;
	k2 = 20;
	for (i = 0; i < k1; i++)
		BF_param->a_cnst[i] = 6553;  //0.2 (Q0.15)
	for (; i < k2; i++)
		BF_param->a_cnst[i] = 9830;  //0.3 (Q0.15)
	for (; i < DVTX_FFT_HALFLEN_WB + 1; i++)
		BF_param->a_cnst[i] = 32440; //0.99 (Q0.15)

	k1 = 3;
	k2 = 20;
	for (i = 0; i < k1; i++)
		BF_param->a_cnst_VADon[i] = 6553;  //0.2 (Q0.15)	
	for (; i < k2; i++)
		BF_param->a_cnst_VADon[i] = 9830;  //0.3 (Q0.15)	
	for (; i < DVTX_FFT_HALFLEN_WB + 1; i++)
		BF_param->a_cnst_VADon[i] = 30440; //0.99 (Q0.15)
	

	BF_param->fl = (short)(100. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1;
	BF_param->fh = (short)(7000. / Fs * DVTX_FFT_LEN_WB + 0.5) - 1;

	BF_param->q1st = 50;
	BF_param->qend = 220;
	BF_param->beta = 30146; //0.92 (Q0.15)

	return;
}


#ifdef Left_Shift_32to16_OPT_DSP
void Left_Shift_32to16(short * in, int * out, int shift, int len) // in(i ), out(out)
{
	ae_valign align1, align2;
	ae_int16x4 *pt1, A16;
	ae_int32x2 *pt2;
	ae_int32x2 A32_0, A32_1;
	int shift0;
    int i;
    shift0 = 16 - shift;
	pt1=(ae_int16x4 *)in;
	pt2=(ae_int32x2 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=4)
	{
		AE_LA16X4_IP(A16, align1, pt1);
		A32_0 = AE_CVT32X2F16_32(A16);
		A32_1 = AE_CVT32X2F16_10(A16);
		A32_0 = AE_SRAA32S(A32_0, shift0);
		A32_1 = AE_SRAA32S(A32_1, shift0);
		AE_SA32X2_IP(A32_0, align2, pt2);
		AE_SA32X2_IP(A32_1, align2, pt2);
	}
	AE_SA64POS_FP(align2, pt2);
}
#endif

#ifdef  Right_Shift_32to16_OPT_DSP
void Right_Shift_32to16(int * in, short * out, int shift, int len)
{
	ae_valign align1, align2;
	ae_int16x4 *pt2, A16;
	ae_int32x2 *pt1;
	ae_int32x2 A32_0, A32_1;

    int i;

	pt1=(ae_int32x2 *)in;
	pt2=(ae_int16x4 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=4)
	{
		AE_LA32X2_IP(A32_0, align1, pt1);
		AE_LA32X2_IP(A32_1, align1, pt1);


		A32_0 = AE_SRAA32RS(A32_0, shift);
		A32_1 = AE_SRAA32RS(A32_1, shift);

		A16 = AE_CVT16X4(A32_0, A32_1);

		AE_SA16X4_IP(A16, align2, pt2);

	}
	AE_SA64POS_FP(align2, pt2);
}
#endif


#ifdef  V32to16_OPT_DSP
void V32to16(short * in, int * out,int len) // in(i ), out(out)
{
	ae_valign align1, align2;
	ae_int16x4 *pt1, A16;
	ae_int32x2 *pt2;
	ae_int32x2 A32_0, A32_1;
	int shift0;
    int i;
	pt1=(ae_int16x4 *)in;
	pt2=(ae_int32x2 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=4)
	{
		AE_LA16X4_IP(A16, align1, pt1);
		A32_0 = AE_CVT32X2F16_32(A16);
		A32_1 = AE_CVT32X2F16_10(A16);

		AE_SA32X2_IP(A32_0, align2, pt2);
		AE_SA32X2_IP(A32_1, align2, pt2);
	}
	AE_SA64POS_FP(align2, pt2);
}
#endif


#ifdef  V16to32_OPT_DSP
void V16to32(int * in, short * out,int len)
{
	ae_valign align1, align2;
	ae_int16x4 *pt2, A16;
	ae_int32x2 *pt1;
	ae_int32x2 A32_0, A32_1;

    int i;

	pt1=(ae_int32x2 *)in;
	pt2=(ae_int16x4 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=4)
	{
		AE_LA32X2_IP(A32_0, align1, pt1);
		AE_LA32X2_IP(A32_1, align1, pt1);

		A16 = AE_ROUND16X4F32SASYM(A32_0, A32_1);
		AE_SA16X4_IP(A16, align2, pt2);

	}
	AE_SA64POS_FP(align2, pt2);
}
#endif

void SolomonVoiceW_BF_ParamConfig(SamsungSolomonVoiceWTxBFParam* BF_param, SamsungSolomonVoiceWTxBFParam* param)
{
	//BF_param->q1st = param->q1st;
	//BF_param->qend = param->qend;
	//BF_param->beta = param->beta;

	return;
}

#ifdef fltfx_SolomonVoice_FFT_to_FFTpwr_OPT_DSP
void fltfx_SolomonVoice_FFT_to_FFTpwr(int *FFTpwrVec, short *FFTbinVec, short Nffthalf)
{
	//	short i, j;
	//	for (i = 0; i < Nffthalf; i++)
	//	{
	//		j = 2 * i;
	//		FFTpwrVec[i] = DVTXOP_L_add(DVTXOP_L_mult(FFTbinVec[j], FFTbinVec[j]), DVTXOP_L_mult(FFTbinVec[j + 1], FFTbinVec[j + 1]));
	//	}

	short i;
	ae_valign    align1,align2,align3;
	ae_int16x4  *p_FFTbinVec=(ae_int16x4 *)FFTbinVec;
	ae_int16x4  *p_FFTbinVec1=(ae_int16x4 *)(FFTbinVec+1);
	ae_int32x2  *p_FFTpwrVec=(ae_int32x2 *)FFTpwrVec;
	ae_int32x2 tmp1,tmp2;
	ae_f16x4 tmp_bin03,tmp_bin0213;
	align1 = AE_LA64_PP(p_FFTbinVec);
	align3 = AE_LA64_PP(p_FFTbinVec1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < Nffthalf; i+=2)
	{
		AE_LA16X4_IP(tmp_bin03, align1, p_FFTbinVec);
		tmp_bin0213=AE_SEL16_7520(tmp_bin03, tmp_bin03);
		AE_MULF16X4SS(tmp1, tmp2, tmp_bin0213, tmp_bin0213);
		tmp1=AE_ADD32S(tmp1, tmp2);
		AE_SA32X2_IP(tmp1, align2, p_FFTpwrVec);

	}
	AE_SA64POS_FP(align2, p_FFTpwrVec);
	return;
}
#else
void fltfx_SolomonVoice_FFT_to_FFTpwr(int *FFTpwrVec, short *FFTbinVec, short Nffthalf)
{
	short i, j;
	for (i = 0; i < Nffthalf; i++)
	{
		j = 2 * i;
		FFTpwrVec[i] = DVTXOP_L_add(DVTXOP_L_mult(FFTbinVec[j], FFTbinVec[j]), DVTXOP_L_mult(FFTbinVec[j + 1], FFTbinVec[j + 1]));
	}
	return;
}
#endif

#ifdef fltfn_LogPwrSum_OPT_DSP
int fltfn_LogPwrSum(int *FFTpwrVec, short fl, short fh, short Q)
{
	short i;
	int pwr, log_pwr;

//	pwr = 0;
//	for (i = 2; i <= 223; i++) // for (i = fl; i <= fh; i++)
//	{
//		pwr = DVTXOP_L_add(pwr, FFTpwrVec[i]); //Q.Q
//	}
	ae_valign    align1;
	ae_int32x2  *p_FFTpwrVec=(ae_int32x2 *)(FFTpwrVec+2);
	ae_int32x2 tmp,tmp1,tmp2,tmp3;
	align1 = AE_LA64_PP(p_FFTpwrVec);
    tmp=AE_MOVDA32X2(0, 0);
	for (i = 0; i < 220; i+=4) // for (i = fl; i <= fh; i++)
	{
		AE_LA32X2_IP(tmp1, align1, p_FFTpwrVec);
		AE_LA32X2_IP(tmp2, align1, p_FFTpwrVec);
		tmp3=AE_ADD32S(tmp1, tmp2);
		tmp=AE_ADD32S(tmp3, tmp);
		//pwr = DVTXOP_L_add(pwr, FFTpwrVec[i+2]); //Q.Q
	}
	AE_LA32X2_IP(tmp1, align1, p_FFTpwrVec);//220,221
	tmp=AE_ADD32S(tmp, tmp1);
	tmp=AE_ADD32_HL_LH(tmp, tmp);
	pwr=AE_MOVAD32_L(tmp);

	//log_pwr = DVTXOP_10log10_l(pwr, Q); //Q23
	log_pwr = DVTXOP_10log10_l(pwr, DVTXOP_sub(Q, 16)); //Q23
	log_pwr = DVTXOP_L_sub(log_pwr, 196685321); // log_pwr - DVTXOP_10log10_l(222/*223-2+1*/, 1)

	return log_pwr; //Q23
}

#else
int fltfn_LogPwrSum(int *FFTpwrVec, short fl, short fh, short Q)
{

	short i;
	int pwr, log_pwr;

	pwr = 0;
	for (i = 2; i <= 223; i++) // for (i = fl; i <= fh; i++)
	{
		pwr = DVTXOP_L_add(pwr, FFTpwrVec[i]); //Q.Q
	}
	//log_pwr = DVTXOP_10log10_l(pwr, Q); //Q23
	log_pwr = DVTXOP_10log10_l(pwr, DVTXOP_sub(Q, 16)); //Q23
	log_pwr = DVTXOP_L_sub(log_pwr, 196685321); // log_pwr - DVTXOP_10log10_l(222/*223-2+1*/, 1)

	return log_pwr; //Q23
}
#endif

int fltfn_LogPwrSumHighBand(int *FFTpwrVec, short fl, short fh, short Q)
{

	short i;
	int pwr, log_pwr;

	pwr = 0;
	for (i = 64; i < 224; i++) // for (i = fl; i <= fh; i++)	
	{
		pwr = DVTXOP_L_add(pwr, FFTpwrVec[i]); //Q.Q
	}
	//log_pwr = DVTXOP_10log10_l(pwr, Q); //Q23
	log_pwr = DVTXOP_10log10_l(pwr, DVTXOP_sub(Q, 16)); //Q23
	log_pwr = DVTXOP_L_sub(log_pwr, 184894985); // log_pwr - DVTXOP_10log10_l(222/*223-2+1*/, 1)

	return log_pwr; //Q23
}


void fltfn_spectralavg(int *Out, int *In, short Nbin, short Nsmth)
{
	short i;
	int tmpsum;

	Out[0] = In[0];
	tmpsum = DVTXOP_L_add(In[0], DVTXOP_L_add(In[1], In[2]));
	Out[1] = DVTXOP_L_mpy_ll(tmpsum, 715827883); //715827883 = 1/3 in Q31
	tmpsum = DVTXOP_L_add(tmpsum, DVTXOP_L_add(In[3], In[4]));
	Out[2] = DVTXOP_L_mpy_ll(tmpsum, 429496730); //429496730 = 1/5 in Q31
	tmpsum = DVTXOP_L_add(tmpsum, DVTXOP_L_add(In[5], In[6]));
	Out[3] = DVTXOP_L_mpy_ll(tmpsum, 306783378); //306783378 = 1/7 in Q31
	for (i = 4; i < Nbin - 3; i++)
	{
		tmpsum = DVTXOP_L_sub(tmpsum, In[i - 3 - 1]);
		tmpsum = DVTXOP_L_add(tmpsum, In[i + 3]);
		Out[i] = DVTXOP_L_mpy_ll(tmpsum, 306783378); //306783378 = 1/7 in Q31
	}
	tmpsum = DVTXOP_L_sub(tmpsum, DVTXOP_L_add(In[Nbin - 7], In[Nbin - 6]));
	Out[Nbin - 3] = DVTXOP_L_mpy_ll(tmpsum, 429496730); //429496730 = 1/5 in Q31
	tmpsum = DVTXOP_L_sub(tmpsum, DVTXOP_L_add(In[Nbin - 5], In[Nbin - 4]));
	Out[Nbin - 2] = DVTXOP_L_mpy_ll(tmpsum, 715827883); //715827883 = 1/3 in Q31
	Out[Nbin - 1] = In[Nbin - 1];

	return;
}

void fltfn_RecursiveVectorAvg(int *Out, int *In, short Nbin, int beta)
{
	short i;
	int alpha;

	alpha = 0x7fffffffL - beta;
	for (i = 0; i < Nbin; i++)
	{
		Out[i] = DVTXOP_L_add(DVTXOP_L_mpy_ll(beta, Out[i]), DVTXOP_L_mpy_ll(alpha, In[i]));
	}

	return;
}

#ifndef fltfn_RecursiveVectorAvg_q_OPT_DSP
short fltfn_RecursiveVectorAvg_q(int *Out, short qOut, int *In, short qIn, short Nbin, int beta)
{
	short i;
	short qOut_new, qtmp;
	int alpha, max;

	alpha = 0x7fffffffL - beta;
	//alpha = 0x7fff - beta;
	qOut_new = qOut;

	qtmp = qOut - qIn;
	if (qtmp > 0)
	{
		qOut_new = qIn;
		for (i = 0; i < Nbin; i++) Out[i] = DVTXOP_L_shr(Out[i], qtmp);
	}
	else if (qtmp < 0)
	{
		qtmp = -qtmp;
		for (i = 0; i < Nbin; i++) In[i] = DVTXOP_L_shr(In[i], qtmp);
	}
	for (max = 0, i = 0; i < Nbin; i++)
	{
		Out[i] = DVTXOP_L_add(DVTXOP_L_mpy_ll(beta, Out[i]), DVTXOP_L_mpy_ll(alpha, In[i]));
		//Out[i] = DVTXOP_L_add(DVTXOP_L_mpy_ls(Out[i], beta), DVTXOP_L_mpy_ls(In[i], alpha));
		max = max > Out[i] ? max : Out[i];
	}
	qtmp = DVTXOP_norm_l(max) - 1;
	if (qtmp > 0)
	{
		qOut_new += qtmp;
		for (i = 0; i < Nbin; i++) Out[i] = DVTXOP_L_shl(Out[i], qtmp);
	}

	return qOut_new;
}
#else
void Right_Shift32x2(int * in, int * out, int shift, int len)
{
	int i;
	ae_valign align1, align2;
	ae_int32x2 *pt1, *pt2;
	ae_int32x2 A;
	pt1=(ae_int32x2 *)in;
	pt2=(ae_int32x2 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=2)
	{
		AE_LA32X2_IP(A, align1, pt1);
		A = AE_SRAA32S(A, shift);
		AE_SA32X2_IP(A, align2, pt2);
	}
	AE_SA64POS_FP(align2, pt2);
}
void Left_Shift32x2(int * in, int * out, int shift, int len) // in(i ), out(out)
{
	int i;
	ae_valign align1, align2;
	ae_int32x2 *pt1, *pt2;
	ae_int32x2 A;
	pt1=(ae_int32x2 *)in;
	pt2=(ae_int32x2 *)out;
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	for (i = 0; i < len; i+=2)
	{
		AE_LA32X2_IP(A, align1, pt1);
		A = AE_SLAA32S(A, shift);
		AE_SA32X2_IP(A, align2, pt2);
	}
	AE_SA64POS_FP(align2, pt2);
}
short fltfn_RecursiveVectorAvg_q(int *Out, short qOut, int *In, short qIn, short Nbin, int beta)
{
	short i;
	short qOut_new, qtmp;
	int alpha, max;

	alpha = 0x7fffffffL - beta;
	//alpha = 0x7fff - beta;
	qOut_new = qOut;

	qtmp = qOut - qIn;
	if (qtmp > 0)
	{
		qOut_new = qIn;
		Right_Shift32x2(Out, Out, qtmp, Nbin);
	}
	else if (qtmp < 0)
	{
		qtmp = -qtmp;
		Right_Shift32x2(In, In, qtmp, Nbin);
	}
	/*for (max = 0, i = 0; i < Nbin; i++)
	{
		Out[i] = DVTXOP_L_add(DVTXOP_L_mpy_ll(beta, Out[i]), DVTXOP_L_mpy_ll(alpha, In[i]));
		max = max > Out[i] ? max : Out[i];
	}*/
	ae_int32x2 *pOut_in, *pOut_out, *pIn;
	ae_valign align_Out_in, align_Out_out, align_In;
	pOut_in = pOut_out = (ae_int32x2 *)&Out[0];
	pIn = (ae_int32x2 *)&In[0];
	align_In = AE_LA64_PP(pIn);
	align_Out_in = AE_LA64_PP(pOut_in);
	align_Out_out = AE_ZALIGN64();
	ae_int32x2 Lbeta = AE_MOVDA32(beta);
	ae_int32x2 Lalpha = AE_MOVDA32(alpha);
	ae_int32x2 Ltmp1, Ltmp2, Ltmp3;
	ae_int64 LLtmp1, LLtmp2;
	ae_int32x2 mask = AE_MOVDA32X2(0xfffffffe, 0xfffffffe);
	ae_int32x2 Lmax = AE_MOVDA32(0);

	for(i = 0; i < Nbin; i += 2)
	{
		AE_LA32X2_IP(Ltmp1, align_Out_in, pOut_in);
		//DVTXOP_L_mpy_ll Ltmp1 * Lbeta = Ltmp2
		Ltmp1 = AE_AND32(Ltmp1, mask);
		Ltmp2 = AE_AND32(Lbeta, mask);
		LLtmp1 = AE_MUL32_LL(Ltmp1, Ltmp2);
		LLtmp2 = AE_MUL32_HH(Ltmp1, Ltmp2);
		LLtmp1 = AE_SLAI64S(LLtmp1, 1);
		LLtmp2 = AE_SLAI64S(LLtmp2, 1);
		Ltmp2 = AE_TRUNCI32X2F64S(LLtmp2, LLtmp1,0);

		AE_LA32X2_IP(Ltmp1, align_In, pIn);
		//DVTXOP_L_mpy_ll Ltmp1 * Lalpha= Ltmp3
		Ltmp1 = AE_AND32(Ltmp1, mask);
		Ltmp3 = AE_AND32(Lalpha, mask);
		LLtmp1 = AE_MUL32_LL(Ltmp1, Ltmp3);
		LLtmp2 = AE_MUL32_HH(Ltmp1, Ltmp3);
		LLtmp1 = AE_SLAI64S(LLtmp1, 1);
		LLtmp2 = AE_SLAI64S(LLtmp2, 1);
		Ltmp3 = AE_TRUNCI32X2F64S(LLtmp2, LLtmp1,0);

		Ltmp1 = AE_ADD32S(Ltmp2, Ltmp3);
		AE_SA32X2_IP(Ltmp1, align_Out_out, pOut_out);
		Lmax = AE_MAX32(Lmax, Ltmp1);
	}
	AE_SA64POS_FP(align_Out_out, pOut_out);
	Ltmp1 = AE_SEL32_LH(Lmax, Lmax);
	Ltmp2 = AE_MAX32(Lmax, Ltmp1);
	max = AE_MOVAD32_H(Ltmp2);

	qtmp = DVTXOP_norm_l(max) - 1;
	if (qtmp > 0)
	{
		qOut_new += qtmp;
		Left_Shift32x2(Out, Out, qtmp, Nbin);
	}
	return qOut_new;
}
#endif
#ifndef fltfn_FreqBinGain_OPT_DSP
void fltfn_FreqBinGain(short *X, int *G, short Nbin) //G in Q28
{
	short i;
	int L_tmp;

	for (i = 1; i < Nbin; i++)
	{
		L_tmp = DVTXOP_L_mpy_ls(G[i], X[2 * i]);
		X[2 * i] = DVTXOP_saturate(DVTXOP_L_shr(L_tmp, 13));
		L_tmp = DVTXOP_L_mpy_ls(G[i], X[2 * i + 1]);
		X[2 * i + 1] = DVTXOP_saturate(DVTXOP_L_shr(L_tmp, 13));
	}
}
#else
void fltfn_FreqBinGain(short *X, int *G, short Nbin) //G in Q28
{
	short i;
	int L_tmp;
	ae_int32x2 *ptG, L_tmp1, L_tmp2,G1;
	ae_int16x4 *ptX, *ptout, A1;
    ae_valign align1, align2, align3;
	ae_int64   tmpLL1, tmpLL2;
	ae_int32x2 mask = AE_MOVDA32X2(0xfffffffe, 0xfffffffe);
/*
	for (i = 1; i < Nbin; i++)
	{
		G[i] =  5000000 + i*100000;
		X[2 * i] = i*100;
		X[2 * i + 1] = i*100 + 500;
	}
*/
	ptX =(ae_int16x4 *)(&X[2]);
	ptout =(ae_int16x4 *)(&X[2]);
	ptG =(ae_int32x2 *)&(G[1]);
	align1 = AE_LA64_PP(ptX);
	align2 = AE_LA64_PP(ptG);
	align3 = AE_ZALIGN64();
	for (i = 1; i < Nbin - 1; i+=2)
	{
	    AE_LA16X4_IP(A1, align1, ptX);
		AE_LA32X2_IP(G1, align2, ptG);

		G1 = AE_AND32(G1, mask);

		tmpLL1 = AE_MUL32X16_H3(G1, A1);
		tmpLL2 = AE_MUL32X16_H2(G1, A1);
		L_tmp1 = AE_TRUNCI32X2F64S(tmpLL1, tmpLL2, 4);

		tmpLL1 = AE_MUL32X16_L1(G1, A1);
		tmpLL2 = AE_MUL32X16_L0(G1, A1);
		L_tmp2 = AE_TRUNCI32X2F64S(tmpLL1, tmpLL2, 4);
		A1 = AE_SAT16X4(L_tmp1, L_tmp2);
		AE_SA16X4_IP(A1, align3, ptout);

	}
	AE_SA64POS_FP(align3, ptout);

	L_tmp = DVTXOP_L_mpy_ls(G[255], X[2 * 255]);
	X[2 * 255] = DVTXOP_saturate(DVTXOP_L_shr(L_tmp, 13));
	L_tmp = DVTXOP_L_mpy_ls(G[255], X[2 * 255 + 1]);
	X[2 * 255 + 1] = DVTXOP_saturate(DVTXOP_L_shr(L_tmp, 13));
}
#endif

#ifndef fltfn_LTSV_VAD_modify
// bit -matched C code
int fltfn_LTSV_VAD(int SxMtx[][DVTX_M_LTSV_R], int *phxix, int *XX, short BLK_NORM, short Ksrt, short Nltsvbin, short R, short ColomnIndex)
{
	short i, j, q_tmp;
	int L_tmp, tmpsum, A, A2, phxix_tmp, phxixbar, LTSV;

	for (i = 0; i < Nltsvbin; i++) SxMtx[i][ColomnIndex] = DVTXOP_L_shl(XX[i + Ksrt], 5 - (2 * BLK_NORM + 1));

	for (i = 0; i < Nltsvbin; i++)
	{
		tmpsum = 0;
		for (j = 0; j < R; j++)
		{
			tmpsum = DVTXOP_L_add(tmpsum, SxMtx[i][j]);
		}
		if (tmpsum == 0) tmpsum = 1024;
		q_tmp = DVTXOP_norm_l(tmpsum);
		tmpsum = DVTXOP_L_shl(tmpsum, q_tmp);
		tmpsum = DVTXOP_L_divide(0x3fffffff, tmpsum);
		phxix_tmp = 0;
		for (j = 0; j < R; j++)
		{
			A = DVTXOP_L_shl(DVTXOP_L_mult_r(DVTXOP_L_shl(SxMtx[i][j], q_tmp), tmpsum), 1); //Q31
			if (A < 268435456)//268435456 is 0.125 in Q31
			{
				A = DVTXOP_L_shl(A, 3);
				A2 = DVTXOP_L_mult_r(A, A);
				L_tmp = DVTXOP_L_mult_r(A2, -109589559); //-109589559 is -104.512748 in Q20
				L_tmp = DVTXOP_L_add(L_tmp, DVTXOP_L_mult_r(A, 289983567)); //289983567 is 34.568735 in Q23
				L_tmp = DVTXOP_L_add(L_tmp, -389882300); //389882300 is -5.809699 in Q26
				L_tmp = DVTXOP_L_mult_r(L_tmp, A); //Q29
			}
			//else if(858993459) //858993459 is 0.4 in Q31
			else if (A < 858993459)
			{
				A = DVTXOP_L_shl(A, 1);
				A2 = DVTXOP_L_mult_r(A, A);
				L_tmp = DVTXOP_L_mult_r(A2, 388821510); //388821510 is 2.896946 in Q27
				L_tmp = DVTXOP_L_add(L_tmp, DVTXOP_L_mult_r(A, -550334024)); //-550334024 is -2.050154 in Q28
				L_tmp = DVTXOP_L_add(L_tmp, -95735357); //-95735357 is -0.178321 in Q29
			}
			else
			{
				A2 = DVTXOP_L_mult_r(A, A);
				L_tmp = DVTXOP_L_mult_r(A2, 569003710); //569003710 is 1.059852 in Q29
				L_tmp = DVTXOP_L_add(L_tmp, DVTXOP_L_mult_r(A, -313408059)); //-313408059 is -0.583768 in Q29
				L_tmp = DVTXOP_L_add(L_tmp, -252955320); //-252955320 is -0.471166 in Q29
			}
			L_tmp = DVTXOP_L_shr(L_tmp, 3);
			phxix_tmp = DVTXOP_L_sub(phxix_tmp, L_tmp); //Q26
		}
		phxix[i] = phxix_tmp;
	}

	phxixbar = 0;
	for (i = 0; i < Nltsvbin; i++)
	{
		phxixbar = DVTXOP_L_add(phxixbar, DVTXOP_L_shr(phxix[i], 6)); //Q20
	}
	phxixbar = DVTXOP_L_mult_r(1216273924, phxixbar); //Q26, 1216273924 is 1/113 in Q37

	LTSV = 0;
	for (i = 0; i < Nltsvbin; i++)
	{
		L_tmp = phxix[i] - phxixbar;
		LTSV = DVTXOP_L_add(LTSV, DVTXOP_L_mult_r(L_tmp, L_tmp)); //Q21
	}
	LTSV = DVTXOP_L_mult_r(584363259, LTSV); //Q27, 584363259 is (1/113)/(log2(e)^2) in Q37

	return LTSV; //Q27
}

#else
int fltfn_LTSV_VAD(int SxMtx[][DVTX_M_LTSV_R], int *phxix, int *XX, short BLK_NORM, short Ksrt, short Nltsvbin, short R, short ColomnIndex)
{
	short i, j, q_tmp;
	int L_tmp, tmpsum, A, A2, phxix_tmp, phxixbar, LTSV;

	for (i = 0; i < Nltsvbin; i++) SxMtx[i][ColomnIndex] = DVTXOP_L_shl(XX[i + Ksrt], 5 - (2 * BLK_NORM + 1));

	for (i = 0; i < Nltsvbin; i++)
	{
		{
			ae_f32x2 ae_Ltmp1, ae_Ltmp2;
			ae_f32x2 *ae_Lp1;
			ae_valign Lalign1;
			xtbool2 bool2_1;

			ae_Lp1 = (ae_f32x2 *)&SxMtx[i][0]; Lalign1 = AE_LA64_PP(ae_Lp1);
			ae_Ltmp2 = AE_ZERO32();
			for (j = 0; j < R; j+=2)
			{
				AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1);
				ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
			}
			ae_Ltmp1 = AE_SEL32_LH(ae_Ltmp2, ae_Ltmp2);
			ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
			bool2_1 = AE_EQ32(ae_Ltmp2, AE_ZERO32());
			AE_MOVT32X2(ae_Ltmp2, AE_MOVDA32(1024), bool2_1);
			tmpsum = AE_MOVAD32_L(ae_Ltmp2);
		}

		q_tmp = DVTXOP_norm_l(tmpsum);
		tmpsum = DVTXOP_L_shl(tmpsum, q_tmp);
		tmpsum = DVTXOP_L_divide(0x3fffffff, tmpsum);

		{
			ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3;
			ae_f32x2 ae_Ltmp4, ae_Ltmp5;
			ae_f32x2 ae_Ltmp6, ae_Ltmp7, ae_Ltmp8;
			ae_f32x2 *ae_Lp1;
			ae_valign Lalign1;
			xtbool2 bool2_1, bool2_2;

			ae_Lp1 = (ae_f32x2 *)&SxMtx[i][0]; Lalign1 = AE_LA64_PP(ae_Lp1);
			ae_Ltmp2 = AE_ZERO32();
			ae_Ltmp3 = AE_MOVDA32(tmpsum);
			for (j = 0; j < R; j+=2)
			{
				AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1);
				ae_Ltmp1 = AE_SLAA32S(ae_Ltmp1, q_tmp);
				ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp3);
				ae_Ltmp1 = AE_SLAI32S(ae_Ltmp1, 1); //A

				ae_Ltmp4 = AE_SLAI32S(ae_Ltmp1, 3); //A in branch 1
				ae_Ltmp6 = AE_MULFP32X2RAS(ae_Ltmp4, ae_Ltmp4);
				ae_Ltmp6 = AE_MULFP32X2RAS(ae_Ltmp6, AE_MOVDA32(-109589559));
				AE_MULAFP32X2RAS(ae_Ltmp6, ae_Ltmp4, AE_MOVDA32(289983567));
				ae_Ltmp6 = AE_ADD32S(ae_Ltmp6, AE_MOVDA32(-389882300));
				ae_Ltmp6 = AE_MULFP32X2RAS(ae_Ltmp6, ae_Ltmp4);

				ae_Ltmp5 = AE_SLAI32S(ae_Ltmp1, 1); //A in branch 2
				ae_Ltmp7 = AE_MULFP32X2RAS(ae_Ltmp5, ae_Ltmp5);
				ae_Ltmp7 = AE_MULFP32X2RAS(ae_Ltmp7, AE_MOVDA32(388821510));
				AE_MULAFP32X2RAS(ae_Ltmp7, ae_Ltmp5, AE_MOVDA32(-550334024));
				ae_Ltmp7 = AE_ADD32S(ae_Ltmp7, AE_MOVDA32(-95735357));

				ae_Ltmp8 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp1);
				ae_Ltmp8 = AE_MULFP32X2RAS(ae_Ltmp8, AE_MOVDA32(569003710));
				AE_MULAFP32X2RAS(ae_Ltmp8, ae_Ltmp1, AE_MOVDA32(-313408059));
				ae_Ltmp8 = AE_ADD32S(ae_Ltmp8, AE_MOVDA32(-252955320));

				bool2_1 = AE_LT32(ae_Ltmp1, AE_MOVDA32(268435456));
				bool2_2 = AE_LT32(ae_Ltmp1, AE_MOVDA32(858993459));
				AE_MOVF32X2(ae_Ltmp6, ae_Ltmp7, bool2_1);
				AE_MOVF32X2(ae_Ltmp6, ae_Ltmp8, bool2_2);

				ae_Ltmp6 = AE_SRAI32(ae_Ltmp6, 3);
				ae_Ltmp2 = AE_SUB32S(ae_Ltmp2, ae_Ltmp6);
			}
			ae_Ltmp1 = AE_SEL32_LH(ae_Ltmp2, ae_Ltmp2);
			ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
			phxix_tmp = AE_MOVAD32_L(ae_Ltmp2);
		}
		phxix[i] = phxix_tmp;
	}

	{
		ae_f32x2 ae_Ltmp1, ae_Ltmp2;
		ae_f32x2 *ae_Lp1;
		ae_valign Lalign1;

		ae_Lp1 = (ae_f32x2 *)&phxix[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
		ae_Ltmp2 = AE_ZERO32();
		for (i = 0; i < 56; i++)
		{
			AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1);
			ae_Ltmp1 = AE_SRAI32(ae_Ltmp1, 6);
			ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
		}
		ae_Ltmp1 = AE_SEL32_LH(ae_Ltmp2, ae_Ltmp2);
		ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
		phxixbar = AE_MOVAD32_L(ae_Ltmp2);
		phxixbar = DVTXOP_L_add(phxixbar, DVTXOP_L_shr(phxix[112], 6));
		phxixbar = DVTXOP_L_mult_r(1216273924, phxixbar); //Q26, 1216273924 is 1/113 in Q37
	}

	{
		ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3;
		ae_f32x2 *ae_Lp1;
		ae_valign Lalign1;

		ae_Lp1 = (ae_f32x2 *)&phxix[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
		ae_Ltmp2 = AE_ZERO32();
		ae_Ltmp3 = AE_MOVDA32(phxixbar);
		for (i = 0; i < 56; i++)
		{
			AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1);
			ae_Ltmp1 = AE_SUB32S(ae_Ltmp1, ae_Ltmp3);
			ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp1);
			ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
		}
		ae_Ltmp1 = AE_SEL32_LH(ae_Ltmp2, ae_Ltmp2);
		ae_Ltmp2 = AE_ADD32S(ae_Ltmp2, ae_Ltmp1);
		LTSV = AE_MOVAD32_L(ae_Ltmp2);
		L_tmp = AE_SUB32S_scalar(phxix[112], phxixbar);
		LTSV = DVTXOP_L_add(LTSV, DVTXOP_L_mult_r(L_tmp, L_tmp)); //Q21
		LTSV = DVTXOP_L_mult_r(584363259, LTSV); //Q27, 584363259 is (1/113)/(log2(e)^2) in Q37
	}
	return LTSV; //Q27
}
#endif



#ifndef fltfn_unbiasedMMSE_Npsd_SPP_modify
void fltfn_unbiasedMMSE_Npsd_SPP(int *XX, int *Npsd, short BLK_NORM, int *Npsdfast, short *pH1avg, short *pH1, int *postSNR, short Nbin, short Flag_FrmNoiseFree, short Flag_NoiseOnly, short VAD_LTSVgsc_multiFlag, short Flag_Tx_silent_mode_BF, short debug, VADACCStatus *VADACC_buf)
{
	short tmp, i, q1, qXX;
	int Ltmp, xi, rl, alpha, beta;

	qXX = 2 * BLK_NORM + 1;
	for (i = 0; i < Nbin; i++)
	{
		q1 = DVTXOP_norm_l(Npsd[i]);
		Ltmp = DVTXOP_L_shl(Npsd[i], q1);
		tmp = DVTXOP_div_s((short)0x3fff, DVTXOP_extract_h(Ltmp));
		Ltmp = DVTXOP_Ls_mult_r(XX[i], tmp); //Q(qXX+38-q1-16) = Q(qXX + 22 - q1)
		Ltmp = DVTXOP_L_shr(Ltmp, qXX - q1 + 19); //Q3
		Ltmp = DVTX_MIN(DVTX_MAX(Ltmp, 1), 127);
		pH1[i] = spptable_BF[Ltmp - 1];
	}

	for (i = 0; i < Nbin; i++)
	{
		pH1avg[i] = DVTXOP_extract_h(DVTXOP_L_add(DVTXOP_L_mult(pH1avg[i], 29491), DVTXOP_L_mult(pH1[i], 3277))); //Q15
		if (pH1avg[i] >= DVTX_WORD16_0_99 && pH1[i] > DVTX_WORD16_0_99) pH1[i] = DVTX_WORD16_0_99;
		Ltmp = DVTXOP_L_shr(DVTXOP_L_mult_r(XX[i], DVTXOP_L_sub(2147483647, DVTXOP_L_deposit_h(pH1[i]))), qXX - 8);
		Npsdfast[i] = DVTXOP_L_add(Ltmp, DVTXOP_L_mult_r(Npsdfast[i], DVTXOP_L_deposit_h(pH1[i])));
	}

	if (Flag_Tx_silent_mode_BF == 1) beta = 1503238553; //0.7
	else beta = 1825361099;//0.92
	//beta = 1825361099;//Q31, 0.85	       
		
	if (VADACC_buf->VADACCframe_Fast == 0 || VAD_LTSVgsc_multiFlag==0)
	{
		alpha = DVTXOP_L_sub(2147483647, beta);
		for (i = 0; i < Nbin; i++)
		{
			Npsd[i] = DVTXOP_L_add(DVTXOP_L_mult_r(Npsd[i], beta), DVTXOP_L_mult_r(Npsdfast[i], alpha));
			if (Npsd[i] < 4) Npsd[i] = 4;
		}

		if ((Flag_FrmNoiseFree == 1) || (Flag_NoiseOnly == 1))
		{
			beta = 2126008811; alpha = DVTXOP_L_sub(2147483647, beta);
			for (i = 0; i < Nbin; i++)
			{
				Ltmp = DVTXOP_L_shr(DVTXOP_L_mult_r(XX[i], alpha), qXX - 8);
				Npsd[i] = DVTXOP_L_add(Ltmp, DVTXOP_L_mult_r(Npsd[i], beta));
				if (Npsd[i] < 4) Npsd[i] = 4;
			}
		}
	}

#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	if (debug == 1)
	{
		for (i = 0; i < Nbin; i++)
		{
			fprintf(fp_deg_2micBF[3], "%ld %ld %d\n", postSNR[i], Npsdfast[i], pH1[i]);
		}
	}
#endif
#endif


	return;
}
#else
void fltfn_unbiasedMMSE_Npsd_SPP(int *XX, int *Npsd, short BLK_NORM, int *Npsdfast, short *pH1avg, short *pH1, int *postSNR, short Nbin, short Flag_FrmNoiseFree, short Flag_NoiseOnly, short VAD_LTSVgsc_multiFlag, short Flag_Tx_silent_mode_BF, short debug, VADACCStatus *VADACC_buf)
{
	short tmp, i, q1, qXX;
	int Ltmp, xi, rl, alpha, beta;

	qXX = 2 * BLK_NORM + 1;

	{
		short tmpq1, tmpq2;
		ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3;
		ae_f32x2 ae_min, ae_max;
		ae_f64 ae_LLtmp;
		ae_f32x2 *ae_Lp1, *ae_Lp2;
		ae_valign Lalign1, Lalign2;

		ae_min = AE_MOVDA32(1); ae_max = AE_MOVDA32(127);
		ae_Lp1 = (ae_f32x2 *)&XX[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
		ae_Lp2 = (ae_f32x2 *)&Npsd[0]; Lalign2 = AE_LA64_PP(ae_Lp2);
		for (i = 0; i < Nbin; i+=2)
		{
			AE_LA32X2_IP(ae_Ltmp1, Lalign2, ae_Lp2); //Npsd[i]
			ae_Ltmp2 = AE_SEL32_LH(ae_Ltmp1, ae_Ltmp1);
			tmpq1 = AE_NSAZ32_L(ae_Ltmp1);
			tmpq2 = AE_NSAZ32_L(ae_Ltmp2);
			ae_Ltmp1 = AE_SLAA32S(ae_Ltmp1, tmpq1);
			ae_Ltmp2 = AE_SLAA32S(ae_Ltmp2, tmpq2);
			ae_Ltmp1 = AE_SRAI32(ae_Ltmp1, 16);
			ae_Ltmp2 = AE_SRAI32(ae_Ltmp2, 16);
			//div_s
			ae_Ltmp3 = AE_MOVDA32X2(0x3fff, 0);
			ae_LLtmp = AE_MOVINT64_FROMINT32X2(ae_Ltmp3);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp1);
			ae_Ltmp1 = AE_MOVINT32X2_FROMINT64(ae_LLtmp);
			//div_s
			ae_Ltmp3 = AE_MOVDA32X2(0x3fff, 0);
			ae_LLtmp = AE_MOVINT64_FROMINT32X2(ae_Ltmp3);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			AE_DIV64D32_L(ae_LLtmp, ae_Ltmp2);
			ae_Ltmp2 = AE_MOVINT32X2_FROMINT64(ae_LLtmp);

			ae_Ltmp1 = AE_SEL32_LL(ae_Ltmp2, ae_Ltmp1); //0x3fff/Npsd[i]
			AE_LA32X2_IP(ae_Ltmp2, Lalign1, ae_Lp1); //XX[i]
			ae_Ltmp1 = AE_SLAI32S(ae_Ltmp1, 16);
			ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp2);
			ae_Ltmp2 = AE_SEL32_LH(ae_Ltmp1, ae_Ltmp1);
			ae_Ltmp1 = AE_SRAA32S(ae_Ltmp1, qXX - tmpq1 + 19);
			ae_Ltmp2 = AE_SRAA32S(ae_Ltmp2, qXX - tmpq2 + 19);
			ae_Ltmp1 = AE_MAX32(ae_Ltmp1, ae_min);
			ae_Ltmp1 = AE_MIN32(ae_Ltmp1, ae_max);
			ae_Ltmp2 = AE_MAX32(ae_Ltmp2, ae_min);
			ae_Ltmp2 = AE_MIN32(ae_Ltmp2, ae_max);
			pH1[i] = spptable_BF[AE_MOVAD32_L(ae_Ltmp2) - 1];
			pH1[i + 1] = spptable_BF[AE_MOVAD32_L(ae_Ltmp1) - 1];
		}
	}

	{
		ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3, ae_Ltmp4;
		ae_f16x4 ae_tmp1, ae_tmp2, ae_tmp3, ae_tmp4;
		ae_f32x2 *ae_Lp1, *ae_Lp2, *ae_Lp3;
		ae_f16x4 *ae_p1, *ae_p2, *ae_p3, *ae_p4;
		ae_valign Lalign1, Lalign2, Lalign3;
		ae_valign align1, align2, align3, align4;
		xtbool4 bool4_1;

		ae_p1 = (ae_f16x4 *)&pH1[0]; align1 = AE_LA64_PP(ae_p1);
		ae_p2 = (ae_f16x4 *)&pH1avg[0]; align2 = AE_LA64_PP(ae_p2);
		ae_p3 = (ae_f16x4 *)&pH1[0]; align3 = AE_ZALIGN64();
		ae_p4 = (ae_f16x4 *)&pH1avg[0]; align4 = AE_ZALIGN64();
		ae_Lp1 = (ae_f32x2 *)&XX[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
		ae_Lp2 = (ae_f32x2 *)&Npsdfast[0]; Lalign2 = AE_LA64_PP(ae_Lp2);
		ae_Lp3 = (ae_f32x2 *)&Npsdfast[0]; Lalign3 = AE_ZALIGN64();
		ae_tmp4 = AE_MOVDA16(DVTX_WORD16_0_99);
		for (i = 0; i < Nbin; i+=4)
		{
			AE_LA16X4_IP(ae_tmp1, align1, ae_p1); //pH1[i]
			AE_LA16X4_IP(ae_tmp2, align2, ae_p2); //pH1avg[i]
			AE_MULF16X4SS(ae_Ltmp1, ae_Ltmp2, ae_tmp1, AE_MOVDA16(3277));
			AE_MULAF16X4SS(ae_Ltmp1, ae_Ltmp2, ae_tmp2, AE_MOVDA16(29491));
			ae_tmp2 = AE_TRUNC16X4F32(ae_Ltmp1, ae_Ltmp2); //pH1avg[i] new
			AE_SA16X4_IP(ae_tmp2, align4, ae_p4);
			ae_tmp3 = ae_tmp1;
			bool4_1 = AE_LT16(ae_tmp4, ae_tmp3);
			AE_MOVT16X4(ae_tmp3, ae_tmp4, bool4_1);
			bool4_1 = AE_LE16(ae_tmp4, ae_tmp2);
			AE_MOVT16X4(ae_tmp1, ae_tmp3, bool4_1); //pH1[i] new
			AE_SA16X4_IP(ae_tmp1, align3, ae_p3);
			AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1); //XX[i]
			AE_LA32X2_IP(ae_Ltmp2, Lalign2, ae_Lp2); //Npsdfast[i]
			ae_Ltmp3 = AE_CVT32X2F16_32(ae_tmp1); //DVTXOP_L_deposit_h(pH1[i])
			ae_Ltmp4 = AE_SUB32S(AE_MOVDA32(2147483647), ae_Ltmp3); //DVTXOP_L_sub(2147483647, DVTXOP_L_deposit_h(pH1[i]))
			ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp4);
			ae_Ltmp1 = AE_SRAA32S(ae_Ltmp1, qXX - 8);
			AE_MULAFP32X2RAS(ae_Ltmp1, ae_Ltmp2, ae_Ltmp3); //Npsdfast[i] new
			AE_SA32X2_IP(ae_Ltmp1, Lalign3, ae_Lp3);
			AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1); //XX[i]
			AE_LA32X2_IP(ae_Ltmp2, Lalign2, ae_Lp2); //Npsdfast[i]
			ae_Ltmp3 = AE_CVT32X2F16_10(ae_tmp1); //DVTXOP_L_deposit_h(pH1[i])
			ae_Ltmp4 = AE_SUB32S(AE_MOVDA32(2147483647), ae_Ltmp3); //DVTXOP_L_sub(2147483647, DVTXOP_L_deposit_h(pH1[i]))
			ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp4);
			ae_Ltmp1 = AE_SRAA32S(ae_Ltmp1, qXX - 8);
			AE_MULAFP32X2RAS(ae_Ltmp1, ae_Ltmp2, ae_Ltmp3); //Npsdfast[i] new
			AE_SA32X2_IP(ae_Ltmp1, Lalign3, ae_Lp3);
		}
		AE_SA64POS_FP(align3, ae_p3);
		AE_SA64POS_FP(align4, ae_p4);
		AE_SA64POS_FP(Lalign3, ae_Lp3);

	}
	
	if (Flag_Tx_silent_mode_BF == 1) beta = 1503238553; //0.7
	else beta = 1825361099;//0.94
	//beta = 1825361099;//Q31, 0.85	  
	//1975684956;//0.92

	if (VADACC_buf->VADACCframe_Fast == 0 || VAD_LTSVgsc_multiFlag == 0)
	{
		alpha = DVTXOP_L_sub(2147483647, beta);
		{
			ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3, ae_Ltmp4, ae_Ltmp5;
			ae_f32x2 *ae_Lp1, *ae_Lp2, *ae_Lp3;
			ae_valign Lalign1, Lalign2, Lalign3;

			ae_Ltmp3 = AE_MOVDA32(alpha); ae_Ltmp4 = AE_MOVDA32(beta);
			ae_Ltmp5 = AE_MOVDA32(4);
			ae_Lp1 = (ae_f32x2 *)&Npsdfast[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
			ae_Lp2 = (ae_f32x2 *)&Npsd[0]; Lalign2 = AE_LA64_PP(ae_Lp2);
			ae_Lp3 = (ae_f32x2 *)&Npsd[0]; Lalign3 = AE_ZALIGN64();
			for (i = 0; i < Nbin; i += 2)
			{
				AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1); //Npsdfast[i]
				AE_LA32X2_IP(ae_Ltmp2, Lalign2, ae_Lp2); //Npsd[i]
				ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp3);
				AE_MULAFP32X2RAS(ae_Ltmp1, ae_Ltmp2, ae_Ltmp4);
				ae_Ltmp1 = AE_MAX32(ae_Ltmp1, ae_Ltmp5);
				AE_SA32X2_IP(ae_Ltmp1, Lalign3, ae_Lp3);
			}
			AE_SA64POS_FP(Lalign3, ae_Lp3);
		}

		if ((Flag_FrmNoiseFree == 1) || (Flag_NoiseOnly == 1))
		{
			beta = 2126008811; alpha = DVTXOP_L_sub(2147483647, beta);
			{
				ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3, ae_Ltmp4, ae_Ltmp5;
				ae_f32x2 *ae_Lp1, *ae_Lp2, *ae_Lp3;
				ae_valign Lalign1, Lalign2, Lalign3;

				ae_Ltmp3 = AE_MOVDA32(alpha); ae_Ltmp4 = AE_MOVDA32(beta);
				ae_Ltmp5 = AE_MOVDA32(4);
				ae_Lp1 = (ae_f32x2 *)&XX[0]; Lalign1 = AE_LA64_PP(ae_Lp1);
				ae_Lp2 = (ae_f32x2 *)&Npsd[0]; Lalign2 = AE_LA64_PP(ae_Lp2);
				ae_Lp3 = (ae_f32x2 *)&Npsd[0]; Lalign3 = AE_ZALIGN64();
				for (i = 0; i < Nbin; i += 2)
				{
					AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1); //XX[i]
					AE_LA32X2_IP(ae_Ltmp2, Lalign2, ae_Lp2); //Npsd[i]
					ae_Ltmp1 = AE_MULFP32X2RAS(ae_Ltmp1, ae_Ltmp3);
					ae_Ltmp1 = AE_SRAA32S(ae_Ltmp1, qXX - 8);
					AE_MULAFP32X2RAS(ae_Ltmp1, ae_Ltmp2, ae_Ltmp4);
					ae_Ltmp1 = AE_MAX32(ae_Ltmp1, ae_Ltmp5);
					AE_SA32X2_IP(ae_Ltmp1, Lalign3, ae_Lp3);
				}
				AE_SA64POS_FP(Lalign3, ae_Lp3);
			}
		}
	}
	return;
}
#endif
#ifdef fltfn_NpsdBM_estimation_AVG_ls_vector_OPT_DSP
extern ae_int32x2 fx_SolomonVoice_recursiveAVG_ls_2_vector(ae_int32x2 OldVal, ae_int32x2 NewVal, ae_int16x4 beOld, ae_int16x4 beNew, short shift);
void fltfn_NpsdBM_estimation_vector1(int *NpsdBM, int *G_gsc_bm, int *XXbm, short FFT_HALFLEN, short shift)
{
	int i;
	ae_int32x2 *pG_gsc_bm , *pXXbm, *pNpsdBM_in, *pNpsdBM_out;
	ae_valign align_G_gsc_bm, align_XXbm, align_NpsdBM_in, align_NpsdBM_out;
	ae_int16x4 forgetold, Lbeold, Lbenew;
	ae_int32x2 Ltmpvec, Loldval, Lretval;
	ae_int64 tmp1, tmp2;
	ae_int32x2 mask = AE_MOVDA32X2(0xfffffffe, 0xfffffffe);

	pG_gsc_bm = (ae_int32x2 *)&G_gsc_bm[0];
	pXXbm = (ae_int32x2 *)&XXbm[0];
	pNpsdBM_in = (ae_int32x2 *)&NpsdBM[0];
	pNpsdBM_out = (ae_int32x2 *)&NpsdBM[0];

	align_G_gsc_bm = AE_LA64_PP(pG_gsc_bm);
	align_XXbm = AE_LA64_PP(pXXbm);
	align_NpsdBM_in = AE_LA64_PP(pNpsdBM_in);
	align_NpsdBM_out = AE_ZALIGN64();
	Lbeold = AE_MOVDA16(DVTX_WORD16_0_9);
	Lbenew = AE_MOVDA16(DVTX_WORD16_0_1);

	for (i = 0; i < FFT_HALFLEN; i += 2)
{
		AE_LA32X2_IP(Ltmpvec, align_G_gsc_bm, pG_gsc_bm);
		forgetold = AE_SAT16X4(Ltmpvec, Ltmpvec);
		AE_LA32X2_IP(Ltmpvec, align_XXbm, pXXbm);
		//DVTXOP_L_mpy_ls  Ltmpvec = Ltmpvec X forgetold
		Ltmpvec = AE_AND32(Ltmpvec, mask);
		tmp1 = AE_MUL32X16_L0(Ltmpvec, forgetold);
		tmp2 = AE_MUL32X16_H1(Ltmpvec, forgetold);
		tmp1 = AE_SLAI64S(tmp1, 17);
		tmp2 = AE_SLAI64S(tmp2, 17);
		Ltmpvec = AE_TRUNCI32X2F64S(tmp2, tmp1,0);
		Ltmpvec = AE_SLAA32S(Ltmpvec, 4);
		AE_LA32X2_IP(Loldval, align_NpsdBM_in, pNpsdBM_in);
		//fx_SolomonVoice_recursiveAVG_ls_2_vector();

		Lretval = fx_SolomonVoice_recursiveAVG_ls_2_vector(Loldval, Ltmpvec, Lbeold, Lbenew, shift);
		AE_SA32X2_IP(Lretval, align_NpsdBM_out, pNpsdBM_out);
	}
	AE_SA64POS_FP(align_NpsdBM_out, pNpsdBM_out);
}
#endif

// this function is not used
void fltfn_NpsdBM_estimation(int *NpsdBM, int *G_gsc_bm, short *pH1gsc, int *PwrXXgsc, int * XXgsc, int *PwrXXbm, int *XXbm, short BLK_NORM_Outer1, int *tmpvec256B, short FFT_HALFLEN, FRAMEStatus *FRAME_buf)
{
	short i, forgetOld, forgetNew, forgetOld1;

	//if (0&&(FRAME_buf->STATE_Voice_Active==0) && (FRAME_buf->STATE_ACC_Effective==1)) //<-°¡¼Óµµ ¼¾¼­ ½ÅÈ£ ¾øÀ» ½Ã ¿µÇâ ¹ÞÀ½	
	//{
	//	forgetOld = 30000; //(7+pH1[i])/8;
	//	forgetNew = DVTXOP_sub(DVTX_MAX_16, forgetOld);
	//	for (i = 0; i < FFT_HALFLEN; i++)
	//	{	
	//		/*30,1 -> 15,16*/
	//		PwrXXgsc[i] = fx_SolomonVoice_recursiveAVG_ls(PwrXXgsc[i], XXgsc[i], forgetOld, forgetNew, BLK_NORM_Outer1, (8 - 1));//Q(8)
	//		PwrXXbm[i]  = fx_SolomonVoice_recursiveAVG_ls(PwrXXbm[i],  XXbm[i],  forgetOld, forgetNew, BLK_NORM_Outer1, (8 - 1));//Q(8)
	//		if (PwrXXgsc[i] < 4) PwrXXgsc[i] = 4;
	//		if (PwrXXbm[i] < 4) PwrXXbm[i] = 4;

	//		tmpvec256B[i] = (fx_SolomonVoice_32bit_Divide(PwrXXgsc[i], PwrXXbm[i], 1, 20)); //Q31.11(=31-20)
	//		G_gsc_bm[i] = DVTXOP_L_add(DVTXOP_L_mpy_ls(G_gsc_bm[i], DVTX_WORD16_0_9), DVTXOP_L_mpy_ls(tmpvec256B[i], DVTX_WORD16_0_1));
	//	}
	//}
	//else
	//{
	if (FRAME_buf->STATE_Voice_Active == 0)
	{
		for (i = 0; i < FFT_HALFLEN; i++)
		{
			forgetOld = DVTXOP_add(DVTXOP_shr_r(pH1gsc[i], 3), 28671); //(7+pH1[i])/8;			
			forgetNew = DVTXOP_sub(DVTX_MAX_16, forgetOld);
			/*30,1 -> 15,16*/
			PwrXXgsc[i] = fx_SolomonVoice_recursiveAVG_ls(PwrXXgsc[i], XXgsc[i], forgetOld, forgetNew, BLK_NORM_Outer1, (8 - 1));//Q(8)
			PwrXXbm[i] = fx_SolomonVoice_recursiveAVG_ls(PwrXXbm[i], XXbm[i], forgetOld, forgetNew, BLK_NORM_Outer1, (8 - 1));//Q(8)
			if (PwrXXgsc[i] < 4) PwrXXgsc[i] = 4;
			if (PwrXXbm[i] < 4) PwrXXbm[i] = 4;

			tmpvec256B[i] = (fx_SolomonVoice_32bit_Divide(PwrXXgsc[i], PwrXXbm[i], 1, 20)); //Q31.11(=31-20)
			G_gsc_bm[i] = DVTXOP_L_add(DVTXOP_L_mpy_ls(G_gsc_bm[i], DVTX_WORD16_0_9), DVTXOP_L_mpy_ls(tmpvec256B[i], DVTX_WORD16_0_1));
		}
	}
#ifndef fltfn_NpsdBM_estimation_loop1
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		forgetOld = DVTXOP_saturate(G_gsc_bm[i]);//Q11
		tmpvec256B[i] = DVTXOP_L_shl(DVTXOP_L_mpy_ls(XXbm[i], forgetOld), 4); //XXbm*Geq
		NpsdBM[i] = fx_SolomonVoice_recursiveAVG_ls(NpsdBM[i], tmpvec256B[i], DVTX_WORD16_0_9, DVTX_WORD16_0_1, BLK_NORM_Outer1, (8 - 1));//Q(8)								
	}
#else
	for (i = 0; i < FFT_HALFLEN; i += 2)
	{
		int tmpvec[2];
		forgetOld = DVTXOP_saturate(G_gsc_bm[i]);//Q11
		forgetOld1 = DVTXOP_saturate(G_gsc_bm[i + 1]);//Q11
		tmpvec[0] = DVTXOP_L_shl(DVTXOP_L_mpy_ls(XXbm[i], forgetOld), 4); //XXbm*Geq
		tmpvec[1] = DVTXOP_L_shl(DVTXOP_L_mpy_ls(XXbm[i + 1], forgetOld1), 4); //XXbm*Geq
		fx_SolomonVoice_recursiveAVG_ls_2(&NpsdBM[i], tmpvec, DVTX_WORD16_0_9, DVTX_WORD16_0_1, BLK_NORM_Outer1, (8 - 1));//Q(8)
	}
#endif
}

int fltfn_NpsdBM_Npsdgsc_Mixing(int *NpsdBFout, int *Npsdgsc, int *NpsdBM, int THDnoisepwr, int THDnoisdPSDmask, short FFT_HALFLEN)
{
	int PwrNoisePwr;
	short i;
	
	PwrNoisePwr = 0;
	for (i = 5; i < FFT_HALFLEN; i++)
	{
		PwrNoisePwr = DVTXOP_L_add(PwrNoisePwr, Npsdgsc[i]);
	}
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		NpsdBFout[i] = Npsdgsc[i];
		NpsdBM[i] = Npsdgsc[i];
		}

//	if (PwrNoisePwr < THDnoisepwr) // THD = 10^(55/10) noise free~noise1´Ü°è
//	{
//#ifndef OPT_COPY_FUNC
//	for (i = 0; i < FFT_HALFLEN; i++)
//	{
//		NpsdBFout[i] = Npsdgsc[i];
//	}
//#else
//	//	Fx_vector_copy_s_32(NpsdBFout, Npsdgsc, FFT_HALFLEN);
//	__vec_memcpy(NpsdBFout, Npsdgsc, (FFT_HALFLEN << 2));
//#endif
//	}
//	else
//	{
//		for (i = 0; i < FFT_HALFLEN; i++)
//		{
//			if (Npsdgsc[i] < THDnoisdPSDmask)
//				NpsdBFout[i] = Npsdgsc[i];
//			else
//				NpsdBFout[i] = NpsdBM[i];
//		}
//
//	}

	return PwrNoisePwr;
}

int fltfn_Npsd_Under_Eatimation(int *NpsdBFout, short under_est_factor, short FFT_HALFLEN)
{
	short i;
		
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		NpsdBFout[i] = DVTXOP_L_mpy_ls(NpsdBFout[i], under_est_factor);
	}

}


short PowerRatio2Gain(int a, int b, short q_diff)
{
	short qa, qb;
	short sa, sb, ratio;
	if (a == 0) return 0;
	if (b == 0) return 20480;
	qa = DVTXOP_norm_l(a); a = DVTXOP_L_shl(a, qa); sa = DVTXOP_extract_h(a);
	qb = DVTXOP_norm_l(b); b = DVTXOP_L_shl(b, qb); sb = DVTXOP_extract_h(b);
	q_diff = q_diff + (qa - 1 - qb);
	ratio = DVTXOP_div_s(DVTXOP_shr(sa, 1), sb); //Q(q_diff + 15)
	if (q_diff & 0x0001)
	{
		q_diff = q_diff - 1; ratio = DVTXOP_shr(ratio, 1);
	}
	ratio = int_sqrt_0_50(((int)ratio) << 16);
	q_diff = (q_diff >> 1) + 15;
	if (q_diff >= 12)
		ratio = DVTXOP_shr(ratio, q_diff - 12);
	else
		ratio = DVTXOP_shl(ratio, 12 - q_diff);
	if (ratio > 20480) ratio = 20480;
	return ratio; //Q12
}
#ifdef FN_BF_loop_DSP_OPT
void PowerRatio2Gain_0(int* av, int* bv, short q_diffc, int*out, int FFT_HALFLEN)
{
	short qa, qb;
	short sa, sb, ratio,q_diff;
    int a,b;
    int ratiov[4];
    short q_diffv[4];
    short ratios[4];
    int i,j;


	for (i = 0; i < (FFT_HALFLEN>>2); i++)
	{
		for(j=0; j< 4; j++)
		{
		   a = av[i*4+j];
		   b = bv[i*4+j];
		   qa = DVTXOP_norm_l(a); a = DVTXOP_L_shl(a, qa); sa = DVTXOP_extract_h(a);
		   qb = DVTXOP_norm_l(b); b = DVTXOP_L_shl(b, qb); sb = DVTXOP_extract_h(b);
		   q_diff = q_diffc + (qa - 1 - qb);
		   ratio = DVTXOP_div_s(DVTXOP_shr(sa, 1), sb); //Q(q_diff + 15)

		   if (q_diff & 0x0001)
		   {
			  q_diff = q_diff - 1; ratio = DVTXOP_shr(ratio, 1);
		   }
		   ratiov[j] = ((int)ratio) << 16;
		   q_diffv[j] = q_diff;
		}

	 	int_sqrt_0_50_four(ratiov,ratios,1);

		for(j=0; j< 4; j++)
		{
			q_diff = q_diffv[j];
			ratio = ratios[j];
			q_diff = (q_diff >> 1) + 15;
			if (q_diff >= 12)
				ratio = DVTXOP_shr(ratio, q_diff - 12);
			else
				ratio = DVTXOP_shl(ratio, 12 - q_diff);
			if (ratio > 20480) ratio = 20480;
			out[i*4+j] = ratio<<16;
		}
	}
}
#endif


#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__

#ifndef fn_BF_PitchEnhance_1_preNS_OPT_DSP

#if 1
void fn_BF_PitchEnhance_1_preNS(/*out*/int *ps, /*in*/int *XXgsc, /*in*/int *Npsdgsc, short BLK_NORM, SamsungSolomonVoiceWTxBFParam* BF_param, VADACCStatus *VADACC_buf, short BLOCK_NORM_ACC)
{
	/*
	(In) XXgsc		=> Q(2*BLK_NORM+1)
	(In) Npsdgsc	=> Q(2*BLK_NORM+1)
	(Out)ps			=> Q15
	*/
	int i;
	int Ltmp, snr_post, snr_ml;
	long long LLtmp;

#ifndef DIVIDE_TEST2
	int *OvrSubFactor = BF_param->OvrSubFactor; //Q15
#else
	short *OvrSubFactor = BF_param->OvrSubFactor; //Q15
#endif

	/*for (i = 0; i < DVTX_M_ACC_MAXFREQ; i++)
	{
		Ltmp = DVTXOP_L_shr(VADACC_buf->XXacc[i], (2 * BLOCK_NORM_ACC + 1) - (2 * BLK_NORM + 1)-1);		
		XXmixing[i] = Ltmp;
	}
	for (i = DVTX_M_ACC_MAXFREQ; i < DVTX_FFT_HALFLEN_WB; i++)
	{		
		XXmixing[i] = XXgsc[i];
	}*/
	
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
#ifndef DIVIDE_TEST2
		//snr_post[i] = XXgsc[i] / (Npsdgsc[i] + 1); // error < 1e-10		
		snr_post = divide(XXgsc[i], 1, Npsdgsc[i], 1, 15);//Q15

		/*if (i < DVTX_M_ACC_MAXFREQ)
			snr_post = VADACC_buf->SNRpostAcc[i];*/
		
		//snr_ml[i] = ((snr_post[i] - OvrSubFactor[i]) > 0.001) ? (snr_post[i] - OvrSubFactor[i]) : 0.001;
		snr_ml = DVTXOP_L_sub(snr_post, OvrSubFactor[i]); //Q15
		snr_ml = DVTX_MAX(snr_ml, 32/*0.001*/); //Q15
		
		//ps[i] = snr_ml[i] * (Npsdgsc[i] + 0.001); // error < 1e-08
		Ltmp = DVTXOP_L_add(Npsdgsc[i], DVTXOP_L_shl(131/*0.001(Q17)*/, (2 * BLK_NORM + 1) - 17)); //Q(2 * BLK_NORM + 1)
		LLtmp = DVTXOP_LL_mult(snr_ml, Ltmp);//Q(2 * BLK_NORM + 1)*Q15=>Q(2 * BLK_NORM + 1 + 15 + 1)
		ps[i] = (int)(DVTXOP_LL_shr(LLtmp, (15 + 1)));//Q(2 * BLK_NORM + 1)


#if(FLAG_SELECT_C_DSP == 1)			
#if(Debug_File_Write_C == 1)
		fprintf(fp_deg_2micBF[13], "%ld %ld %ld %ld %ld\n", DVTXOP_L_shr(XXgsc[i], 2 * BLK_NORM + 1 - 8), DVTXOP_L_shr(Npsdgsc[i], 2 * BLK_NORM + 1 - 8), DVTXOP_L_shr(snr_post, 0), DVTXOP_L_shr(snr_ml, 0),
			DVTXOP_L_shr(ps[i], 2 * BLK_NORM));
#endif
#endif


#else
		Ltmp = DVTXOP_L_mpy_ls(Npsdgsc[i], OvrSubFactor[i]); //Q(2*BLK_NORM+1-2)
		Ltmp = DVTXOP_L_shl(Ltmp, 2); //Q(2*BLK_NORM+1)
		Ltmp = DVTXOP_L_sub(XXgsc[i], Ltmp); //Q(2*BLK_NORM+1)

		Ltmp1 = DVTXOP_L_mpy_ls(Npsdgsc[i], 33);//Q(2*BLK_NORM+1)
		if (Ltmp < Ltmp1)
			ps[i] = Ltmp1;
		else
			ps[i] = Ltmp;
#endif

		if (ps[i] < 1)
			ps[i] = 1;
	}

	return;
}
#else // bit matched C code, but below code is too different. can't use
void fn_BF_PitchEnhance_1_preNS(/*out*/int *ps, /*in*/int *XXgsc, /*in*/int *Npsdgsc, short BLK_NORM, SamsungSolomonVoiceWTxBFParam* BF_param, VADACCStatus *VADACC_buf, short BLOCK_NORM_ACC)
{
	/*
	(In) XXgsc		=> Q(2*BLK_NORM+1)
	(In) Npsdgsc	=> Q(2*BLK_NORM+1)
	(Out)ps			=> Q15
	*/
	int i;
	int Ltmp, Ltmp1, snr_post, snr_ml;
	long long LLtmp;
	short *OvrSubFactor = BF_param->OvrSubFactor; //Q15

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		Ltmp = DVTXOP_Ls_mult_r(Npsdgsc[i], OvrSubFactor[i]); //Q(2*BLK_NORM+1-2)
		Ltmp = DVTXOP_L_shl(Ltmp, 2); //Q(2*BLK_NORM+1)
		Ltmp = DVTXOP_L_sub(XXgsc[i], Ltmp); //Q(2*BLK_NORM+1)
		Ltmp1 = DVTXOP_Ls_mult_r(Npsdgsc[i], 33);//Q(2*BLK_NORM+1)
		if (Ltmp < Ltmp1) ps[i] = Ltmp1;
		else ps[i] = Ltmp;
		if (ps[i] < 1) ps[i] = 1;
	}
	return;
}
#endif



#else
#if 0

#else
#if 0	// hifi opt not bit-exact
void fn_BF_PitchEnhance_1_preNS(/*out*/int *ps, /*in*/int *XXgsc, /*in*/int *Npsdgsc, short BLK_NORM, SamsungSolomonVoiceWTxBFParam* BF_param, VADACCStatus *VADACC_buf, short BLOCK_NORM_ACC)
{
	/*
	(In) XXgsc		=> Q(2*BLK_NORM+1)
	(In) Npsdgsc	=> Q(2*BLK_NORM+1)
	(Out)ps			=> Q15
	*/
	int i;
	int Ltmp, Ltmp1, snr_post, snr_ml;
	long long LLtmp;

	short *OvrSubFactor = BF_param->OvrSubFactor; //Q15
	ae_valign align1,align2,align3,align4;
	ae_int16x4 tmp_con= AE_MOVDA16X2(33,33);
	ae_int32x2 tmp_con1= AE_MOVDA32(1);
	int tmp_shift=AE_MOVDA32(15 - (BLK_NORM + 1));
	ae_int16x4  *p_OvrSubFactor=(ae_int16x4 *)(OvrSubFactor);
	ae_int32x2  *p_Npsdgsc=(ae_int32x2 *)(Npsdgsc);
	ae_int32x2  *p_XXgsc=(ae_int32x2 *)(XXgsc);
	ae_int32x2  *p_ps=(ae_int32x2 *)(ps);
	ae_int16x4 tmp1;
	ae_int32x2 tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;
	align1 = AE_LA64_PP(p_OvrSubFactor);
	align2 = AE_LA64_PP(p_Npsdgsc);
	align3 = AE_LA64_PP(p_XXgsc);
	xtbool2 bool2;
	align4 = AE_ZALIGN64();
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=4)
	{
		AE_LA16X4_IP(tmp1, align1, p_OvrSubFactor);
		AE_LA32X2_IP(tmp2, align2, p_Npsdgsc);
		AE_LA32X2_IP(tmp3, align2, p_Npsdgsc);
		tmp4=AE_MULFP32X16X2RAS_H(tmp2, tmp_con);//Ltmp1 = DVTXOP_Ls_mult_r(Npsdgsc[i], 33);//Q(2*BLK_NORM+1)
		tmp5=AE_MULFP32X16X2RAS_L(tmp3, tmp_con);
		tmp2=AE_MULFP32X16X2RAS_H(tmp2, tmp1);
		tmp3=AE_MULFP32X16X2RAS_L(tmp3, tmp1);
		tmp2=AE_SLAA32S(tmp2, 2);
		tmp3=AE_SLAA32S(tmp3, 2);
		AE_LA32X2_IP(tmp6, align3, p_XXgsc);
		AE_LA32X2_IP(tmp7, align3, p_XXgsc);
		tmp2=AE_SUB32S(tmp6, tmp2);
		tmp3=AE_SUB32S(tmp7, tmp3);//Ltmp
		bool2 = AE_LT32(tmp2, tmp4);//Ýï?£¬do<d1?1
		AE_MOVT32X2(tmp2, tmp4, bool2);//ÐÆËßbool2îÜï×?£¨0ûäíº1£©£¬??ïÒtmpLL3£¬åýÍýbool2?1£¬ö¦?tmpLL2?ð¤?tmpLL3
		bool2 = AE_LT32(tmp3, tmp5);//Ýï?£¬do<d1?1
		AE_MOVT32X2(tmp3, tmp5, bool2);//ÐÆËßbool2îÜï×?£¨0ûäíº1£©£¬??ïÒtmpLL3£¬åýÍýbool2?1£¬ö¦?tmpLL2?ð¤?tmpLL3
		bool2 = AE_LT32(tmp2, tmp_con1);
		AE_MOVT32X2(tmp2, tmp_con1, bool2);
		bool2 = AE_LT32(tmp3, tmp_con1);
		AE_MOVT32X2(tmp3, tmp_con1, bool2);
		AE_SA32X2_IP(tmp2, align4, p_ps);
		AE_SA32X2_IP(tmp3, align4, p_ps);
	}
	AE_SA64POS_FP(align4, p_ps);
	return;
}
#else	// hifi opt bit-exact
void fn_BF_PitchEnhance_1_preNS(/*out*/int *ps, /*in*/int *XXgsc, /*in*/int *Npsdgsc, short BLK_NORM, SamsungSolomonVoiceWTxBFParam* BF_param, VADACCStatus *VADACC_buf, short BLOCK_NORM_ACC)
{
	/*
	(In) XXgsc		=> Q(2*BLK_NORM+1)
	(In) Npsdgsc	=> Q(2*BLK_NORM+1)
	(Out)ps			=> Q15
	*/
	ae_int32x2 *pt0, *pt1, XXv, Npv,L_denomv , L_divv, const1 ;
	ae_valign align0, align1;
	ae_int16x4 approxv;
	int i;
	int Ltmp, snr_post, snr_ml;
	long long LLtmp;

	short n1, n2, n3, n4;
	int var1;
	int var2, const2;
	int ret = 0;
	int signbit = 0;
    int q1, q2, dest_qForm;
	int *OvrSubFactor = BF_param->OvrSubFactor; //Q15

	q1 = 1 ;
	q2 = 1;
	dest_qForm = 15;

	pt0 = (ae_int32x2*)OvrSubFactor;
	align0 = AE_LA64_PP(pt0);
	const1 = AE_MOVDA32(0x7fffffffL);
	const2 = DVTXOP_L_shl(131/*0.001(Q17)*/, (2 * BLK_NORM + 1) - 17);
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+= 2)
	{
        int L_denom0,L_denom1, L_div;
        int L_num0, L_num1, ret0, ret1, snr_ml0, snr_ml1;
        short approx0, approx1;
        ae_int32x2 L_denv, L_tmp0, L_numv, L_tmp1, L_tmp2;
        ae_int16x4 tmps0, tmps1;

        AE_LA32X2_IP(L_tmp0, align0, pt0);

        L_denom0 = Npsdgsc[i];
    	L_denom1 = Npsdgsc[i+1];
    	L_num0 = XXgsc[i];
    	L_num1 = XXgsc[i+1];


		n1 = DVTXOP_norm_l(L_num0);
		n2 = DVTXOP_norm_l(L_denom0);

		n3 = DVTXOP_norm_l(L_num1);
		n4 = DVTXOP_norm_l(L_denom1);


		L_tmp2 = AE_MOVDA32X2(L_denom0, L_denom1);

		L_num0 = L_num0 << (n1 - 1);
		L_denom0 = L_denom0 << n2;
		L_num1 = L_num1 << (n3 - 1);
		L_denom1 = L_denom1 << n4;

		L_numv = AE_MOVDA32X2(L_num0, L_num1);

		//ret = DVTXOP_L_divide(var1, var2);
		approx0 = DVTXOP_div_s((short)0x3fff, DVTXOP_extract_h(L_denom0));
		approx1 = DVTXOP_div_s((short)0x3fff, DVTXOP_extract_h(L_denom1));

		L_denv = AE_MOVDA32X2(L_denom0, L_denom1);
		//tmps0 = AE_MOVDA16X4(approx0);
		//tmps1 = AE_MOVDA16X4(approx1);
		//tmps0 =  AE_SEL16_7362(tmps0, tmps1);
		tmps0 = AE_MOVDA16X2(approx0, approx1);
		/*---------------------------*/
		L_divv = AE_MULFP32X16X2RS_L(L_denv, tmps0);
		L_divv = AE_SUB32S(const1, L_divv);
		L_divv = AE_MULFP32X16X2RS_L(L_divv, tmps0);


		/* L_num * (1/L_denom) */
		L_divv= AE_MULFP32X2RAS(L_numv, L_divv);
		L_divv = AE_SLAA32S(L_divv, 2);

		ret0 = AE_MOVAD32_H(L_divv);
		ret1 = AE_MOVAD32_L(L_divv);

		ret0 = DVTXOP_L_shl(ret0, (short)(dest_qForm - (31 + q1 + n1 - 1 - q2 - n2)));
		ret1 = DVTXOP_L_shl(ret1, (short)(dest_qForm - (31 + q1 + n3 - 1 - q2 - n4)));


		//snr_ml[i] = ((snr_post[i] - OvrSubFactor[i]) > 0.001) ? (snr_post[i] - OvrSubFactor[i]) : 0.001;
		//snr_ml = DVTXOP_L_sub(snr_post, OvrSubFactor[i]); //Q15
		//snr_ml = DVTX_MAX(snr_ml, 32/*0.001*/); //Q15
		L_tmp1 = AE_MOVDA32X2(ret0, ret1);
		L_tmp0 = AE_SUB32S(L_tmp1, L_tmp0);
		L_tmp0 = AE_MAX32(L_tmp0, 32);    //snr_ml



		//ps[i] = snr_ml[i] * (Npsdgsc[i] + 0.001); // error < 1e-08
	//	Ltmp = DVTXOP_L_add(Npsdgsc[i], DVTXOP_L_shl(131/*0.001(Q17)*/, (2 * BLK_NORM + 1) - 17)); //Q(2 * BLK_NORM + 1)
	//	LLtmp = DVTXOP_LL_mult(snr_ml, Ltmp);//Q(2 * BLK_NORM + 1)*Q15=>Q(2 * BLK_NORM + 1 + 15 + 1)
	//	ps[i] = (int)(DVTXOP_LL_shr(LLtmp, (15 + 1)));//Q(2 * BLK_NORM + 1)

		L_tmp2 = AE_ADD32S(L_tmp2, const2);  //Ltmp
		ret0 = AE_MOVAD32_H(L_tmp2);
		ret1 = AE_MOVAD32_L(L_tmp2);

		snr_ml0 = AE_MOVAD32_H(L_tmp0);
		snr_ml1 = AE_MOVAD32_L(L_tmp0);

		LLtmp = DVTXOP_LL_mult(snr_ml0, ret0);//Q(2 * BLK_NORM + 1)*Q15=>Q(2 * BLK_NORM + 1 + 15 + 1)
		ps[i] = (int)(DVTXOP_LL_shr(LLtmp, (15 + 1)));//Q(2 * BLK_NORM + 1)

		if (ps[i] < 1)
			ps[i] = 1;

		LLtmp = DVTXOP_LL_mult(snr_ml1, ret1);//Q(2 * BLK_NORM + 1)*Q15=>Q(2 * BLK_NORM + 1 + 15 + 1)
		ps[i+1] = (int)(DVTXOP_LL_shr(LLtmp, (15 + 1)));//Q(2 * BLK_NORM + 1)

		if (ps[i+1] < 1)
			ps[i+1] = 1;

	}

	return;
}
#endif
#endif

#endif

#ifndef fn_BF_PitchEnhance_2_cepstrum_DSP_OPT
#ifndef HOON_OPT_HIFI
void fn_BF_PitchEnhance_2_cepstrum(/*out*/int *ps_ceps, /*in*/int *ps, short BLK_NORM)
{
	/*
	(IN) ps : Q(2 * BLK_NORM + 1)
	(OUT) ps_ceps : Q(2*BLK_NORM + 1 - 8)
	*/
	int i;
	int ps_log[256]/*[DVTX_FFT_HALFLEN_WB + 1]*/;
	//float tmpFFTvec[DVTX_FFT_LEN_WB] = { 0. };
	
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		//ps_log[i] = (float)log((float)ps[i]); // error < 1e-06
		ps_log[i] = DVTXOP_L_sub(DVTXOP_fnLog10(ps[i]), DVTX_LOG10FIX);//log10(ps[i]) => Q26

		//tmpFFTvec[2 * i] = (float)ps_log[i]; // error < 1e-06
		ps_ceps[2 * i] = DVTXOP_extract_h(ps_log[i]);
		ps_ceps[2 * i + 1] = 0;
	}

	//r_fft(tmpFFTvec, -1);
	Tx_r_fft_512_32b(ps_ceps, -1); //Q(BLK_NORM + 1)

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		ps_ceps[i] = DVTXOP_L_shl(ps_ceps[i], (15 - (BLK_NORM + 1)));//Q15
	}

	return;
}
#else
void fn_BF_PitchEnhance_2_cepstrum(/*out*/int *ps_ceps, /*in*/int *ps, short BLK_NORM)
{
	/*
	(IN) ps : Q(2 * BLK_NORM + 1)
	(OUT) ps_ceps : Q(2*BLK_NORM + 1 - 8)
	*/
	int i;
	int ps_log;
	ae_int32x4 *ps_ceps32x4 = &ps_ceps[0];
	//float tmpFFTvec[DVTX_FFT_LEN_WB] = { 0. };

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		//ps_log[i] = (float)log((float)ps[i]); // error < 1e-06
		ps_log = DVTXOP_L_sub(DVTXOP_fnLog10(ps[i]), DVTX_LOG10FIX);//log10(ps[i]) => Q26

		//tmpFFTvec[2 * i] = (float)ps_log[i]; // error < 1e-06
		ps_ceps[2 * i] = DVTXOP_extract_h(ps_log);
		ps_ceps[2 * i + 1] = 0;
	}

	//r_fft(tmpFFTvec, -1);
	Tx_r_fft_512_32b(ps_ceps, -1); //Q(BLK_NORM + 1)

	for (i = 0; i < (DVTX_FFT_HALFLEN_WB>>2); i++)
	{
		ps_ceps32x4[i] = AE_SLAA32S_vector(ps_ceps32x4[i], (15 - (BLK_NORM + 1)));//Q15
	}

	return;
}
#endif

#else

void fn_BF_PitchEnhance_2_cepstrum(/*out*/int *ps_ceps, /*in*/int *ps, short BLK_NORM)
{
	/*
	(IN) ps : Q(2 * BLK_NORM + 1)
	(OUT) ps_ceps : Q(2*BLK_NORM + 1 - 8)
	*/
	int i, Ltmp;
	int ps_log[256]/*[DVTX_FFT_HALFLEN_WB + 1]*/;
	int sig;
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		sig=ps[i];
		if (sig == 0) //return (-2147483647);
		{
			ps_log[i]=-2147483647;
		}
		else
		{
			sig = DVTXOP_fnLog2(sig);
			ps_log[i] = DVTXOP_L_mpy_ls(sig, 9864);
		}
	}
	{
		ae_int32x2 tmp_con= AE_MOVDA32(DVTX_LOG10FIX);
		ae_int32x2 tmp_con2= AE_MOVDA32(0);
		ae_valign align1,align2;
		ae_int32x2 tmp1,tmp2;
		ae_int32x2  *p_ps_log=(ae_int32x2 *)(ps_log);
		ae_int32x2  *p_ps_ceps=(ae_int32x2 *)(ps_ceps);
		align1 = AE_LA64_PP(p_ps_log);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=2)
		{
			AE_LA32X2_IP(tmp1, align1, p_ps_log);
			tmp1=AE_SUB32S(tmp1, tmp_con);
			tmp1=AE_SRAI32(tmp1, 16);
			tmp2=AE_SEL32_HH(tmp1, tmp_con2);
			tmp1=AE_SEL32_LL(tmp1, tmp_con2);
			AE_SA32X2_IP(tmp2, align2, p_ps_ceps);
			AE_SA32X2_IP(tmp1, align2, p_ps_ceps);
		}
		AE_SA64POS_FP(align2, p_ps_ceps);
	}

	Tx_r_fft_512_32b(ps_ceps, -1); //Q(BLK_NORM + 1)

	{
		short tmp_con=15 - (BLK_NORM + 1);
		//ae_int32x2 tmp_con= AE_MOVDA32(tmp_con);
		ae_valign align1,align2;
		ae_int32x2 tmp1;
		ae_int32x2  *p_ps_ceps=(ae_int32x2 *)(ps_ceps);
		ae_int32x2  *p_ps_ceps_s=(ae_int32x2 *)(ps_ceps);
		align1 = AE_LA64_PP(p_ps_ceps);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=2)
		{
			//ps_ceps[i] = DVTXOP_L_shl(ps_ceps[i], (15 - (BLK_NORM + 1)));//Q15
			AE_LA32X2_IP(tmp1, align1, p_ps_ceps);
			tmp1=AE_SLAA32S(tmp1, tmp_con);
			AE_SA32X2_IP(tmp1, align2, p_ps_ceps_s);
		}
		AE_SA64POS_FP(align2, p_ps_ceps_s);
	}

	return;
}

#endif

#ifndef fn_BF_PitchEnhance_3_pitch_enhencement_DSP_OPT

void fn_BF_PitchEnhance_3_pitch_enhencement(/*out(Q16.15)*/int *ps_cepsavg, /*in(Q16.15)*/int *ps_ceps, short BLK_NORM, BFStatus* BF_buf, SamsungSolomonVoiceWTxBFParam* BF_param, FRAMEStatus *FRAME_buf)
{
	int i;
	int val;	//Q16.15
	short quef_peak;
	short ps_cepsmax;
	short Q;
	short *a_ceps = BF_buf->a_ceps;		//Q0.15
	short *a_cnst;	//Q0.15
	short beta = BF_param->beta;		//Q0.15
	short q1st = BF_param->q1st;		//Q15.0
	short qend = BF_param->qend;		//Q15.0

	short betaA, betaR;

	if(FRAME_buf->STATE_Voice_Active == 1)
		a_cnst = BF_param->a_cnst_VADon;
	else
		a_cnst = BF_param->a_cnst;

	/* coefficient smoothing */
	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		//a_ceps[i] = beta * a_ceps[i] + (1 - beta) * a_cnst[i]; // error < 1e-15
		a_ceps[i] = DVTXOP_add(DVTXOP_mult(beta, a_ceps[i]), DVTXOP_mult(DVTXOP_sub(32767, beta), a_cnst[i]));
	}

	// temporal average to ps_ceps
	if (FRAME_buf->STATE_Voice_Active == 1)
		betaR = 0;
	else
		betaR = 0;
	betaA = DVTXOP_sub(32767, betaR);

	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		BF_buf->ps_cepsHalfFixAvg[i] = DVTXOP_L_add(DVTXOP_Ls_mult_r(BF_buf->ps_cepsHalfFixAvg[i], betaR), DVTXOP_Ls_mult_r(ps_ceps[i], betaA));
	}

	/* find peak */
	val = 0;
	quef_peak = 0;
	for (i = q1st - 1; i < qend; i++)
	{
		if (BF_buf->ps_cepsHalfFixAvg[i] > val)
		{
			quef_peak = i;
			val = BF_buf->ps_cepsHalfFixAvg[i];
		}
	}

	/* pitch enhencement */
	if (FRAME_buf->STATE_ACC_Effective == 1)
	{
		if (FRAME_buf->STATE_Voice_Active == 1)//<-- °¡¼Óµµ ¼¾¼­ ¾øÀ» ½Ã ¿µÇâ ¹ÞÀ½
		{
			ps_cepsmax = quef_peak;
			for (i = ps_cepsmax - 2; i < ps_cepsmax + 2; i++)
				a_ceps[i] = 3276/*0.1*/;
		}
		else
		{
			ps_cepsmax = 1;
		}
	}
	else
	{
		if (val > DVTXOP_L_shr(6000/*0.6 (Q15)*/, BLK_NORM))//<-- °¡¼Óµµ ¼¾¼­ ¾øÀ» ½Ã ¿µÇâ ¹ÞÀ½
		{
			ps_cepsmax = quef_peak;
			for (i = ps_cepsmax - 2; i < ps_cepsmax + 2; i++)
				a_ceps[i] = 3276/*0.1*/;
		}
		else
		{
			ps_cepsmax = 1;
		}
	}
	


#if(FLAG_SELECT_C_DSP == 1)	
#if(Debug_File_Write_C == 1)
	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++)
	{
		fprintf(fp_deg_2micBF[11], "%ld\n", BF_buf->ps_cepsHalfFixAvg[i]);
	}
	fprintf(fp_deg_2micBF[12], "%d %d\n", quef_peak, ps_cepsmax);
#endif
#endif

	/* cepstrum smoothing */
	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		//ps_cepsavg[i] = a_ceps[i] * ps_cepsavg[i] + (1 - a_ceps[i]) * ps_ceps[i];
		ps_cepsavg[i] = DVTXOP_L_add(DVTXOP_Ls_mult_r(ps_cepsavg[i], a_ceps[i]), DVTXOP_Ls_mult_r(BF_buf->ps_cepsHalfFixAvg[i], DVTXOP_sub(32767, a_ceps[i])));
	}
	return;
}
#else
void fn_BF_PitchEnhance_3_pitch_enhencement(/*out(Q16.15)*/int *ps_cepsavg, /*in(Q16.15)*/int *ps_ceps, short BLK_NORM, BFStatus* BF_buf, SamsungSolomonVoiceWTxBFParam* BF_param, FRAMEStatus *FRAME_buf)
{
	int i;
	int val;	//Q16.15
	short quef_peak;
	short ps_cepsmax;
	short Q;
	short *a_ceps = BF_buf->a_ceps;		//Q0.15
	short *a_cnst;	//Q0.15
	short beta = BF_param->beta;		//Q0.15
	short q1st = BF_param->q1st;		//Q15.0
	short qend = BF_param->qend;		//Q15.0

	short betaA, betaR;

	if(FRAME_buf->STATE_Voice_Active == 1)
		a_cnst = BF_param->a_cnst_VADon;
	else
		a_cnst = BF_param->a_cnst;
	/* coefficient smoothing */
	/*
	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		//a_ceps[i] = beta * a_ceps[i] + (1 - beta) * a_cnst[i]; // error < 1e-15
		a_ceps[i] = DVTXOP_add(DVTXOP_mult(beta, a_ceps[i]), DVTXOP_mult(DVTXOP_sub(32767, beta), a_cnst[i]));
	}
	*/
	/* coefficient smoothing */
	{
		short tmp_f=DVTXOP_sub(32767, beta);
		ae_int16x4 tmp1,tmp2,tmp3,tmp4;
		ae_valign align1,align2,align3;
		ae_int16x4  *p_a_ceps=(ae_int16x4 *)(a_ceps);
		ae_int16x4  *p_a_ceps_s=(ae_int16x4 *)(a_ceps);
		ae_int16x4  *p_a_cnst=(ae_int16x4 *)(a_cnst);
		ae_int16x4 tmp_beta= AE_MOVDA16X2(beta,beta);
		ae_int16x4 tmp_ff= AE_MOVDA16X2(tmp_f,tmp_f);
		align1 = AE_LA64_PP(p_a_ceps);
		align2 = AE_LA64_PP(p_a_cnst);
		align3 = AE_ZALIGN64();
		for (i = 0; i < DVTX_FFT_HALFLEN_WB ; i+=4)
		{
			AE_LA16X4_IP(tmp1, align1,p_a_ceps);
			AE_LA16X4_IP(tmp2, align2, p_a_cnst);
			tmp3=AE_MULFP16X4S(tmp_beta, tmp1);
			tmp4=AE_MULFP16X4S(tmp_ff, tmp2);
			tmp3=AE_ADD16S(tmp3, tmp4);
			AE_SA16X4_IP(tmp3, align3, p_a_ceps_s);

		}
		AE_SA64POS_FP(align3, p_a_ceps_s);

		a_ceps[DVTX_FFT_HALFLEN_WB] = DVTXOP_add(DVTXOP_mult(beta, a_ceps[DVTX_FFT_HALFLEN_WB]), DVTXOP_mult(tmp_f, a_cnst[DVTX_FFT_HALFLEN_WB]));
	}

	// temporal average to ps_ceps
	if (FRAME_buf->STATE_Voice_Active == 1)
		betaR = 0;
	else
		betaR = 0;
	betaA = DVTXOP_sub(32767, betaR);

	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		BF_buf->ps_cepsHalfFixAvg[i] = DVTXOP_L_add(DVTXOP_Ls_mult_r(BF_buf->ps_cepsHalfFixAvg[i], betaR), DVTXOP_Ls_mult_r(ps_ceps[i], betaA));
	}

	/* find peak */
	val = 0;
	quef_peak = 0;
	for (i = q1st - 1; i < qend; i++)
	{
		if (BF_buf->ps_cepsHalfFixAvg[i] > val)
		{
			quef_peak = i;
			val = BF_buf->ps_cepsHalfFixAvg[i];
		}
	}

	/* pitch enhencement */
	if (FRAME_buf->STATE_ACC_Effective == 1)
	{
		if (FRAME_buf->STATE_Voice_Active == 1)//<-- °¡¼Óµµ ¼¾¼­ ¾øÀ» ½Ã ¿µÇâ ¹ÞÀ½
		{
			ps_cepsmax = quef_peak;
			for (i = ps_cepsmax - 2; i < ps_cepsmax + 2; i++)
				a_ceps[i] = 3276/*0.1*/;
		}
		else
		{
			ps_cepsmax = 1;
		}
	}
	else
	{
		if (val > DVTXOP_L_shr(6000/*0.6 (Q15)*/, BLK_NORM))//<-- °¡¼Óµµ ¼¾¼­ ¾øÀ» ½Ã ¿µÇâ ¹ÞÀ½
		{
			ps_cepsmax = quef_peak;
			for (i = ps_cepsmax - 2; i < ps_cepsmax + 2; i++)
				a_ceps[i] = 3276/*0.1*/;
		}
		else
		{
			ps_cepsmax = 1;
		}
	}

	/* cepstrum smoothing */
	/*
	for (i = 0; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		//ps_cepsavg[i] = a_ceps[i] * ps_cepsavg[i] + (1 - a_ceps[i]) * ps_ceps[i];
		ps_cepsavg[i] = DVTXOP_L_add(DVTXOP_Ls_mult_r(ps_cepsavg[i], a_ceps[i]), DVTXOP_Ls_mult_r(BF_buf->ps_cepsHalfFixAvg[i], DVTXOP_sub(32767, a_ceps[i])));
		//ps_cepsavg[i] = DVTXOP_L_add(DVTXOP_Ls_mult_r(ps_cepsavg[i], a_ceps[i]), DVTXOP_Ls_mult_r(ps_ceps[i],                 DVTXOP_sub(32767, a_ceps[i])));		//ÀÌÀüÄÚµå
	}
	*/
	/* cepstrum smoothing */
	{
	    ae_valign align1,align2,align3,align4;
		ae_int32x2  *p_ps_cepsavg=(ae_int32x2 *)(ps_cepsavg);
		ae_int32x2  *p_ps_cepsavg_s=(ae_int32x2 *)(ps_cepsavg);
		ae_int16x4  *p_a_ceps=(ae_int16x4 *)(a_ceps);
		ae_int32x2  *p_ps_ceps=(ae_int32x2 *)(BF_buf->ps_cepsHalfFixAvg);

		ae_int32x2 tmp1,tmp3,tmp5,tmp6,tmp7,tmp8;
		ae_int16x4 tmp2,tmp4;
		ae_int16x4 tmp_con1= AE_MOVDA16X2(32767,32767);
		ae_int32x2 tmp_con2= AE_MOVDA32(0xfffffffe);
		align1 = AE_LA64_PP(p_ps_cepsavg);
		align2 = AE_LA64_PP(p_a_ceps);
		align3 = AE_LA64_PP(p_ps_ceps);
		align4 = AE_ZALIGN64();
		for (i = 0; i < DVTX_FFT_HALFLEN_WB ; i+=4)
		{
			//ps_cepsavg[i] = a_ceps[i] * ps_cepsavg[i] + (1 - a_ceps[i]) * ps_ceps[i];
			//ps_cepsavg[i] = DVTXOP_L_add(DVTXOP_L_mpy_ls(ps_cepsavg[i], a_ceps[i]), DVTXOP_L_mpy_ls(ps_ceps[i], DVTXOP_sub(32767, a_ceps[i])));
			AE_LA32X2_IP(tmp1, align1, p_ps_cepsavg);
			AE_LA16X4_IP(tmp2, align2, p_a_ceps);
			AE_LA32X2_IP(tmp3, align3, p_ps_ceps);
			tmp4=AE_SUB16S(tmp_con1,tmp2);
			tmp5=AE_MULFP32X16X2RAS_H(tmp1, tmp2);//Õâ¸ö¿ÉÒÔÓÃÒ»¸öÖ¸Áî£¬µ«ÊÇÃ»ÓÐround²Ù×÷
			//////////////////////////////////////////////////

			tmp6=AE_MULFP32X16X2RAS_H(tmp3, tmp4);
			tmp5=AE_ADD32S(tmp5, tmp6);

			AE_LA32X2_IP(tmp1, align1, p_ps_cepsavg);
			//AE_LA16X4_IP(tmp2, align2, p_a_ceps);
			AE_LA32X2_IP(tmp3, align3, p_ps_ceps);
			//tmp4=AE_SUB32S(tmp_con1,tmp2);
			tmp7=AE_MULFP32X16X2RAS_L(tmp1, tmp2);
			tmp8=AE_MULFP32X16X2RAS_L(tmp3, tmp4);
			tmp6=AE_ADD32S(tmp7, tmp8);
			AE_SA32X2_IP(tmp5, align4, p_ps_cepsavg_s);
			AE_SA32X2_IP(tmp6, align4, p_ps_cepsavg_s);
		}
		AE_SA64POS_FP(align4, p_ps_cepsavg_s);
		ps_cepsavg[DVTX_FFT_HALFLEN_WB] = DVTXOP_L_add(DVTXOP_Ls_mult_r(ps_cepsavg[DVTX_FFT_HALFLEN_WB], a_ceps[DVTX_FFT_HALFLEN_WB]), DVTXOP_Ls_mult_r(BF_buf->ps_cepsHalfFixAvg[DVTX_FFT_HALFLEN_WB], DVTXOP_sub(32767, a_ceps[DVTX_FFT_HALFLEN_WB])));
	}
	return;
}
#endif

#ifndef fn_BF_PitchEnhance_4_Invcepstrum_DSP_OPT
void fn_BF_PitchEnhance_4_Invcepstrum(int *XX_GSCcpes, /*Q?*/int *ps_cepsavg, short BLK_NORM)
{
	int i;

	XX_GSCcpes[0] = DVTXOP_L_shr(ps_cepsavg[0], (15 - (BLK_NORM + 1)));//Q15
	for (i = 1; i < DVTX_FFT_HALFLEN_WB + 1; i++)
	{
		XX_GSCcpes[i] = DVTXOP_L_shr(ps_cepsavg[i], (15 - (BLK_NORM + 1)));//Q15
		XX_GSCcpes[DVTX_FFT_LEN_WB - i] = DVTXOP_L_shr(ps_cepsavg[i], (15 - (BLK_NORM + 1)));//Q15
	}

	Tx_r_fft_512_32b(XX_GSCcpes, 1);

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		XX_GSCcpes[2 * i] = DVTXOP_L_shl(XX_GSCcpes[2 * i], 16);
	}

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		XX_GSCcpes[i] = XX_GSCcpes[2 * i] + DVTXOP_L_mpy_ls(XX_GSCcpes[2 * i], 3276/*0.1*/);

		XX_GSCcpes[i] = DVTXOP_L_add(XX_GSCcpes[i], DVTX_LOG10FIX);
		XX_GSCcpes[i] = DVTXOP_fnExp10(XX_GSCcpes[i]);
	}

	return;
}
#else
void fn_BF_PitchEnhance_4_Invcepstrum(int *XX_GSCcpes, /*Q?*/int *ps_cepsavg, short BLK_NORM)
{
	int i;

	XX_GSCcpes[0] = DVTXOP_L_shr(ps_cepsavg[0], (15 - (BLK_NORM + 1)));//Q15

	{
		ae_valign align1, align2, align3;
		int tmp_shift = AE_MOVDA32(15 - (BLK_NORM + 1));
		ae_int32x2  *p_ps_cepsavg = (ae_int32x2 *)(ps_cepsavg + 1);
		ae_int32x2  *p_XX_GSCcpes_s = (ae_int32x2 *)(XX_GSCcpes + 1);
		ae_int32x2  *p_XX_GSCcpes_e = (ae_int32x2 *)(XX_GSCcpes + DVTX_FFT_LEN_WB - 1);
		ae_int32x2 tmp, tmp1, tmp2, tmp5;
		align1 = AE_LA64_PP(p_ps_cepsavg);
		align2 = AE_ZALIGN64();
		align3 = AE_ZALIGN64();

		tmp5 = AE_MOVDA32(tmp_shift);
		for (i = 1; i < DVTX_FFT_HALFLEN_WB + 1; i += 2)
		{
			AE_LA32X2_IP(tmp, align1, p_ps_cepsavg);
			tmp = AE_SRAA32S(tmp, tmp5);
			AE_SA32X2_IP(tmp, align2, p_XX_GSCcpes_s);
			AE_SA32X2_RIP(tmp, align3, p_XX_GSCcpes_e);
		}
		AE_SA64POS_FP(align2, p_XX_GSCcpes_s);
		AE_SA64NEG_FP(align3, p_XX_GSCcpes_e);
	}


	Tx_r_fft_512_32b(XX_GSCcpes, 1);

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		XX_GSCcpes[2 * i] = DVTXOP_L_shl(XX_GSCcpes[2 * i], 16);
	}



	{
		ae_int32x2 tmp_xp, tmp1, tmp2, tmp, tmp3, tmp4;
		ae_int16x4 tmp_con = AE_MOVDA16X2(3276, 3276);
		ae_int32x2 tmp_con1 = AE_MOVDA32(DVTX_LOG10FIX);//DVTX_LOG10FIX??ãÀÊ¦ì¤?ûùîÜ?×ìà»Üô?ûù£¬ fang
		ae_int16x4 tmp_con2 = AE_MOVDA16X2(27213, 27213);

		static short pswPCoefE[3] =
		{							// c2,   c1,    c0
			0x15ef, 0x556f, 0x7fbd
		};
		ae_f16x4 pswPCoefE0 = AE_MOVDA16X2(pswPCoefE[0], pswPCoefE[0]);
		ae_f16x4 pswPCoefE1 = AE_MOVDA16X2(pswPCoefE[1], pswPCoefE[1]);
		ae_f32x2 pswPCoefE2 = AE_MOVDA32(DVTXOP_L_deposit_h(pswPCoefE[2]));
		//ae_int32x2 tmp_xp,tmp1,tmp2,tmp;
		ae_f16x4  swTemp1, swTemp2, swTemp3, swTemp4;
		ae_int16x4 tmp_con3 = AE_MOVDA16X2(0x0020, 0x0020);
		ae_int16x4 tmp_con4 = AE_MOVDA16X2(-0x0001, -0x0001);
		ae_int32x2 tmp_con5 = AE_MOVDA32(0xffff);
		ae_int32x2 tmp_con6 = AE_MOVDA32(DVTXOP_L_deposit_h(tmp_con4));
		ae_int32x2 tmp_con7 = AE_MOVDA32(1);
		int bool1;
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i += 4)
		{
			tmp_xp = AE_MOVDA32X2(XX_GSCcpes[2 * i], XX_GSCcpes[2 * (i + 1)]);
			tmp1 = AE_MULFP32X16X2RAS_L(tmp_xp, tmp_con);
			tmp1 = AE_ADD32S(tmp_xp, tmp1);
			tmp1 = AE_ADD32S(tmp1, tmp_con1);

			//////////////////////////////////DVTXOP_fnExp10
			//XX_GSCcpes[i] = DVTXOP_fnExp10(XX_GSCcpes[i]);
			tmp1 = AE_MULFP32X16X2RAS_L(tmp1, tmp_con2);
			tmp2 = AE_SLAI32S(tmp1, 2);

			tmp_xp = AE_MOVDA32X2(XX_GSCcpes[2 * (i + 2)], XX_GSCcpes[2 * (i + 3)]);
			tmp1 = AE_MULFP32X16X2RAS_L(tmp_xp, tmp_con);
			tmp1 = AE_ADD32S(tmp_xp, tmp1);
			tmp1 = AE_ADD32S(tmp1, tmp_con1);

			//////////////////////////////////DVTXOP_fnExp10
			//XX_GSCcpes[i] = DVTXOP_fnExp10(XX_GSCcpes[i]);

			tmp1 = AE_MULFP32X16X2RAS_L(tmp1, tmp_con2);
			tmp1 = AE_SLAI32S(tmp1, 2);
/////////////////////////////////////////////////////////////////////
			swTemp1 = AE_TRUNC16X4F32(tmp2, tmp1);
			AE_MULF16X4SS(tmp1, tmp2, swTemp1, tmp_con3);// LwIn  int
			swTemp2 = AE_TRUNC16X4F32(tmp1, tmp2);
			swTemp4 = AE_SUB16S(tmp_con4, swTemp2);
			tmp1 = AE_AND32(tmp1, tmp_con5);
			tmp2 = AE_AND32(tmp2, tmp_con5);
			tmp1 = AE_ADD32S(tmp1, tmp_con6);
			tmp2 = AE_ADD32S(tmp2, tmp_con6);
//			tmp1 = AE_SRAI32(tmp1, 1);//û¿ßÀÌÀá´Öõìé??ûú
//			tmp2 = AE_SRAI32(tmp2, 1);//û¿ßÀÌÀá´Öõìé??ûú
			tmp1 = AE_SRAA32S(tmp1, tmp_con7);//ôÕÊ¥?ûú
			tmp2 = AE_SRAA32S(tmp2, tmp_con7);//ôÕÊ¥?ûú
			swTemp1 = AE_CVT16X4(tmp1, tmp2);
			swTemp2 = AE_MULFP16X4RAS(swTemp1, swTemp1);
			AE_MULF16X4SS(tmp1, tmp2, swTemp2, pswPCoefE0);
			AE_MULAF16X4SS(tmp1, tmp2, swTemp1, pswPCoefE1);
			tmp1 = AE_ADD32S(tmp1, pswPCoefE2);
			tmp2 = AE_ADD32S(tmp2, pswPCoefE2);


			bool1 = AE_MOVAD16_3(swTemp4);
			XX_GSCcpes[i]=AE_MOVAD32_H(tmp1);
			if (bool1 > 0) XX_GSCcpes[i] = DVTXOP_L_shr(AE_MOVAD32_H(tmp1), bool1);
			bool1 = AE_MOVAD16_2(swTemp4);
			XX_GSCcpes[i + 1]=AE_MOVAD32_L(tmp1);
			if (bool1 > 0) XX_GSCcpes[i + 1] = DVTXOP_L_shr(AE_MOVAD32_L(tmp1), bool1);
			bool1 = AE_MOVAD16_1(swTemp4);
			 XX_GSCcpes[i + 2]=AE_MOVAD32_H(tmp2);
			if (bool1 > 0) XX_GSCcpes[i + 2] = DVTXOP_L_shr(AE_MOVAD32_H(tmp2), bool1);
			bool1 = AE_MOVAD16_0(swTemp4);
			XX_GSCcpes[i + 3]=AE_MOVAD32_L(tmp2);
			if (bool1 > 0) XX_GSCcpes[i + 3] = DVTXOP_L_shr(AE_MOVAD32_L(tmp2), bool1);


		}
	}
}
#endif

//#ifndef fn_BF_PitchEnhance_5_cepstrumNS_OPT_DPS
#ifndef fn_BF_PitchEnhance_5_cepstrumNS_modify

void fn_BF_PitchEnhance_5_cepstrumNS(short *XoutGSC, int *XX_GSCcpes, int *Npsdgsc, BFStatus* BF_buf, short Flag_Tx_silent_mode_BF, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf, CONTEXT_NOISE_LEVLE ContextNoiseLevel)
{
	int i;
	short *gain_postNS = BF_buf->gain_postNS;	//Q0.15
	short tmpgain;
	short NoiseFloor;
	int  snr_f, snr_f1, tmp, tmp1;


	short val_NoiseFloor, val_NpsdgscGainLF, val_NpsdgscGainHF;

	short Offset_nfloor_Noise;
	short Offset_nfloor_Speech;
	short Offset_ngain_Noise;
	short Offset_ngain_Speech;

	Offset_nfloor_Noise  = 0;
	Offset_nfloor_Speech = 0;
	Offset_ngain_Noise   = 0;
	Offset_ngain_Speech  = 0;

	if ((FRAME_buf->STATE_ACC_Effective == 0) || (Flag_Tx_silent_mode_BF == 1))
	{
		val_NoiseFloor = 28000;
		val_NpsdgscGainLF = 4000;
		val_NpsdgscGainHF = 4000;
	}
	else
	{
		if (ContextNoiseLevel == Noise_Free)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 21000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 8000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 8000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_52dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 20000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 9500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 9500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_56dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 19000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 11000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 11000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_60dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 18000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 12500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 12500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_64dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 17000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 14000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 14000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_68dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 16000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 15500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 15500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_72dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 15000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 17000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 17000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_76dBA)
		{
		if (VADACC_buf->VADACCframe_Fast == 0)
		{
				val_NoiseFloor = 14000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 18500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 18500 + Offset_ngain_Noise;
		}
		else
		{
			val_NoiseFloor = 26000 + Offset_nfloor_Speech;
			val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
			val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
		}
		}
		else //if (ContextNoiseLevel == Noise_Extreme)
		{
		if (VADACC_buf->VADACCframe_Fast == 0)
		{
				val_NoiseFloor = 13000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 20000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 20000 + Offset_ngain_Noise;
		}
		else
		{
			val_NoiseFloor = 26000 + Offset_nfloor_Speech;
			val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
			val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
		}
		}
	}
		
	
	NoiseFloor = val_NoiseFloor; //0.24	
	for (i = 0; i < 128/* + 1*/; i++)
	{
		Npsdgsc[i] = DVTXOP_L_mpy_ls(Npsdgsc[i], val_NpsdgscGainLF);
	}
	for (i = 128; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		Npsdgsc[i] = DVTXOP_L_mpy_ls(Npsdgsc[i], val_NpsdgscGainHF);
	}

		

		
	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		//>0 ?Npsdgsc[i]:-Npsdgsc[i];
		tmp = DVTXOP_Ls_mult_r(Npsdgsc[i], NoiseFloor);//0.15 --> 0.20  4915
		//tmp1=DVTXOP_L_add(tmp,NN);
		snr_f = DVTX_MAX(XX_GSCcpes[i], tmp);
		//fang1=DVTX_MAX(DVTXOP_L_add(SS,NN),tmp1);
		snr_f1 = DVTXOP_L_add(snr_f, Npsdgsc[i]);
		//gain_postNS[i] = DVTXOP_saturate(DVTX_MIN(fx_SolomonVoice_32bit_Divide(snr_f, snr_f1, 1, 16),32767)); //Q0.15
		//gain_postNS[i] = DVTXOP_saturate(fx_SolomonVoice_32bit_Divide(snr_f, snr_f1, 1, 16)); //Q0.15
		tmpgain = DVTXOP_saturate((fx_SolomonVoice_32bit_Divide(snr_f, snr_f1, 1, 16) - 1)); //Q0.15

		gain_postNS[i] = DVTXOP_add(DVTXOP_mult_r(gain_postNS[i], 16384), DVTXOP_mult_r(tmpgain, 16383));
	}

	for (i = 0; i < DVTX_M_ACC_MAXFREQ/* + 1*/; i++)
	{
		if(VADACC_buf->VADACCmask[i] == 1)
		gain_postNS[i] = DVTX_MAX(gain_postNS[i], 20000);
	}
		

	/* gain apply(NS) */
	//tmpgain = 2;
	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		//if ((DVTXOP_abs_s(XoutGSC[2 * i]) > tmpgain) || (DVTXOP_abs_s(XoutGSC[2 * i+1]) > tmpgain))
		{
		XoutGSC[2 * i] = DVTXOP_mult_r(XoutGSC[2 * i], gain_postNS[i]);
		XoutGSC[2 * i + 1] = DVTXOP_mult_r(XoutGSC[2 * i + 1], gain_postNS[i]);
	}
	}

	return;
}

#else

#if 1//xtensa code fang change
void fn_BF_PitchEnhance_5_cepstrumNS(short *XoutGSC, int *XX_GSCcpes, int *Npsdgsc, BFStatus* BF_buf, short Flag_Tx_silent_mode_BF, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf, CONTEXT_NOISE_LEVLE ContextNoiseLevel)
{
	int i;
	short *gain_postNS = BF_buf->gain_postNS;	//Q0.15
	//int snr_ml_ceps[DVTX_FFT_HALFLEN_WB + 1];	//óÝ×ðñÕ çì ?ÖÕ ùÞ?øË Î¯ðÇ ÷é
	//int Ltmp;
	short NoiseFloor;

	short val_NoiseFloor, val_NpsdgscGainLF, val_NpsdgscGainHF;

	short Offset_nfloor_Noise;
	short Offset_nfloor_Speech;
	short Offset_ngain_Noise;
	short Offset_ngain_Speech;

	Offset_nfloor_Noise  = 0;
	Offset_nfloor_Speech = 0;
	Offset_ngain_Noise   = 0;
	Offset_ngain_Speech  = 0;

	if ((FRAME_buf->STATE_ACC_Effective == 0) || (Flag_Tx_silent_mode_BF == 1))
	{
		val_NoiseFloor = 28000;
		val_NpsdgscGainLF = 4000;
		val_NpsdgscGainHF = 4000;
	}
	else
	{
		if (ContextNoiseLevel == Noise_Free)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 21000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 8000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 8000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_52dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 20000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 9500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 9500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_56dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 19000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 11000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 11000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_60dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 18000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 12500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 12500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_64dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 17000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 14000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 14000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_68dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 16000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 15500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 15500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_72dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 15000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 17000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 17000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else if (ContextNoiseLevel == Noise_76dBA)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 14000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 18500 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 18500 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
		else //if (ContextNoiseLevel == Noise_Extreme)
		{
			if (VADACC_buf->VADACCframe_Fast == 0)
			{
				val_NoiseFloor = 13000 + Offset_nfloor_Noise;
				val_NpsdgscGainLF = 20000 + Offset_ngain_Noise;
				val_NpsdgscGainHF = 20000 + Offset_ngain_Noise;
			}
			else
			{
				val_NoiseFloor = 26000 + Offset_nfloor_Speech;
				val_NpsdgscGainLF = 4000 + Offset_ngain_Speech;
				val_NpsdgscGainHF = 4000 + Offset_ngain_Speech;
			}
		}
	}


	NoiseFloor = val_NoiseFloor; //0.24	
	for (i = 0; i < 128/* + 1*/; i++)
	{
		Npsdgsc[i] = DVTXOP_L_mpy_ls(Npsdgsc[i], val_NpsdgscGainLF);
	}
	for (i = 128; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		Npsdgsc[i] = DVTXOP_L_mpy_ls(Npsdgsc[i], val_NpsdgscGainHF);
	}


{
	int  snr,snr1;
	ae_valign align1,align2;
	ae_int32x2  *p_Npsdgsc=(ae_int32x2 *)(Npsdgsc);
	ae_int32x2  *p_XX_GSCcpes=(ae_int32x2 *)(XX_GSCcpes);
	ae_int32x2  tmp1,tmp2,tmp3,tmp4,tmp5;
	ae_int16x4 tmp_con= AE_MOVDA16X2(NoiseFloor, NoiseFloor);
	xtbool2 bool2;
	align1 = AE_LA64_PP(p_Npsdgsc);
	align2 = AE_LA64_PP(p_XX_GSCcpes);
    short tmpgain;

	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=2)
	{

//		tmp=DVTXOP_Ls_mult_r(Npsdgsc[i],4915);
//		snr_f=DVTX_MAX(XX_GSCcpes[i],tmp);
//		snr_f1=DVTXOP_L_add(snr_f,Npsdgsc[i]);
		AE_LA32X2_IP(tmp1, align1, p_Npsdgsc);
		AE_LA32X2_IP(tmp2, align2, p_XX_GSCcpes);
		tmp3=AE_MULFP32X16X2RAS_L(tmp1, tmp_con);//0.15N

		bool2 = AE_LT32(tmp2,tmp3);
		AE_MOVT32X2(tmp2, tmp3, bool2);

		tmp5=AE_ADD32S(tmp2, tmp1);//1.15N
		snr=AE_MOVAD32_H(tmp2);
		snr1=AE_MOVAD32_H(tmp5);
		//gain_postNS[i] = DVTXOP_saturate(DVTX_MIN(fx_SolomonVoice_32bit_Divide(snr, snr1, 1, 16),32767));
		tmpgain = DVTXOP_saturate((fx_SolomonVoice_32bit_Divide(snr, snr1, 1, 16)-1)); //Q0.15
        tmpgain = DVTXOP_mult_r(tmpgain,16383);
        tmpgain = tmpgain + ((gain_postNS[i]+1)>>1);
        gain_postNS[i] = tmpgain;
//		gain_postNS[i] = DVTXOP_add(DVTXOP_mult_r(gain_postNS[i], 16384), DVTXOP_mult_r(tmpgain, 16383));
		snr=AE_MOVAD32_L(tmp2);
		snr1=AE_MOVAD32_L(tmp5);
		//gain_postNS[i+1] = DVTXOP_saturate(DVTX_MIN(fx_SolomonVoice_32bit_Divide(snr, snr1, 1, 16),32767));
		tmpgain = DVTXOP_saturate((fx_SolomonVoice_32bit_Divide(snr, snr1, 1, 16)-1)); //Q0.15
        tmpgain = DVTXOP_mult_r(tmpgain,16383);
        tmpgain = tmpgain + ((gain_postNS[i+1]+1)>>1);
        gain_postNS[i+1] = tmpgain;

	}

}

	for (i = 0; i < DVTX_M_ACC_MAXFREQ/* + 1*/; i++)
	{
	if (VADACC_buf->VADACCmask[i] == 1)
		gain_postNS[i] = DVTX_MAX(gain_postNS[i], 20000);
	}


	/* gain apply(NS) */    ////?Ý»ÝÂbit_exact
{
	ae_valign align1,align2,align3;

	ae_int16x4  *p_XoutGSC=(ae_int16x4 *)(XoutGSC);
	ae_int16x4  *p_XoutGSC_s=(ae_int16x4 *)(XoutGSC);
	ae_int16x4  *p_gain_postNS=(ae_int16x4 *)(gain_postNS);
	ae_int16x4  tmp1,tmp2,tmp3,tmp4,tmp5;

	align1 = AE_LA64_PP(p_XoutGSC);
	align2 = AE_LA64_PP(gain_postNS);
	align3 = AE_ZALIGN64();
	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=4)
	{
		//XoutGSC[2 * i] = DVTXOP_mult_r(XoutGSC[2 * i], gain_postNS[i]);
		//XoutGSC[2 * i + 1] = DVTXOP_mult_r(XoutGSC[2 * i + 1], gain_postNS[i]);
		AE_LA16X4_IP(tmp1, align1, p_XoutGSC);
		AE_LA16X4_IP(tmp2, align1, p_XoutGSC);
		AE_LA16X4_IP(tmp3, align2, p_gain_postNS);
		tmp4=AE_SEL16_7362(tmp3,tmp3);//1234  1234=>1122
		tmp5=AE_SEL16_5410(tmp3,tmp3);//3434
		tmp5=AE_SEL16_7520(tmp5,tmp5);//3344
		tmp1=AE_MULFP16X4RAS(tmp1, tmp4);
		tmp2=AE_MULFP16X4RAS(tmp2, tmp5);

		AE_SA16X4_IP(tmp1, align3, p_XoutGSC_s);
		AE_SA16X4_IP(tmp2, align3, p_XoutGSC_s);

	}
	AE_SA64POS_FP(align3, p_XoutGSC_s);
}

	return;
}
#else
#include<stdio.h>
FILE *fp;
void fn_BF_PitchEnhance_5_cepstrumNS(short *XoutGSC, int *XX_GSCcpes, int *Npsdgsc, BFStatus* BF_buf, short Flag_Tx_silent_mode_BF, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf, CONTEXT_NOISE_LEVLE ContextNoiseLevel)
{
	int i;
	short *gain_postNS = BF_buf->gain_postNS;	//Q0.15
	int snr_ml_ceps[DVTX_FFT_HALFLEN_WB + 1];	//³ªÁß¿¡ °Á ´ÜÀÏ º¯¼ö·Î ¹Ù²Ü °Í
	int Ltmp;

	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		gain_postNS[i] = DVTXOP_extract_l(fx_SolomonVoice_32bit_Divide(XX_GSCcpes[i], DVTXOP_L_add(XX_GSCcpes[i] , Npsdgsc[i]), 1, 16)); //Q0.15
		gain_postNS[i] = DVTX_MAX(gain_postNS[i], 4274/*0.15*/);
	}
	fp = fopen("D:\\2019_in_ear_code\\sample\\m.txt","a+");
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		fprintf(fp,"%d\n",gain_postNS[i]);
	}
	fclose(fp);

	/* gain apply(NS) */
	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		XoutGSC[2 * i] = DVTXOP_mult_r(XoutGSC[2 * i], gain_postNS[i]);
		XoutGSC[2 * i + 1] = DVTXOP_mult_r(XoutGSC[2 * i + 1], gain_postNS[i]);
	}

	return;
}
#endif
#endif

#endif


short(*wBF)[514];
short(*wMaxNSR)[514];
#ifndef fn_MODULE_100_maxNSR_filtering_OPT_DSP
void fn_MODULE_100_maxNSR_filtering(/*out*/short *X_F_NSR, short *X_B_NSR, /*in*/short *Xo1, short *Xo2, short DOAindex, BFStatus* BF_buf)
{
	short i;
	int Ltmp;

	wBF = BF_buf->wBF;
	wMaxNSR = BF_buf->wMaxNSR;
	wBF = Table_wBF[DOAindex];			//Q1.14
	wMaxNSR = Table_wMaxNSR[DOAindex];  //Q3.12

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		short idx_real = 2 * i;
		short idx_imag = 2 * i + 1;

		// Fixed BF
		Ltmp = DVTXOP_L_mult(wBF[0][idx_real], Xo1[idx_real]); //Q(16 + Q_Xo1 - 1)
		Ltmp = DVTXOP_L_mac(Ltmp, wBF[0][idx_imag], Xo1[idx_imag]);
		Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_real], Xo2[idx_real]);
		Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_imag], Xo2[idx_imag]);
		X_F_NSR[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(Ltmp, (16 - 1)));

		Ltmp = DVTXOP_L_mult(wBF[0][idx_real], Xo1[idx_imag]);
		Ltmp = DVTXOP_L_msu(Ltmp, wBF[0][idx_imag], Xo1[idx_real]);
		Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_real], Xo2[idx_imag]);
		Ltmp = DVTXOP_L_msu(Ltmp, wBF[1][idx_imag], Xo2[idx_real]);
		X_F_NSR[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(Ltmp, (16 - 1)));

		//Blocking Matrix
		Ltmp = DVTXOP_L_mult(wMaxNSR[0][idx_real], Xo1[idx_real]); //Q(16 + Q_Xo1 - 3)
		Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[0][idx_imag], Xo1[idx_imag]);
		Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_real], Xo2[idx_real]);
		Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_imag], Xo2[idx_imag]);
		X_B_NSR[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(Ltmp, (16 - 3)));

		Ltmp = DVTXOP_L_mult(wMaxNSR[0][idx_real], Xo1[idx_imag]);
		Ltmp = DVTXOP_L_msu(Ltmp, wMaxNSR[0][idx_imag], Xo1[idx_real]);
		Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_real], Xo2[idx_imag]);
		Ltmp = DVTXOP_L_msu(Ltmp, wMaxNSR[1][idx_imag], Xo2[idx_real]);
		X_B_NSR[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(Ltmp, (16 - 3)));
	}
	return;
}
#else
void fn_MODULE_100_maxNSR_filtering(/*out*/short *X_F_NSR, short *X_B_NSR, /*in*/short *Xo1, short *Xo2, short DOAindex, BFStatus* BF_buf)
{
	short i;
	int Ltmp;

	wBF = BF_buf->wBF;
	wMaxNSR = BF_buf->wMaxNSR;
	ae_int16x4 *ptXo1, *ptXo2, *ptwBF0, *ptwBF1,*ptwMaxNSR0, *ptwMaxNSR1;
	ae_int16x4 *ptX_F, *ptX_B;
	ae_valign align0 ,align1, align2, align3 ,align4, align5,align6, align7;
	ae_int16x4 X1v, X2v, w0v,w1v, wM0v, wM1v, nX1v, nX2v, tmps1, tmps2 , flag1010, flag0101  ;
	ae_int16x4 nX1vr, nX1vi, nX2vr, nX2vi;
	ae_int32x2 L_tmp1,L_tmp2, L_tmp3,L_tmp4 ;

	wBF = Table_wBF[DOAindex];			//Q1.14
	wMaxNSR = Table_wMaxNSR[DOAindex];  //Q3.12
/*	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		short idx_real = 2 * i;
		short idx_imag = 2 * i + 1;
		Xo1[idx_real] = 50*i+10;
		Xo1[idx_imag] = 50*i+100;

		Xo2[idx_real] = 20*i+20;
		Xo2[idx_imag] = 20*i+200;

		wBF[0][idx_real] =  30*i+30;
		wBF[0][idx_imag] =  30*i+300;

		wBF[1][idx_real] = 40*i+40;
		wBF[1][idx_imag] = 40*i+400;
	}
*/
	ptwBF0 = (ae_int16x4*)wBF[0];
	ptwBF1 = (ae_int16x4*)wBF[1];
	ptwMaxNSR0 = (ae_int16x4*)wMaxNSR[0];
	ptwMaxNSR1 = (ae_int16x4*)wMaxNSR[1];
	ptXo1 = (ae_int16x4*)Xo1;
	ptXo2 = (ae_int16x4*)Xo2;
	ptX_F = (ae_int16x4*)X_F_NSR;
	ptX_B = (ae_int16x4*)X_B_NSR;
	align0 = AE_LA64_PP(ptwBF0);
	align1 = AE_LA64_PP(ptwBF1);
	align2 = AE_LA64_PP(ptwMaxNSR0);
	align3 = AE_LA64_PP(ptwMaxNSR1);
	align4 = AE_LA64_PP(ptXo1);
	align5 = AE_LA64_PP(ptXo2);
	align6 = AE_ZALIGN64();
	align7 = AE_ZALIGN64();
	flag1010 = AE_MOVF16_FROMF64(AE_MOV64(0xffff0000ffff0000LL));
	flag0101 = AE_MOVF16_FROMF64(AE_MOV64(0x0000ffff0000ffffLL));
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=2)
	{
//		short idx_real = 2 * i;
//		short idx_imag = 2 * i + 1;

		// Fixed BF
		//Ltmp = DVTXOP_L_mult(wBF[0][idx_real], Xo1[idx_real]); //Q(16 + Q_Xo1 - 1)
		//Ltmp = DVTXOP_L_mac(Ltmp, wBF[0][idx_imag], Xo1[idx_imag]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_real], Xo2[idx_real]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_imag], Xo2[idx_imag]);
		//X_F_NSR[idx_real] = DVTXOP_extract_l(DVTXOP_L_shr(Ltmp, (16 - 1)));
		AE_LA16X4_IP(w0v, align0, ptwBF0);
		AE_LA16X4_IP(w1v, align1, ptwBF1);
		AE_LA16X4_IP(X1v, align4, ptXo1);
		AE_LA16X4_IP(X2v, align5, ptXo2);

		nX1v = AE_SHORTSWAP(X1v);
		nX1v = AE_SEL16_5432(nX1v, nX1v);
		nX2v = AE_SHORTSWAP(X2v);
		nX2v = AE_SEL16_5432(nX2v, nX2v);
		nX1vi =  AE_AND16(nX1v, flag1010);
		nX1vr =  AE_AND16(nX1v, flag0101);
		nX2vi =  AE_AND16(nX2v, flag1010);
		nX2vr =  AE_AND16(nX2v, flag0101);

		AE_MULF16X4SS(L_tmp1, L_tmp2, w0v, X1v);
		AE_MULAF16X4SS(L_tmp1, L_tmp2, w1v, X2v);
		L_tmp3 = AE_SEL32_HH(L_tmp1, L_tmp2);
		L_tmp1 = AE_SEL32_LL(L_tmp1, L_tmp2);
		L_tmp3 = AE_ADD32S(L_tmp1, L_tmp3);
		L_tmp3 = AE_SRAA32S(L_tmp3, 15);
			   
		//X_F_NSR[idx_imag] = ((long long)wBF[0][idx_real] * Xo1[idx_imag] - (long long)wBF[0][idx_imag] * Xo1[idx_real]) >> 31;
		//X_F_NSR[idx_imag] += ((long long)wBF[1][idx_real] * Xo2[idx_imag] - (long long)wBF[1][idx_imag] * Xo2[idx_real]) >> 31;
		//Ltmp = DVTXOP_L_mult(wBF[0][idx_real], Xo1[idx_imag]);
		//Ltmp = DVTXOP_L_msu(Ltmp, wBF[0][idx_imag], Xo1[idx_real]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wBF[1][idx_real], Xo2[idx_imag]);
		//Ltmp = DVTXOP_L_msu(Ltmp, wBF[1][idx_imag], Xo2[idx_real]);
		//X_F_NSR[idx_imag] = DVTXOP_extract_l(DVTXOP_L_shr(Ltmp, (16 - 1)));
		AE_MULF16X4SS(L_tmp1, L_tmp2, w0v, nX1vi);
		AE_MULAF16X4SS(L_tmp1, L_tmp2, w1v, nX2vi);
		AE_MULSF16X4SS (L_tmp1, L_tmp2, w0v, nX1vr);
		AE_MULSF16X4SS (L_tmp1, L_tmp2, w1v, nX2vr);

		L_tmp4 = AE_SEL32_HH(L_tmp1, L_tmp2);
		L_tmp1 = AE_SEL32_LL(L_tmp1, L_tmp2);
		L_tmp4 = AE_ADD32S(L_tmp1, L_tmp4);
		L_tmp4 = AE_SRAA32S(L_tmp4, 15);

		tmps1 = AE_SAT16X4(L_tmp3, L_tmp4);
		tmps1= AE_SEL16_7520(tmps1,tmps1);
		AE_SA16X4_IP(tmps1, align6, ptX_F);

		//Blocking Matrix
		//X_B_NSR[idx_real] = ((long long)wMaxNSR[0][idx_real] * Xo1[idx_real] + (long long)wMaxNSR[0][idx_imag] * Xo1[idx_imag]) >> 31; //X_B_NSR : Q27.4
		//X_B_NSR[idx_real] += ((long long)wMaxNSR[1][idx_real] * Xo2[idx_real] + (long long)wMaxNSR[1][idx_imag] * Xo2[idx_imag]) >> 31;
		//Ltmp = DVTXOP_L_mult(wMaxNSR[0][idx_real], Xo1[idx_real]); //Q(16 + Q_Xo1 - 3)
		//Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[0][idx_imag], Xo1[idx_imag]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_real], Xo2[idx_real]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_imag], Xo2[idx_imag]);
		//X_B_NSR[idx_real] = DVTXOP_extract_l(DVTXOP_L_shr(Ltmp, (16 - 3)));
		AE_LA16X4_IP(wM0v, align2, ptwMaxNSR0);
		AE_LA16X4_IP(wM1v, align3, ptwMaxNSR1);
		AE_MULF16X4SS(L_tmp1, L_tmp2, wM0v, X1v);
		AE_MULAF16X4SS(L_tmp1, L_tmp2, wM1v, X2v);

		L_tmp3 = AE_SEL32_HH(L_tmp1, L_tmp2);
		L_tmp1 = AE_SEL32_LL(L_tmp1, L_tmp2);
		L_tmp3 = AE_ADD32S(L_tmp1, L_tmp3);
		L_tmp3 = AE_SRAA32S(L_tmp3, 13);

		//X_B_NSR[idx_imag] = ((long long)wMaxNSR[0][idx_real] * Xo1[idx_imag] - (long long)wMaxNSR[0][idx_imag] * Xo1[idx_real]) >> 31;
		//X_B_NSR[idx_imag] += ((long long)wMaxNSR[1][idx_real] * Xo2[idx_imag] - (long long)wMaxNSR[1][idx_imag] * Xo2[idx_real]) >> 31;
		//Ltmp = DVTXOP_L_mult(wMaxNSR[0][idx_real], Xo1[idx_imag]);
		//Ltmp = DVTXOP_L_msu(Ltmp, wMaxNSR[0][idx_imag], Xo1[idx_real]);
		//Ltmp = DVTXOP_L_mac(Ltmp, wMaxNSR[1][idx_real], Xo2[idx_imag]);
		//Ltmp = DVTXOP_L_msu(Ltmp, wMaxNSR[1][idx_imag], Xo2[idx_real]);
		//X_B_NSR[idx_imag] = DVTXOP_extract_l(DVTXOP_L_shr(Ltmp, (16 - 3)));
		AE_MULF16X4SS(L_tmp1, L_tmp2, wM0v, nX1vi);
		AE_MULAF16X4SS(L_tmp1, L_tmp2, wM1v, nX2vi);
		AE_MULSF16X4SS (L_tmp1, L_tmp2, wM0v, nX1vr);
		AE_MULSF16X4SS (L_tmp1, L_tmp2, wM1v, nX2vr);

		L_tmp4 = AE_SEL32_HH(L_tmp1, L_tmp2);
		L_tmp1 = AE_SEL32_LL(L_tmp1, L_tmp2);
		L_tmp4 = AE_ADD32S(L_tmp1, L_tmp4);
		L_tmp4 = AE_SRAA32S(L_tmp4, 13);

		tmps1 = AE_SAT16X4(L_tmp3, L_tmp4);
		tmps1= AE_SEL16_7520(tmps1, tmps1);
		AE_SA16X4_IP(tmps1, align7, ptX_B);
	}
	AE_SA64POS_FP(align6, ptX_F);
	AE_SA64POS_FP(align7, ptX_B);
	return;
}
#endif


#ifndef fn_MODULE_115_MaxNSR_filter_out_adjustment_OPT_DSP
int XXfb_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };
int XXbm_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };
short fn_MODULE_115_MaxNSR_filter_out_adjustment(/*InOut*/short *X_F_NSR, /*InOut*/short *X_B_NSR, short BLK_NORM, short *Xo1, short *Xo2, int PwrMic1, short Flag_AbnormalMic, short Flag_Tx_silent_mode_BF, short Flag_wind, SamsungSolomonVoiceWTxBFParam* BF_param)
{
	// I assume that input Qformat is Q15.0 (X_F_NSR, X_B_NSR, Xo1, Xo2)
	// Q format of PwrMic1 ??
	short i;

	short fl = BF_param->fl;
	short fh = BF_param->fh;

	int PwrFB;
	int PwrBM;
	int FbPwrDiff;
	int BmPwrDiff;

	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		short idx_real = 2 * i;
		short idx_imag = 2 * i + 1;
		int enrgE;

		enrgE = DVTXOP_L_mult(X_F_NSR[idx_real], X_F_NSR[idx_real]);        //Q(BLK_NORM)*Q(BLK_NORM) = Q(2 * BLK_NORM + 1)
		XXfb_fixed[i] = DVTXOP_L_mac(enrgE, X_F_NSR[idx_imag], X_F_NSR[idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) = Q(2 * BLK_NORM + 1)

		enrgE = DVTXOP_L_mult(X_B_NSR[idx_real], X_B_NSR[idx_real]);        //Q(BLK_NORM)*Q(BLK_NORM) = Q(2 * BLK_NORM + 1)
		XXbm_fixed[i] = DVTXOP_L_mac(enrgE, X_B_NSR[idx_imag], X_B_NSR[idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) = Q(2 * BLK_NORM + 1)
	}

	PwrFB = 0;
	PwrBM = 0;

	for (i = fl - 1; i < fh; i++)
	{
		PwrFB += XXfb_fixed[i]; //Q(2 * BLK_NORM + 1)
		PwrBM += XXbm_fixed[i]; //Q(2 * BLK_NORM + 1)
	}

	PwrFB = DVTXOP_10log10_l(PwrFB, (2 * BLK_NORM + 1 - 16));//Q23
	PwrFB = DVTXOP_L_sub(PwrFB, 196685321/*DVTXOP_10log10_l((fh - fl + 1), 0)*/);//Q23
	PwrBM = DVTXOP_10log10_l(PwrBM, (2 * BLK_NORM + 1 - 16));//Q23
	PwrBM = DVTXOP_L_sub(PwrBM, 196685321/*DVTXOP_10log10_l((fh - fl + 1), 0)*/);//Q23

	FbPwrDiff = (PwrFB > PwrMic1) ? DVTXOP_L_sub(PwrFB, PwrMic1) : DVTXOP_L_sub(PwrMic1, PwrFB); //Q23
	BmPwrDiff = DVTXOP_L_sub(PwrBM, PwrMic1);//Q23

	if ((FbPwrDiff > 50331648/*6<<23*/) || (BmPwrDiff > 100663296/*12<<23*/))
	{
		Flag_AbnormalMic = 1;
	}

#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	//debugNS 0
	fprintf(fp_deg_2micBF[16], "%d %d\n", (FbPwrDiff > 50331648/*6<<23*/), (BmPwrDiff > 100663296/*12<<23*/));
#endif
#endif

	if ((Flag_AbnormalMic == 1))
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = Xo1[idx_real];// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = Xo1[idx_imag];// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
			X_B_NSR[idx_real] = 0;// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_sub(Xo1[idx_real], Xo2[idx_real]), 1));
			X_B_NSR[idx_imag] = 0;// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_sub(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}

	if (Flag_wind == 1)
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}

	if (Flag_Tx_silent_mode_BF == 1)
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = Xo1[idx_real]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = Xo1[idx_imag]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}

	return Flag_AbnormalMic;
}
#else
int XXfb_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };
int XXbm_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };
short fn_MODULE_115_MaxNSR_filter_out_adjustment(/*InOut*/short *X_F_NSR, /*InOut*/short *X_B_NSR, short BLK_NORM, short *Xo1, short *Xo2, int PwrMic1, short Flag_AbnormalMic, short Flag_Tx_silent_mode_BF, short Flag_wind, SamsungSolomonVoiceWTxBFParam* BF_param)
{
	// I assume that input Qformat is Q15.0 (X_F_NSR, X_B_NSR, Xo1, Xo2)
	// Q format of PwrMic1 ??
	short i;
    ae_f16x4 *pt0, *pt1;
	ae_f32x2 *pt2, *pt3;
	ae_f16x4 A0, A1;
	ae_f32x2 L_tmp0, L_tmp1, L_tmp2, L_tmp3, L_tmp4, L_tmp5;
	ae_f64 tmpLL1, tmpLL2;
	ae_valign align0, align1, align2, align3;
//	int XXfb_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };
//	int XXbm_fixed[DVTX_FFT_HALFLEN_WB] = { 0, };

	short fl = BF_param->fl;
	short fh = BF_param->fh;

	int PwrFB;
	int PwrBM;
	int FbPwrDiff;
	int BmPwrDiff;


	pt0=(ae_f16x4 *)X_F_NSR;
	pt1=(ae_f16x4 *)X_B_NSR;
	pt2=(ae_f32x2 *)XXfb_fixed;
	pt3=(ae_f32x2 *)XXbm_fixed;

	align0 = AE_LA64_PP(pt0);
	align1 = AE_LA64_PP(pt1);
	align2 = AE_ZALIGN64();
	align3 = AE_ZALIGN64();
	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=2)
	{

		AE_LA16X4_IP(A0,align0,pt0);
		AE_LA16X4_IP(A1,align1,pt1);
		AE_MULF16X4SS(L_tmp0, L_tmp1, A0, A0);
		AE_MULF16X4SS(L_tmp2, L_tmp3, A1, A1);

		L_tmp5 = AE_SEL32_HH(L_tmp0, L_tmp1);
		L_tmp0 = AE_SEL32_LL(L_tmp0, L_tmp1);
		L_tmp0 = AE_ADD32S(L_tmp0, L_tmp5);

		L_tmp5 = AE_SEL32_HH(L_tmp2, L_tmp3);
		L_tmp2 = AE_SEL32_LL(L_tmp2, L_tmp3);
		L_tmp2 = AE_ADD32S(L_tmp2, L_tmp5);

		AE_SA32X2_IP(L_tmp0, align2, pt2);
		AE_SA32X2_IP(L_tmp2, align3, pt3);
	}
	AE_SA64POS_FP(align2, pt2);
	AE_SA64POS_FP(align3, pt3);


	PwrFB = 0;
	PwrBM = 0;

	for (i = fl - 1; i < fh; i++)
	{
		PwrFB += XXfb_fixed[i]; //Q(2 * BLK_NORM + 1)
		PwrBM += XXbm_fixed[i]; //Q(2 * BLK_NORM + 1)
	}

	PwrFB = DVTXOP_10log10_l(PwrFB, (2 * BLK_NORM + 1 - 16));//Q23
	PwrFB = DVTXOP_L_sub(PwrFB, 196685321/*DVTXOP_10log10_l((fh - fl + 1), 0)*/);//Q23
	PwrBM = DVTXOP_10log10_l(PwrBM, (2 * BLK_NORM + 1 - 16));//Q23
	PwrBM = DVTXOP_L_sub(PwrBM, 196685321/*DVTXOP_10log10_l((fh - fl + 1), 0)*/);//Q23

	FbPwrDiff = (PwrFB > PwrMic1) ? DVTXOP_L_sub(PwrFB, PwrMic1) : DVTXOP_L_sub(PwrMic1, PwrFB); //Q23
	BmPwrDiff = DVTXOP_L_sub(PwrBM, PwrMic1);//Q23

	if ((FbPwrDiff > 50331648/*6<<23*/) || (BmPwrDiff > 100663296/*12<<23*/))
	{
		Flag_AbnormalMic = 1;
	}

	//if ((Flag_AbnormalMic == 1))
	//{
	//	ae_int16x4 *pt0, *pt1, *pt2, *pt3;
	//	ae_int16x4 AXo1, AXo2, tmp1, tmp2;
	//	ae_int32x2  L_tmp1, L_tmp2,L_tmp3, L_tmp4, L_tmp5;
	//	pt0=(ae_int16x4 *)Xo1;
	//	pt1=(ae_int16x4 *)Xo2;
	//	pt2=(ae_int16x4 *)X_F_NSR;
	//	pt3=(ae_int16x4 *)X_B_NSR;

	//	align0 = AE_LA64_PP(pt0);
	//	align1 = AE_LA64_PP(pt1);
	//	align2 = AE_ZALIGN64();
	//	align3 = AE_ZALIGN64();
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=2)
	//	{
	//		AE_LA16X4_IP(AXo1,align0,pt0);
	//		AE_LA16X4_IP(AXo2,align1,pt1);

	//		L_tmp1 = AE_SEXT32X2D16_32(AXo1);   // xr0, xi0
	//		L_tmp2 = AE_SEXT32X2D16_10(AXo1);   // xr1, xi1
	//		L_tmp3 = AE_SEXT32X2D16_32(AXo2);   // yr0, yi0
	//		L_tmp4 = AE_SEXT32X2D16_10(AXo2);   // yr1, yi1
	//		L_tmp5 = AE_ADD32S(L_tmp1, L_tmp3);          // xr0 + yr0,  xi0 +  yi0   =>  X_F_r0, X_F_i0
	//		L_tmp1 = AE_SUB32S(L_tmp1, L_tmp3);          // xr0 - yr0,  xi0 -  yi0   =>  X_B_r0, X_B_i0

	//		L_tmp3 = AE_ADD32S(L_tmp2, L_tmp4);          // xr1 + yr1,  xi1 +  yi1   =>  X_F_r1, X_F_i1
	//		L_tmp2 = AE_SUB32S(L_tmp2, L_tmp4);          // xr1 - yr1,  xi1 -  yi1   =>  X_B_r1, X_B_i1

	//		L_tmp5 = AE_SRAA32S(L_tmp5, 1);
	//		L_tmp1 = AE_SRAA32S(L_tmp1, 1);
	//		L_tmp3 = AE_SRAA32S(L_tmp3, 1);
	//		L_tmp2 = AE_SRAA32S(L_tmp2, 1);

	//		AXo1 = AE_SAT16X4(L_tmp5, L_tmp3);
	//		AXo2 = AE_SAT16X4(L_tmp1, L_tmp2);

	//		AE_SA16X4_IP(AXo1, align2, pt2);
	//		AE_SA16X4_IP(AXo2, align3, pt3);

	//	}
	//	AE_SA64POS_FP(align2, pt2);
	//	AE_SA64POS_FP(align3, pt3);
	//}


	//if (Flag_Tx_silent_mode_BF == 1)
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		short idx_real = 2 * i;
	//		short idx_imag = 2 * i + 1;

	//		X_F_NSR[idx_real] = Xo1[idx_real]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
	//		X_F_NSR[idx_imag] = Xo1[idx_imag]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
	//	}
	//}

	if ((Flag_AbnormalMic == 1))
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = Xo1[idx_real];// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = Xo1[idx_imag];// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
			X_B_NSR[idx_real] = 0;// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_sub(Xo1[idx_real], Xo2[idx_real]), 1));
			X_B_NSR[idx_imag] = 0;// DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_sub(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}

	if (Flag_wind == 1)
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}

	if (Flag_Tx_silent_mode_BF == 1)
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;

			X_F_NSR[idx_real] = Xo1[idx_real]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_real], Xo2[idx_real]), 1));
			X_F_NSR[idx_imag] = Xo1[idx_imag]; // DVTXOP_saturate(DVTXOP_L_shr(DVTXOP_L_add(Xo1[idx_imag], Xo2[idx_imag]), 1));
		}
	}


	return Flag_AbnormalMic;
}
#endif

#ifndef GSCMIC_OPT
int normW[DVTX_FFT_HALFLEN_WB/* + 1*/] = { 0, };
int deltaW[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2] = { 0, };
int XXbm[DVTX_FFT_HALFLEN_WB/* + 1*/] = { 0, };
int PwrDSVal[DVTX_FFT_HALFLEN_WB/* + 1*/] = { 0, };
int MICout[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2] = { 0, };
void fn_freqGSCMIC(/*out*/short *Out_GSC, /*in*/short *X_FB, short *X_BM, short BLK_NORM, short *W, short VADFrm, short mu, short *WgscFreqUpdate)
{
	short i, idx_real, idx_imag, q_delta;
	short tmp;
	int Ltmp, thr;



	int PwrAvg;

	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
	{
		idx_real = i << 1;
		idx_imag = idx_real + 1;

		MICout[idx_real] = DVTXOP_L_mult(X_BM[idx_real], W[idx_real]); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
		MICout[idx_real] = DVTXOP_L_mac(MICout[idx_real], X_BM[idx_imag], W[idx_imag]);

		MICout[idx_imag] = DVTXOP_L_mult(X_BM[idx_imag], W[idx_real]);
		MICout[idx_imag] = DVTXOP_L_msu(MICout[idx_imag], X_BM[idx_real], W[idx_imag]);

		MICout[idx_real] = DVTXOP_L_shr(MICout[idx_real], W_COEF_Q + 1);// Q(BLK_NORM)
		MICout[idx_imag] = DVTXOP_L_shr(MICout[idx_imag], W_COEF_Q + 1);// Q(BLK_NORM)

		Out_GSC[idx_real] = DVTXOP_L_sub(X_FB[idx_real], DVTXOP_saturate(MICout[idx_real]));
		Out_GSC[idx_imag] = DVTXOP_L_sub(X_FB[idx_imag], DVTXOP_saturate(MICout[idx_imag]));
	}

	if (VADFrm == 0) //for noisy frame
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
		{
			idx_real = i << 1;
			idx_imag = idx_real + 1;

			XXbm[i] = DVTXOP_L_mult(X_BM[idx_real], X_BM[idx_real]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
			XXbm[i] = DVTXOP_L_mac(XXbm[i], X_BM[idx_imag], X_BM[idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)

			thr = DVTXOP_L_shl(10000, (2 * BLK_NORM + 1 - 16)); //Q(2 * BLK_NORM + 1 - 16)
			XXbm[i] = (XXbm[i] < thr) ? thr : XXbm[i];

			PwrAvg = 0;
			PwrDSVal[i] = DVTXOP_L_add(XXbm[i], PwrAvg); //Q(2*BLK_NORM+1)

			if (WgscFreqUpdate[i])
			{
				Ltmp = DVTXOP_L_mult(X_BM[idx_real], Out_GSC[idx_real]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mac(Ltmp, X_BM[idx_imag], Out_GSC[idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
#ifndef DIVIDE_TEST4
				deltaW[idx_real] = divide(Ltmp, (2 * BLK_NORM + 1), PwrDSVal[i], (2 * BLK_NORM + 1), W_COEF_Q);
#else
				deltaW[idx_real] = DVTXOP_divide_sdivlimit15(Ltmp, PwrDSVal[i]);
				deltaW[idx_real] = DVTXOP_L_shr(deltaW[idx_real], 2/*15 - W_COEF_Q*/);
#endif
			}
			else
			{
				deltaW[idx_real] = 0;
			}

			if (WgscFreqUpdate[i])
			{
				Ltmp = DVTXOP_L_mult(X_BM[idx_imag], Out_GSC[idx_real]);
				Ltmp = DVTXOP_L_msu(Ltmp, X_BM[idx_real], Out_GSC[idx_imag]);
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);
#ifndef DIVIDE_TEST4
				deltaW[idx_imag] = divide(Ltmp, (2 * BLK_NORM + 1), PwrDSVal[i], (2 * BLK_NORM + 1), W_COEF_Q);
#else
				deltaW[idx_imag] = DVTXOP_divide_sdivlimit15(Ltmp, PwrDSVal[i]);
				deltaW[idx_imag] = DVTXOP_L_shr(deltaW[idx_imag], 2/*15 - W_COEF_Q*/);
#endif
			}
			else
			{
				deltaW[idx_imag] = 0;
			}

			normW[i] = DVTXOP_L_mult(deltaW[idx_real], deltaW[idx_real]); //Q(2*W_COEF_Q+1)
			normW[i] = DVTXOP_L_mac(normW[i], deltaW[idx_imag], deltaW[idx_imag]);

			if (normW[i] > 26843545/*0.2(Q27)*/)
			{
				Ltmp = sqrt32(DVTXOP_L_shl(normW[i], 1));//Q(2*W_COEF_Q+1+1) => Q(W_COEF_Q+1)
#ifndef DIVIDE_TEST4
				deltaW[idx_real] = divide(deltaW[idx_real], W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
				deltaW[idx_imag] = divide(deltaW[idx_imag], W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
#else
				Ltmp = DVTXOP_L_shr(Ltmp, 1);
				deltaW[idx_real] = DVTXOP_divide_sdivlimit15(deltaW[idx_real], Ltmp);
				deltaW[idx_real] = DVTXOP_L_shr(deltaW[idx_real], 2/*15 - W_COEF_Q*/);
				deltaW[idx_imag] = DVTXOP_divide_sdivlimit15(deltaW[idx_imag], Ltmp);
				deltaW[idx_imag] = DVTXOP_L_shr(deltaW[idx_imag], 2/*15 - W_COEF_Q*/);
#endif
			}

			W[idx_real] = DVTXOP_add(W[idx_real], DVTXOP_saturate(deltaW[idx_real]));//Q(W_COEF_Q)
			W[idx_imag] = DVTXOP_add(W[idx_imag], DVTXOP_saturate(deltaW[idx_imag]));//Q(W_COEF_Q)
		}
	}

	return;
}

//int normW_Nframe[DVTX_FFT_HALFLEN_WB/* + 1*/] = { 0, };
//int PwrDSVal_Nframe[DVTX_FFT_HALFLEN_WB/* + 1*/] = { 0, };
//int deltaW_Nframe[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2] = { 0, };
//int MICout_Nframe[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2] = { 0, };
//void fn_freqGSCMIC_Nframe(/*out*/short *Out_GSC, /*in*/short *X_FB, short(*X_BMNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short BLK_NORM, short(*WNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short VADFrm, short *mu, short *WgscFreqUpdate, short NgscDMA)
//{
//	short i, n, idx_real, idx_imag, tmp;
//	int Ltmp;
//
//	// tmpnormvec = linspace(10000, 100, NfftHalf)';
//
//
//	for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
//	{
//		idx_real = i << 1;
//		idx_imag = idx_real + 1;
//
//		MICout_Nframe[idx_real] = DVTXOP_L_mult(WNfrm[0][idx_real], X_BMNfrm[0][idx_real]); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//		MICout_Nframe[idx_real] = DVTXOP_L_mac(MICout_Nframe[idx_real], WNfrm[0][idx_imag], X_BMNfrm[0][idx_imag]);
//		MICout_Nframe[idx_real] = DVTXOP_L_mac(MICout_Nframe[idx_real], WNfrm[1][idx_real], X_BMNfrm[1][idx_real]);
//		MICout_Nframe[idx_real] = DVTXOP_L_mac(MICout_Nframe[idx_real], WNfrm[1][idx_imag], X_BMNfrm[1][idx_imag]);
//		MICout_Nframe[idx_real] = MICout_Nframe[idx_real] >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//		MICout_Nframe[idx_imag] = DVTXOP_L_mult(WNfrm[0][idx_real], X_BMNfrm[0][idx_imag]);
//		MICout_Nframe[idx_imag] = DVTXOP_L_msu(MICout_Nframe[idx_imag], WNfrm[0][idx_imag], X_BMNfrm[0][idx_real]);
//		MICout_Nframe[idx_imag] = DVTXOP_L_mac(MICout_Nframe[idx_imag], WNfrm[1][idx_real], X_BMNfrm[1][idx_imag]);
//		MICout_Nframe[idx_imag] = DVTXOP_L_msu(MICout_Nframe[idx_imag], WNfrm[1][idx_imag], X_BMNfrm[1][idx_real]);
//		MICout_Nframe[idx_imag] = MICout_Nframe[idx_imag] >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//		MICout_Nframe[idx_real] = DVTXOP_L_shr(MICout_Nframe[idx_real], W_COEF_Q + 1);// Q(BLK_NORM)
//		MICout_Nframe[idx_imag] = DVTXOP_L_shr(MICout_Nframe[idx_imag], W_COEF_Q + 1);// Q(BLK_NORM)
//
//		Out_GSC[idx_real] = DVTXOP_L_sub(X_FB[idx_real], DVTXOP_saturate(MICout_Nframe[idx_real]));
//		Out_GSC[idx_imag] = DVTXOP_L_sub(X_FB[idx_imag], DVTXOP_saturate(MICout_Nframe[idx_imag]));
//	}
//
//	if (VADFrm == 0) // for noisy frame
//	{
//		for (n = 0; n < NgscDMA; n++)
//		{
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
//			{
//				short idx_real = 2 * i;
//				short idx_imag = 2 * i + 1;
//
//				PwrDSVal_Nframe[i] = DVTXOP_L_mult(X_BMNfrm[n][idx_real], X_BMNfrm[n][idx_real]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				PwrDSVal_Nframe[i] = DVTXOP_L_mac(PwrDSVal_Nframe[i], X_BMNfrm[n][idx_imag], X_BMNfrm[n][idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				PwrDSVal_Nframe[i] = DVTXOP_L_add(PwrDSVal_Nframe[i], DVTXOP_L_shl(10000, (2 * BLK_NORM + 1 - 16))/*10000 in float C code*/);
//
//				if (WgscFreqUpdate[i])
//				{
//					Ltmp = DVTXOP_L_mult(X_BMNfrm[n][idx_real], Out_GSC[idx_real]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//					Ltmp = DVTXOP_L_mac(Ltmp, X_BMNfrm[n][idx_imag], Out_GSC[idx_imag]); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//					Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu[n]);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//#ifndef DIVIDE_TEST4
//					deltaW_Nframe[idx_real] = divide(Ltmp, (2 * BLK_NORM + 1), PwrDSVal_Nframe[i], (2 * BLK_NORM + 1), W_COEF_Q);
//#else
//					deltaW_Nframe[idx_real] = DVTXOP_divide_sdivlimit15(Ltmp, PwrDSVal_Nframe[i]);
//					deltaW_Nframe[idx_real] = DVTXOP_L_shr(deltaW_Nframe[idx_real], 2/*15 - W_COEF_Q*/);
//#endif
//				}
//				else
//				{
//					deltaW_Nframe[idx_real] = 0;
//				}
//
//				if (WgscFreqUpdate[i])
//				{
//					Ltmp = DVTXOP_L_mult(X_BMNfrm[n][idx_imag], Out_GSC[idx_real]);
//					Ltmp = DVTXOP_L_msu(Ltmp, X_BMNfrm[n][idx_real], Out_GSC[idx_imag]);
//					Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu[n]);
//#ifndef DIVIDE_TEST4
//					deltaW_Nframe[idx_imag] = divide(Ltmp, (2 * BLK_NORM + 1), PwrDSVal_Nframe[i], (2 * BLK_NORM + 1), W_COEF_Q);
//#else
//					deltaW_Nframe[idx_imag] = DVTXOP_divide_sdivlimit15(Ltmp, PwrDSVal_Nframe[i]);
//					deltaW_Nframe[idx_imag] = DVTXOP_L_shr(deltaW_Nframe[idx_imag], 2/*15 - W_COEF_Q*/);
//#endif
//				}
//				else
//				{
//					deltaW_Nframe[idx_imag] = 0;
//				}
//
//				normW_Nframe[i] = DVTXOP_L_mult(deltaW_Nframe[idx_real], deltaW_Nframe[idx_real]);//Q(2*W_COEF_Q+1)
//				normW_Nframe[i] = DVTXOP_L_mac(normW_Nframe[i], deltaW_Nframe[idx_imag], deltaW_Nframe[idx_imag]);
//
//				if (normW_Nframe[i] > 26843545/*0.2(Q27)*/)
//				{
//					Ltmp = sqrt32(DVTXOP_L_shl(normW_Nframe[i], 1));//Q(2*W_COEF_Q+1+1) => Q(W_COEF_Q+1)
//#ifndef DIVIDE_TEST4
//					deltaW_Nframe[idx_real] = divide(deltaW_Nframe[idx_real], W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
//					deltaW_Nframe[idx_imag] = divide(deltaW_Nframe[idx_imag], W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
//#else
//					Ltmp = DVTXOP_L_shr(Ltmp, 1);
//					deltaW_Nframe[idx_real] = DVTXOP_divide_sdivlimit15(deltaW_Nframe[idx_real], Ltmp);
//					deltaW_Nframe[idx_real] = DVTXOP_L_shr(deltaW_Nframe[idx_real], 2/*15 - W_COEF_Q*/);
//					deltaW_Nframe[idx_imag] = DVTXOP_divide_sdivlimit15(deltaW_Nframe[idx_imag], Ltmp);
//					deltaW_Nframe[idx_imag] = DVTXOP_L_shr(deltaW_Nframe[idx_imag], 2/*15 - W_COEF_Q*/);
//#endif
//				}
//				WNfrm[n][idx_real] = DVTXOP_add(WNfrm[n][idx_real], DVTXOP_saturate(deltaW_Nframe[idx_real]));//Q(W_COEF_Q)
//				WNfrm[n][idx_imag] = DVTXOP_add(WNfrm[n][idx_imag], DVTXOP_saturate(deltaW_Nframe[idx_imag]));//Q(W_COEF_Q)
//			}
//		}
//	}
//
//	return;
//}
#else
void fn_freqGSCMIC(/*out*/short *Out_GSC, /*in*/short *X_FB, short *X_BM, short BLK_NORM, short *W, short VADFrm, short mu, short *WgscFreqUpdate)
{
	short i, idx_real, idx_imag,idx_real1, idx_imag1, q_delta;
	short tmp;
	int Ltmp, thr;

	int pwrDSVal_var;
	int pwrDSVal_var1;
	int MICout_real, MICout_imag;
	int MICout_real1, MICout_imag1;
	int normW;
	int normW1;
	int PwrAvg;
	int deltaW_real, deltaW_imag;
	int deltaW_real1, deltaW_imag1;
	int XXbm;
	int XXbm1;

	//XXbm = (XXbm < 1.0e4) ? 1.0e4 : XXbm;

	if (VADFrm == 0) //for noisy frame
	{
		thr = DVTXOP_L_shl(10000, (2 * BLK_NORM + 1 - 16)); //Q(2 * BLK_NORM + 1 - 16)

		for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=2)
		{
			idx_real = i << 1;
			idx_imag = idx_real + 1;
			idx_real1 = idx_imag + 1;
			idx_imag1 = idx_real1 + 1;
			// XXbm? Q format => Q(2*BLK_NORM+1)    : matlab ??
			//                 => Q(2*BLK_NORM+1-16) : floating C ??
			short xbmr = X_BM[idx_real];
			short xbmi = X_BM[idx_imag];
			short xbmr1 = X_BM[idx_real1];
			short xbmi1 = X_BM[idx_imag1];

			short Wr = W[idx_real];
			short Wi = W[idx_imag];
			short Wr1 = W[idx_real1];
			short Wi1 = W[idx_imag1];

			MICout_real = DVTXOP_L_mult(xbmr, Wr); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
			MICout_real = DVTXOP_L_mac(MICout_real, xbmi, Wi);

			//MICout[idx_imag] = Wr * xbmi - Wi * xbmr;
			MICout_imag = DVTXOP_L_mult(xbmi, Wr);
			MICout_imag = DVTXOP_L_msu(MICout_imag, xbmr, Wi);


			MICout_real = DVTXOP_L_shr(MICout_real, W_COEF_Q + 1);// Q(BLK_NORM)
			MICout_imag = DVTXOP_L_shr(MICout_imag, W_COEF_Q + 1);// Q(BLK_NORM)

			MICout_real1 = DVTXOP_L_mult(xbmr1, Wr1); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
			MICout_real1 = DVTXOP_L_mac(MICout_real1, xbmi1, Wi1);

			//MICout[idx_imag] = Wr * xbmi - Wi * xbmr;
			MICout_imag1 = DVTXOP_L_mult(xbmi1, Wr1);
			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, xbmr1, Wi1);

			MICout_real1 = DVTXOP_L_shr(MICout_real1, W_COEF_Q + 1);// Q(BLK_NORM)
			MICout_imag1 = DVTXOP_L_shr(MICout_imag1, W_COEF_Q + 1);// Q(BLK_NORM)


			int gscr = Out_GSC[idx_real] = DVTXOP_L_sub(X_FB[idx_real], DVTXOP_saturate(MICout_real));
			int gsci = Out_GSC[idx_imag] = DVTXOP_L_sub(X_FB[idx_imag], DVTXOP_saturate(MICout_imag));
			int gscr1 = Out_GSC[idx_real1] = DVTXOP_L_sub(X_FB[idx_real1], DVTXOP_saturate(MICout_real1));
			int gsci1 = Out_GSC[idx_imag1] = DVTXOP_L_sub(X_FB[idx_imag1], DVTXOP_saturate(MICout_imag1));

			//XXbm = xbmr * X_BM[idx_real] + xbmi * xbmi;





			//PwrAvg = 0;
			//PwrDSVal[i] = (XXbm + PwrAvg);
			//pwrDSVal_var = DVTXOP_L_add(XXbm, PwrAvg); //Q(2*BLK_NORM+1)

			//deltaW_real = WgscFreqUpdate[i] * mu * (xbmr * Out_GSC[idx_real] + xbmi * Out_GSC[idx_imag]) / PwrDSVal[i];
			//deltaW_imag = WgscFreqUpdate[i] * mu * (xbmi * Out_GSC[idx_real] - xbmr * Out_GSC[idx_imag]) / PwrDSVal[i];

			if (WgscFreqUpdate[i] & WgscFreqUpdate[i+1])
			{
				XXbm = DVTXOP_L_mult(xbmr, xbmr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				XXbm = DVTXOP_L_mac(XXbm, xbmi, xbmi); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				XXbm1 = DVTXOP_L_mult(xbmr1, xbmr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				XXbm1 = DVTXOP_L_mac(XXbm1, xbmi1, xbmi1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				pwrDSVal_var = (XXbm < thr) ? thr : XXbm;
				pwrDSVal_var1 = (XXbm1 < thr) ? thr : XXbm1;

				Ltmp = DVTXOP_L_mult(xbmr, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mac(Ltmp, xbmi, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
				deltaW_real = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var, (2 * BLK_NORM + 1), W_COEF_Q);
				Ltmp = DVTXOP_L_mult(xbmi, gscr);
				Ltmp = DVTXOP_L_msu(Ltmp, xbmr, gsci);
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);
				deltaW_imag = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var, (2 * BLK_NORM + 1), W_COEF_Q);

				Ltmp = DVTXOP_L_mult(xbmr1, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mac(Ltmp, xbmi1, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
				deltaW_real1 = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var1, (2 * BLK_NORM + 1), W_COEF_Q);
				Ltmp = DVTXOP_L_mult(xbmi1, gscr1);
				Ltmp = DVTXOP_L_msu(Ltmp, xbmr1, gsci1);
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);
				deltaW_imag1 = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var1, (2 * BLK_NORM + 1), W_COEF_Q);

				//normW[i] = deltaW_real * deltaW_real + deltaW_imag * deltaW_imag;
				normW = DVTXOP_L_mult(deltaW_real, deltaW_real); //Q(2*W_COEF_Q+1)
				normW = DVTXOP_L_mac(normW, deltaW_imag, deltaW_imag);
				normW1 = DVTXOP_L_mult(deltaW_real1, deltaW_real1); //Q(2*W_COEF_Q+1)
				normW1 = DVTXOP_L_mac(normW1, deltaW_imag1, deltaW_imag1);

				if (normW > 26843545/*0.2(Q27)*/)
				{
					//deltaW_real = deltaW_real / sqrt(normW[i]);
					//deltaW_imag = deltaW_imag / sqrt(normW[i]);
					Ltmp = sqrt32(DVTXOP_L_shl(normW, 1));//Q(2*W_COEF_Q+1)
					deltaW_real = divide(deltaW_real, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
					deltaW_imag = divide(deltaW_imag, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
				}
				if (normW1 > 26843545/*0.2(Q27)*/)
				{
					//deltaW_real = deltaW_real / sqrt(normW[i]);
					//deltaW_imag = deltaW_imag / sqrt(normW[i]);
					Ltmp = sqrt32(DVTXOP_L_shl(normW1, 1));//Q(2*W_COEF_Q+1)
					deltaW_real1 = divide(deltaW_real1, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
					deltaW_imag1 = divide(deltaW_imag1, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
				}

				//Wr = Wr + deltaW_real;
				//W[idx_imag] = W[idx_imag] + deltaW_imag;
				W[idx_real] = DVTXOP_add(Wr, DVTXOP_saturate(deltaW_real));//Q(W_COEF_Q)
				W[idx_imag] = DVTXOP_add(Wi, DVTXOP_saturate(deltaW_imag));//Q(W_COEF_Q)
				W[idx_real1] = DVTXOP_add(Wr1, DVTXOP_saturate(deltaW_real1));//Q(W_COEF_Q)
				W[idx_imag1] = DVTXOP_add(Wi1, DVTXOP_saturate(deltaW_imag1));//Q(W_COEF_Q)
			}
			else if (WgscFreqUpdate[i])
			{
				XXbm = DVTXOP_L_mult(xbmr, xbmr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				XXbm = DVTXOP_L_mac(XXbm, xbmi, xbmi); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				pwrDSVal_var = (XXbm < thr) ? thr : XXbm;
				Ltmp = DVTXOP_L_mult(xbmr, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mac(Ltmp, xbmi, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
				deltaW_real = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var, (2 * BLK_NORM + 1), W_COEF_Q);
				Ltmp = DVTXOP_L_mult(xbmi, gscr);
				Ltmp = DVTXOP_L_msu(Ltmp, xbmr, gsci);
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);
				deltaW_imag = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var, (2 * BLK_NORM + 1), W_COEF_Q);
				//normW[i] = deltaW_real * deltaW_real + deltaW_imag * deltaW_imag;
				normW = DVTXOP_L_mult(deltaW_real, deltaW_real); //Q(2*W_COEF_Q+1)
				normW = DVTXOP_L_mac(normW, deltaW_imag, deltaW_imag);

				if (normW > 26843545/*0.2(Q27)*/)
				{
					//deltaW_real = deltaW_real / sqrt(normW[i]);
					//deltaW_imag = deltaW_imag / sqrt(normW[i]);
					Ltmp = sqrt32(DVTXOP_L_shl(normW, 1));//Q(2*W_COEF_Q+1)
					deltaW_real = divide(deltaW_real, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
					deltaW_imag = divide(deltaW_imag, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
				}

				//Wr = Wr + deltaW_real;
				//W[idx_imag] = W[idx_imag] + deltaW_imag;
				W[idx_real] = DVTXOP_add(Wr, DVTXOP_saturate(deltaW_real));//Q(W_COEF_Q)
				W[idx_imag] = DVTXOP_add(Wi, DVTXOP_saturate(deltaW_imag));//Q(W_COEF_Q)


			}
			else if (WgscFreqUpdate[i+1])
			{
				XXbm1 = DVTXOP_L_mult(xbmr1, xbmr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				XXbm1 = DVTXOP_L_mac(XXbm1, xbmi1, xbmi1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				pwrDSVal_var1 = (XXbm1 < thr) ? thr : XXbm1;
				Ltmp = DVTXOP_L_mult(xbmr1, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mac(Ltmp, xbmi1, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
				deltaW_real1 = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var1, (2 * BLK_NORM + 1), W_COEF_Q);
				Ltmp = DVTXOP_L_mult(xbmi1, gscr1);
				Ltmp = DVTXOP_L_msu(Ltmp, xbmr1, gsci1);
				Ltmp = DVTXOP_L_mpy_ls(Ltmp, mu);
				deltaW_imag1 = divide(Ltmp, (2 * BLK_NORM + 1), pwrDSVal_var1, (2 * BLK_NORM + 1), W_COEF_Q);
				normW1 = DVTXOP_L_mult(deltaW_real1, deltaW_real1); //Q(2*W_COEF_Q+1)
				normW1 = DVTXOP_L_mac(normW1, deltaW_imag1, deltaW_imag1);
				if (normW1 > 26843545/*0.2(Q27)*/)
				{
					//deltaW_real = deltaW_real / sqrt(normW[i]);
					//deltaW_imag = deltaW_imag / sqrt(normW[i]);
					Ltmp = sqrt32(DVTXOP_L_shl(normW1, 1));//Q(2*W_COEF_Q+1)
					deltaW_real1 = divide(deltaW_real1, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
					deltaW_imag1 = divide(deltaW_imag1, W_COEF_Q, Ltmp, (W_COEF_Q + 1), W_COEF_Q);
				}

				//Wr = Wr + deltaW_real;
				//W[idx_imag] = W[idx_imag] + deltaW_imag;
				W[idx_real1] = DVTXOP_add(Wr1, DVTXOP_saturate(deltaW_real1));//Q(W_COEF_Q)
				W[idx_imag1] = DVTXOP_add(Wi1, DVTXOP_saturate(deltaW_imag1));//Q(W_COEF_Q)
			}
		}
	}
	else
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=2)
		{
			idx_real = i << 1;
			idx_imag = idx_real + 1;
			idx_real1 = idx_imag + 1;
			idx_imag1 = idx_real1 + 1;
			// XXbm? Q format => Q(2*BLK_NORM+1)    : matlab ??
			//                 => Q(2*BLK_NORM+1-16) : floating C ??
			short xbmr = X_BM[idx_real];
			short xbmi = X_BM[idx_imag];
			short xbmr1 = X_BM[idx_real1];
			short xbmi1 = X_BM[idx_imag1];

			short Wr = W[idx_real];
			short Wi = W[idx_imag];
			short Wr1 = W[idx_real1];
			short Wi1 = W[idx_imag1];

			MICout_real = DVTXOP_L_mult(xbmr, Wr); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
			MICout_real = DVTXOP_L_mac(MICout_real, xbmi, Wi);

			//MICout[idx_imag] = Wr * xbmi - Wi * xbmr;
			MICout_imag = DVTXOP_L_mult(xbmi, Wr);
			MICout_imag = DVTXOP_L_msu(MICout_imag, xbmr, Wi);

			MICout_real = DVTXOP_L_shr(MICout_real, W_COEF_Q + 1);// Q(BLK_NORM)
			MICout_imag = DVTXOP_L_shr(MICout_imag, W_COEF_Q + 1);// Q(BLK_NORM)

			MICout_real1 = DVTXOP_L_mult(xbmr1, Wr1); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
			MICout_real1 = DVTXOP_L_mac(MICout_real1, xbmi1, Wi1);

			//MICout[idx_imag] = Wr * xbmi - Wi * xbmr;
			MICout_imag1 = DVTXOP_L_mult(xbmi1, Wr1);
			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, xbmr1, Wi1);

			MICout_real1 = DVTXOP_L_shr(MICout_real1, W_COEF_Q + 1);// Q(BLK_NORM)
			MICout_imag1 = DVTXOP_L_shr(MICout_imag1, W_COEF_Q + 1);// Q(BLK_NORM)


			Out_GSC[idx_real] = DVTXOP_L_sub(X_FB[idx_real], DVTXOP_saturate(MICout_real));
			Out_GSC[idx_imag] = DVTXOP_L_sub(X_FB[idx_imag], DVTXOP_saturate(MICout_imag));
			Out_GSC[idx_real1] = DVTXOP_L_sub(X_FB[idx_real1], DVTXOP_saturate(MICout_real1));
			Out_GSC[idx_imag1] = DVTXOP_L_sub(X_FB[idx_imag1], DVTXOP_saturate(MICout_imag1));
		}
	}
	return;
}


#ifndef GSC_Opt_NonBitexact
//void fn_freqGSCMIC_Nframe(/*out*/short *Out_GSC, /*in*/short *X_FB, short(*X_BMNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short BLK_NORM, short(*WNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short VADFrm, short *mu, short *WgscFreqUpdate, short NgscDMA)
//{
//	short i, n, idx_real0, idx_imag0, idx_real1, idx_imag1, tmp;
//	int Ltmp;
//
//
//	int pwrDSVal_var01, pwrDSVal_var02, pwrDSVal_var11, pwrDSVal_var12;
//	int MICout_real0, MICout_imag0, MICout_real1, MICout_imag1;
//	int normW;
//	int PwrAvg;
//	int deltaW_real, deltaW_imag;
//	int XXbm;
//	if (VADFrm == 0) // for noisy frame
//	{
//		int BLK_1000_shf = DVTXOP_L_shl(10000, (2 * BLK_NORM + 1 - 16));
//
//		int mu_val0 =mu[0];
//		int mu_val1 =mu[1];
//		int q=(2 * BLK_NORM + 1);
//		int deltaW_real00, deltaW_imag00;
//		int deltaW_real10, deltaW_imag10;
//        int deltaW_real01, deltaW_imag01;
//		int deltaW_real11, deltaW_imag11;
//		int normW00;
//		int normW10;
//        int normW01;
//		int normW11;
//		int Ltmp0;
//		int Ltmp1;
//
//		for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i+=1)
//		{
//			idx_real0 = i << 1;
//			idx_imag0 = idx_real0 + 1;
//
//
//			int x00r = X_BMNfrm[0][idx_real0];
//			int x10r = X_BMNfrm[1][idx_real0];
//			int x00i = X_BMNfrm[0][idx_imag0];
//			int x10i = X_BMNfrm[1][idx_imag0];
//
//			int w00r = WNfrm[0][idx_real0];
//			int w10r = WNfrm[1][idx_real0];
//			int w00i = WNfrm[0][idx_imag0];
//			int w10i = WNfrm[1][idx_imag0];
//
//
//
//
//			MICout_real0 = DVTXOP_L_mult(w00r, x00r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w00i, x00i);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10r, x10r);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10i, x10i);
//			MICout_real0 = MICout_real0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//
//
//
//			MICout_imag0 = DVTXOP_L_mult(w00r, x00i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w00i, x00r);
//			MICout_imag0 = DVTXOP_L_mac(MICout_imag0, w10r, x10i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w10i, x10r);
//			MICout_imag0 = MICout_imag0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//
//
//			MICout_real0 = DVTXOP_L_shr(MICout_real0, W_COEF_Q + 1);// Q(BLK_NORM)
//			MICout_imag0 = DVTXOP_L_shr(MICout_imag0, W_COEF_Q + 1);// Q(BLK_NORM)
//
//
//
//			int gscr = DVTXOP_L_sub(X_FB[idx_real0], DVTXOP_saturate(MICout_real0));
//			int gsci = DVTXOP_L_sub(X_FB[idx_imag0], DVTXOP_saturate(MICout_imag0));
//
//
//			Out_GSC[idx_real0] = gscr;
//			Out_GSC[idx_imag0] = gsci;
//
//
//            if (WgscFreqUpdate[i])
//            {
//    			pwrDSVal_var01 = DVTXOP_L_mult(x00r, x00r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var01 = DVTXOP_L_mac(pwrDSVal_var01, x00i, x00i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var01 = DVTXOP_L_add(pwrDSVal_var01, BLK_1000_shf);
//
//
//    			pwrDSVal_var02 = DVTXOP_L_mult(x10r, x10r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var02 = DVTXOP_L_mac(pwrDSVal_var02, x10i, x10i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var02 = DVTXOP_L_add(pwrDSVal_var02, BLK_1000_shf);
//
//            	Ltmp0 = DVTXOP_L_mult(x00r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mac(Ltmp0, x00i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//                Ltmp0 = DVTXOP_L_mult(x00i, gscr);
//				Ltmp0 = DVTXOP_L_msu(Ltmp0, x00r, gsci);
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);
//				deltaW_imag00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//
//				Ltmp1 = DVTXOP_L_mult(x10r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mac(Ltmp1, x10i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);
//				Ltmp1 = DVTXOP_L_mult(x10i, gscr);
//				Ltmp1 = DVTXOP_L_msu(Ltmp1, x10r, gsci);
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);
//				deltaW_imag10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);
//
//
//				normW00 = DVTXOP_L_mult(deltaW_real00, deltaW_real00);//Q(2*W_COEF_Q+1)
//				normW00 = DVTXOP_L_mac(normW00, deltaW_imag00, deltaW_imag00);
//				normW10 = DVTXOP_L_mult(deltaW_real10, deltaW_real10);//Q(2*W_COEF_Q+1)
//				normW10 = DVTXOP_L_mac(normW10, deltaW_imag10, deltaW_imag10);
//
//
//
//				if (normW00 > 26843545/*0.2(Q27)*/)
//				{
//					Ltmp0 = sqrt32(DVTXOP_L_shl(normW00,1));//Q(2*W_COEF_Q+1)
//					deltaW_real00 = divide(deltaW_real00, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//					deltaW_imag00 = divide(deltaW_imag00, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//				}
//				if (normW10 > 26843545/*0.2(Q27)*/)
//				{
//					Ltmp1 = sqrt32(DVTXOP_L_shl(normW10,1));//Q(2*W_COEF_Q+1)
//					deltaW_real10 = divide(deltaW_real10, W_COEF_Q, Ltmp1, (W_COEF_Q + 1), W_COEF_Q);
//					deltaW_imag10 = divide(deltaW_imag10, W_COEF_Q, Ltmp1, (W_COEF_Q + 1), W_COEF_Q);
//				}
//				WNfrm[0][idx_real0] = DVTXOP_add(w00r, DVTXOP_saturate(deltaW_real00));//Q(W_COEF_Q)
//				WNfrm[0][idx_imag0] = DVTXOP_add(w00i, DVTXOP_saturate(deltaW_imag00));//Q(W_COEF_Q)
//				WNfrm[1][idx_real0] = DVTXOP_add(w10r, DVTXOP_saturate(deltaW_real10));//Q(W_COEF_Q)
//				WNfrm[1][idx_imag0] = DVTXOP_add(w10i, DVTXOP_saturate(deltaW_imag10));//Q(W_COEF_Q)
//            }
//
//		}
//
//	}
//	else
//	{
//		for (i = 0; i < DVTX_FFT_HALFLEN_WB/* + 1*/; i++)
//		{
//			idx_real0 = i << 1;
//			idx_imag0 = idx_real0 + 1;
//
//			int x00r = X_BMNfrm[0][idx_real0];
//			int x10r = X_BMNfrm[1][idx_real0];
//			int x00i = X_BMNfrm[0][idx_imag0];
//			int x10i = X_BMNfrm[1][idx_imag0];
//
//			int w00r = WNfrm[0][idx_real0];
//			int w10r = WNfrm[1][idx_real0];
//			int w00i = WNfrm[0][idx_imag0];
//			int w10i = WNfrm[1][idx_imag0];
//
//			MICout_real0 = DVTXOP_L_mult(w00r, x00r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w00i, x00i);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10r, x10r);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10i, x10i);
//			MICout_real0 = MICout_real0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//            MICout_real1 = DVTXOP_L_mult(w00r, x00r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real1 = DVTXOP_L_mac(MICout_real0, w00i, x00i);
//			MICout_real1 = DVTXOP_L_mac(MICout_real0, w10r, x10r);
//			MICout_real1 = DVTXOP_L_mac(MICout_real0, w10i, x10i);
//			MICout_real1 = MICout_real0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//			MICout_imag0 = DVTXOP_L_mult(w00r, x00i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w00i, x00r);
//			MICout_imag0 = DVTXOP_L_mac(MICout_imag0, w10r, x10i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w10i, x10r);
//			MICout_imag0 = MICout_imag0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//			MICout_real0 = DVTXOP_L_shr(MICout_real0, W_COEF_Q + 1);
//			MICout_imag0 = DVTXOP_L_shr(MICout_imag0, W_COEF_Q + 1);
//
//			Out_GSC[idx_real0] = DVTXOP_L_sub(X_FB[idx_real0], DVTXOP_saturate(MICout_real0));
//			Out_GSC[idx_imag0] = DVTXOP_L_sub(X_FB[idx_imag0], DVTXOP_saturate(MICout_imag0));
//		}
//
//	}
//
//
//	return;
//}
#else
ae_int16x4 MASK31;
static __inline ae_int16x4 PreCmplxMul(ae_int16x4 var)
{
	ae_int16x4 tmp = AE_INT16X4_AND_INT16X4(var, MASK31);

	tmp = _TIE_xt_hifi2_AE_SLAA16S_vector(tmp,1);
	tmp = tmp - var;
	return tmp;

}
//void fn_freqGSCMIC_Nframe(/*out*/short *Out_GSC, /*in*/short *X_FB, short(*X_BMNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short BLK_NORM, short(*WNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2], short VADFrm, short *mu, short *WgscFreqUpdate, short NgscDMA)
//{
//	short i, n, idx_real0, idx_imag0, idx_real1, idx_imag1, tmp;
//	int Ltmp;
//
//
//	int pwrDSVal_var01, pwrDSVal_var02, pwrDSVal_var11, pwrDSVal_var12;
//	int MICout_real0, MICout_imag0, MICout_real1, MICout_imag1;
//	int normW;
//	int PwrAvg;
//	int deltaW_real, deltaW_imag;
//	int XXbm;
//	ae_int16x4 *X_BMN_ptr0 = X_BMNfrm;
//	ae_int16x4 *X_BMN_ptr1 = &X_BMNfrm[1][0];
//	ae_int16x4 *WNfrm_ptr0 = WNfrm;
//	ae_int16x4 *WNfrm_ptr1 = &WNfrm[1][0];
//	ae_int16x4 *X_FB_ptr = X_FB;
//	ae_int16x4 *Out_GSC_ptr = Out_GSC;
//	ae_valign align0  = AE_LA64_PP(X_BMN_ptr0);
//	ae_valign align1  = AE_LA64_PP(WNfrm_ptr0);
//	ae_valign align2  = AE_LA64_PP(X_FB_ptr);
//	ae_valign align3  = AE_LA64_PP(Out_GSC);
//
//
//	MASK31 = AE_MOVINT16X4_FROMINT64(0xFFFF0000FFFF0000LL);
//
//	if (VADFrm == 0) // for noisy frame
//	{
//		int BLK_1000_shf = DVTXOP_L_shl(10000, (2 * BLK_NORM + 1 - 16));
//
//		int mu_val0 =mu[0];
//		int mu_val1 =mu[1];
//		int q=(2 * BLK_NORM + 1);
//		int deltaW_real00, deltaW_imag00;
//		int deltaW_real10, deltaW_imag10;
//        int deltaW_real01, deltaW_imag01;
//		int deltaW_real11, deltaW_imag11;
//		int normW00;
//		int normW10;
//        int normW01;
//		int normW11;
//		int Ltmp0;
//		int Ltmp1;
//		ae_int16x4 I16x4_muval0_muval0 = AE_MOVINT16X4_FROMINT16(mu_val0<<1);
//		ae_int16x4 I16x4_muval1_muval1 = AE_MOVINT16X4_FROMINT16(mu_val1<<1);
//        int j;
//		for (i = 0,j=0; i < DVTX_FFT_HALFLEN_WB>>1/* + 1*/; i+=1, j+=2)
//		{
//			idx_real0 = i << 2;
//			idx_imag0 = idx_real0 + 1;
//			idx_real1 = idx_imag0+1;
//			idx_imag1 = idx_real1+1;
//
//			/*int x00r = X_BMNfrm[0][idx_real0];
//			int x10r = X_BMNfrm[1][idx_real0];
//			int x00i = X_BMNfrm[0][idx_imag0];
//			int x10i = X_BMNfrm[1][idx_imag0];
//
//			int w00r = WNfrm[0][idx_real0];
//			int w10r = WNfrm[1][idx_real0];
//			int w00i = WNfrm[0][idx_imag0];
//			int w10i = WNfrm[1][idx_imag0];
//
//			int x01r = X_BMNfrm[0][idx_real1];
//			int x11r = X_BMNfrm[1][idx_real1];
//			int x01i = X_BMNfrm[0][idx_imag1];
//			int x11i = X_BMNfrm[1][idx_imag1];
//
//			int w01r = WNfrm[0][idx_real1];
//			int w11r = WNfrm[1][idx_real1];
//			int w01i = WNfrm[0][idx_imag1];
//			int w11i = WNfrm[1][idx_imag1];*/
//
//
//			ae_int16x4 I16_x0rx0ix0rx0i, I16_x1rx1ix1rx1i, I16_XFB0r_0i_1r_1i;
//			AE_LA16X4_IP(I16_x0rx0ix0rx0i, align0, X_BMN_ptr0);
//			AE_LA16X4_IP(I16_x1rx1ix1rx1i, align0, X_BMN_ptr1);
//
//			ae_int32x2 I32_x0r_x0i0 = AE_CVT32X2F16_32(I16_x0rx0ix0rx0i)>>16;
//			ae_int32x2 I32_x0r_x0i1 = AE_CVT32X2F16_10(I16_x0rx0ix0rx0i)>>16;
//
//			ae_int32x2 I32_x1r_x1i0 = AE_CVT32X2F16_32(I16_x1rx1ix1rx1i)>>16;
//			ae_int32x2 I32_x1r_x1i1 = AE_CVT32X2F16_10(I16_x1rx1ix1rx1i)>>16;
//
//			ae_int16x4 I16_w0r_w0i, I16_w1r_w1i, I16_w0r_w0ib, I16_w1r_w1ib;
//
//			AE_LA16X4_IP(I16_w0r_w0i, align1, WNfrm_ptr0);
//			AE_LA16X4_IP(I16_w1r_w1i, align1, WNfrm_ptr1);
//
//
//			/*MICout_real0 = DVTXOP_L_mult(w00r, x00r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w00i, x00i);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10r, x10r);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10i, x10i);
//			MICout_real0 = MICout_real0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//			MICout_imag0 = DVTXOP_L_mult(w00r, x00i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w00i, x00r);
//			MICout_imag0 = DVTXOP_L_mac(MICout_imag0, w10r, x10i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w10i, x10r);
//			MICout_imag0 = MICout_imag0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)*/
//
//
//			I16_w0r_w0ib = I16_w0r_w0i;
//			I16_w1r_w1ib = I16_w1r_w1i;
//			I16_w0r_w0i = PreCmplxMul(I16_w0r_w0i);
//			I16_w1r_w1i = PreCmplxMul(I16_w1r_w1i);
//			ae_int32x2 I32_MIC_Re_Im00 = AE_MULC32X16_H(I32_x0r_x0i0, I16_w0r_w0i);
//			AE_MULAC32X16_H(I32_MIC_Re_Im00, I32_x1r_x1i0, I16_w1r_w1i);
//
//			/*MICout_real1 = DVTXOP_L_mult(w01r, x01r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w01i, x01i);
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w11r, x11r);
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w11i, x11i);
//			MICout_real1 = MICout_real1 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//            MICout_imag1 = DVTXOP_L_mult(w01r, x01i);
//			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, w01i, x01r);
//			MICout_imag1 = DVTXOP_L_mac(MICout_imag1, w11r, x11i);
//			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, w11i, x11r);
//			MICout_imag1 = MICout_imag1 >> 1;//Q(BLK_NORM+W_COEF_Q+1)*/
//
//			ae_int32x2 I32_MIC_Re_Im01 = AE_MULC32X16_L(I32_x0r_x0i1, I16_w0r_w0i);
//			AE_MULAC32X16_L(I32_MIC_Re_Im01, I32_x1r_x1i1, I16_w1r_w1i);
//
//			AE_LA16X4_IP(I16_XFB0r_0i_1r_1i, align2, X_FB_ptr);
//			ae_int32x2 I32_XFBr_i0 = AE_CVT32X2F16_32(I16_XFB0r_0i_1r_1i)>>16;
//			ae_int32x2 I32_XFBr_i1 = AE_CVT32X2F16_10(I16_XFB0r_0i_1r_1i)>>16;
//
//			/*MICout_real0 = DVTXOP_L_shr(MICout_real0, W_COEF_Q + 1);// Q(BLK_NORM)
//			MICout_imag0 = DVTXOP_L_shr(MICout_imag0, W_COEF_Q + 1);// Q(BLK_NORM)
//
//            MICout_real1 = DVTXOP_L_shr(MICout_real1, W_COEF_Q + 1);// Q(BLK_NORM)
//			MICout_imag1 = DVTXOP_L_shr(MICout_imag1, W_COEF_Q + 1);// Q(BLK_NORM)
//
//			int gscr = DVTXOP_L_sub(X_FB[idx_real0], DVTXOP_extract_l(MICout_real0));
//			int gsci = DVTXOP_L_sub(X_FB[idx_imag0], DVTXOP_extract_l(MICout_imag0));
//			int gscr1 = DVTXOP_L_sub(X_FB[idx_real1], DVTXOP_extract_l(MICout_real1));
//			int gsci1 = DVTXOP_L_sub(X_FB[idx_imag1], DVTXOP_extract_l(MICout_imag1));*/
//
//			I32_MIC_Re_Im00 = AE_SRAI32(I32_MIC_Re_Im00,W_COEF_Q + 1 );
//			I32_MIC_Re_Im01 = AE_SRAI32(I32_MIC_Re_Im01,W_COEF_Q + 1 );
//			ae_int32x2 I32_Out_GSC_r_i0 = AE_SUB32 (I32_XFBr_i0,I32_MIC_Re_Im00);
//			ae_int32x2 I32_Out_GSC_r_i1 = AE_SUB32 (I32_XFBr_i1,I32_MIC_Re_Im01);
//
//			ae_int16x4 I16x4_Out_GSC = AE_CVT16X4(I32_Out_GSC_r_i0, I32_Out_GSC_r_i1);
//
//			AE_SA16X4_IP(I16x4_Out_GSC, align3, Out_GSC_ptr);
//
//			/*
//			Out_GSC[idx_real0] = gscr;
//			Out_GSC[idx_imag0] = gsci;
//            Out_GSC[idx_real1] = gscr1;
//            Out_GSC[idx_imag1] = gsci1;*/
//
//
//
//			if (WgscFreqUpdate[j] && WgscFreqUpdate[j+1])
//			{
//				/*pwrDSVal_var01 = DVTXOP_L_mult(x00r, x00r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var01 = DVTXOP_L_mac(pwrDSVal_var01, x00i, x00i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var01 = DVTXOP_L_add(pwrDSVal_var01, BLK_1000_shf);
//
//	            pwrDSVal_var11 = DVTXOP_L_mult(x01r, x01r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var11 = DVTXOP_L_mac(pwrDSVal_var11, x01i, x01i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var11 = DVTXOP_L_add(pwrDSVal_var11, BLK_1000_shf);
//
//				pwrDSVal_var02 = DVTXOP_L_mult(x10r, x10r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var02 = DVTXOP_L_mac(pwrDSVal_var02, x10i, x10i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var02 = DVTXOP_L_add(pwrDSVal_var02, BLK_1000_shf);
//
//	            pwrDSVal_var12 = DVTXOP_L_mult(x11r, x11r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var12 = DVTXOP_L_mac(pwrDSVal_var12, x11i, x11i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				pwrDSVal_var12 = DVTXOP_L_add(pwrDSVal_var12, BLK_1000_shf);
//
//				Ltmp0 = DVTXOP_L_mult(x00r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mac(Ltmp0, x00i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//				Ltmp0 = DVTXOP_L_mult(x00i, gscr);
//				Ltmp0 = DVTXOP_L_msu(Ltmp0, x00r, gsci);
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);
//				deltaW_imag00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//
//				Ltmp1 = DVTXOP_L_mult(x10r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mac(Ltmp1, x10i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);
//				Ltmp1 = DVTXOP_L_mult(x10i, gscr);
//				Ltmp1 = DVTXOP_L_msu(Ltmp1, x10r, gsci);
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);
//				deltaW_imag10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);
//
//
//				Ltmp0 = DVTXOP_L_mult(x01r, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mac(Ltmp0, x01i, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real01 = divide(Ltmp0, q, pwrDSVal_var11, q, W_COEF_Q);
//				Ltmp0 = DVTXOP_L_mult(x01i, gscr1);
//				Ltmp0 = DVTXOP_L_msu(Ltmp0, x01r, gsci1);
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);
//				deltaW_imag01 = divide(Ltmp0, q, pwrDSVal_var11, q, W_COEF_Q);
//
//				Ltmp1 = DVTXOP_L_mult(x11r, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mac(Ltmp1, x11i, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real11 = divide(Ltmp1, q, pwrDSVal_var12, q, W_COEF_Q);
//				Ltmp1 = DVTXOP_L_mult(x11i, gscr1);
//				Ltmp1 = DVTXOP_L_msu(Ltmp1, x11r, gsci1);
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);
//				deltaW_imag11 = divide(Ltmp1, q, pwrDSVal_var12, q, W_COEF_Q);*/
//
//
//				pwrDSVal_var01 = AE_INT32X2_RADD(AE_MULP32X2(I32_x0r_x0i0<<1, I32_x0r_x0i0));
//				pwrDSVal_var01 = DVTXOP_L_add(pwrDSVal_var01, BLK_1000_shf);
//				pwrDSVal_var11 = AE_INT32X2_RADD(AE_MULP32X2(I32_x0r_x0i1<<1, I32_x0r_x0i1));
//				pwrDSVal_var11 = DVTXOP_L_add(pwrDSVal_var11, BLK_1000_shf);
//				pwrDSVal_var02 = AE_INT32X2_RADD(AE_MULP32X2(I32_x1r_x1i0<<1, I32_x1r_x1i0));
//				pwrDSVal_var02 = DVTXOP_L_add(pwrDSVal_var02, BLK_1000_shf);
//				pwrDSVal_var12 = AE_INT32X2_RADD(AE_MULP32X2(I32_x1r_x1i1<<1, I32_x1r_x1i1));
//				pwrDSVal_var12 = DVTXOP_L_add(pwrDSVal_var12, BLK_1000_shf);
//
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_0 = AE_MULC32X16_H(I32_x0r_x0i0,I16x4_Out_GSC);
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_1 = AE_MULC32X16_L(I32_x0r_x0i1,I16x4_Out_GSC);
//
//				I32x2_Ltmp0_Ltmp1_0 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_0, I16x4_muval0_muval0);
//				I32x2_Ltmp0_Ltmp1_1 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_1, I16x4_muval0_muval0);
//
//				deltaW_real00 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var01, q, W_COEF_Q);
//				deltaW_imag00 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var01, q, W_COEF_Q);
//
//				deltaW_real10 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var02, q, W_COEF_Q);
//				deltaW_imag10 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var02, q, W_COEF_Q);
//
//
//				I32x2_Ltmp0_Ltmp1_0 = AE_MULC32X16_H(I32_x1r_x1i0,I16x4_Out_GSC);
//				I32x2_Ltmp0_Ltmp1_1 = AE_MULC32X16_L(I32_x1r_x1i1,I16x4_Out_GSC);
//
//				I32x2_Ltmp0_Ltmp1_0 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_0, I16x4_muval1_muval1);
//				I32x2_Ltmp0_Ltmp1_1 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_1, I16x4_muval1_muval1);
//
//				deltaW_real01 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var11, q, W_COEF_Q);
//				deltaW_imag01 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var11, q, W_COEF_Q);
//
//				deltaW_real11 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var12, q, W_COEF_Q);
//				deltaW_imag11 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var12, q, W_COEF_Q);
//
//			}
//            else if (WgscFreqUpdate[j])
//            {
//
//    			/*pwrDSVal_var01 = DVTXOP_L_mult(x00r, x00r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var01 = DVTXOP_L_mac(pwrDSVal_var01, x00i, x00i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var01 = DVTXOP_L_add(pwrDSVal_var01, BLK_1000_shf);
//
//
//    			pwrDSVal_var02 = DVTXOP_L_mult(x10r, x10r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var02 = DVTXOP_L_mac(pwrDSVal_var02, x10i, x10i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var02 = DVTXOP_L_add(pwrDSVal_var02, BLK_1000_shf);
//
//
//            	Ltmp0 = DVTXOP_L_mult(x00r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mac(Ltmp0, x00i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//                Ltmp0 = DVTXOP_L_mult(x00i, gscr);
//				Ltmp0 = DVTXOP_L_msu(Ltmp0, x00r, gsci);
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);
//				deltaW_imag00 = divide(Ltmp0, q, pwrDSVal_var01, q, W_COEF_Q);
//
//				Ltmp1 = DVTXOP_L_mult(x10r, gscr); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mac(Ltmp1, x10i, gsci); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);
//				Ltmp1 = DVTXOP_L_mult(x10i, gscr);
//				Ltmp1 = DVTXOP_L_msu(Ltmp1, x10r, gsci);
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);
//				deltaW_imag10 = divide(Ltmp1, q, pwrDSVal_var02, q, W_COEF_Q);*/
//
//
//				pwrDSVal_var01 = AE_INT32X2_RADD(AE_MULP32X2(I32_x0r_x0i0<<1, I32_x0r_x0i0));
//				pwrDSVal_var01 = DVTXOP_L_add(pwrDSVal_var01, BLK_1000_shf);
//				pwrDSVal_var02 = AE_INT32X2_RADD(AE_MULP32X2(I32_x1r_x1i0<<1, I32_x1r_x1i0));
//				pwrDSVal_var02 = DVTXOP_L_add(pwrDSVal_var02, BLK_1000_shf);
//
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_0 = AE_MULC32X16_H(I32_x0r_x0i0,I16x4_Out_GSC);
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_1 = AE_MULC32X16_L(I32_x0r_x0i1,I16x4_Out_GSC);
//
//				I32x2_Ltmp0_Ltmp1_0 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_0, I16x4_muval0_muval0);
//				I32x2_Ltmp0_Ltmp1_1 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_1, I16x4_muval0_muval0);
//
//				deltaW_real00 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var01, q, W_COEF_Q);
//				deltaW_imag00 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var01, q, W_COEF_Q);
//
//				deltaW_real10 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var02, q, W_COEF_Q);
//				deltaW_imag10 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var02, q, W_COEF_Q);
//
//
//            	deltaW_real01 = 0;
//				deltaW_imag01 = 0;
//                deltaW_real11 = 0;
//				deltaW_imag11 = 0;
//            }
//            else if (WgscFreqUpdate[j+1])
//            {
//
//                /*pwrDSVal_var11 = DVTXOP_L_mult(x01r, x01r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var11 = DVTXOP_L_mac(pwrDSVal_var11, x01i, x01i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var11 = DVTXOP_L_add(pwrDSVal_var11, BLK_1000_shf);
//
//
//                pwrDSVal_var12 = DVTXOP_L_mult(x11r, x11r); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var12 = DVTXOP_L_mac(pwrDSVal_var12, x11i, x11i); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//    			pwrDSVal_var12 = DVTXOP_L_add(pwrDSVal_var12, BLK_1000_shf);
//
//
//				Ltmp0 = DVTXOP_L_mult(x01r, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mac(Ltmp0, x01i, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real01 = divide(Ltmp0, q, pwrDSVal_var11, q, W_COEF_Q);
//				Ltmp0 = DVTXOP_L_mult(x01i, gscr1);
//				Ltmp0 = DVTXOP_L_msu(Ltmp0, x01r, gsci1);
//				Ltmp0 = DVTXOP_L_mpy_ls(Ltmp0, mu_val0);
//				deltaW_imag01 = divide(Ltmp0, q, pwrDSVal_var11, q, W_COEF_Q);
//
//				Ltmp1 = DVTXOP_L_mult(x11r, gscr1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mac(Ltmp1, x11i, gsci1); //Q(BLK_NORM)*Q(BLK_NORM) => Q(2*BLK_NORM+1)
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);//Q(2*BLK_NORM+1) * Q(0.15) => Q(2*BLK_NORM+1)
//				deltaW_real11 = divide(Ltmp1, q, pwrDSVal_var12, q, W_COEF_Q);
//				Ltmp1 = DVTXOP_L_mult(x11i, gscr1);
//				Ltmp1 = DVTXOP_L_msu(Ltmp1, x11r, gsci1);
//				Ltmp1 = DVTXOP_L_mpy_ls(Ltmp1, mu_val1);
//				deltaW_imag11 = divide(Ltmp1, q, pwrDSVal_var12, q, W_COEF_Q);*/
//
//				pwrDSVal_var11 = AE_INT32X2_RADD(AE_MULP32X2(I32_x0r_x0i1<<1, I32_x0r_x0i1));
//				pwrDSVal_var11 = DVTXOP_L_add(pwrDSVal_var11, BLK_1000_shf);
//				pwrDSVal_var12 = AE_INT32X2_RADD(AE_MULP32X2(I32_x1r_x1i1<<1, I32_x1r_x1i1));
//				pwrDSVal_var12 = DVTXOP_L_add(pwrDSVal_var12, BLK_1000_shf);
//
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_0 = AE_MULC32X16_H(I32_x1r_x1i0,I16x4_Out_GSC);
//				ae_int32x2 I32x2_Ltmp0_Ltmp1_1 = AE_MULC32X16_L(I32_x1r_x1i1,I16x4_Out_GSC);
//
//				I32x2_Ltmp0_Ltmp1_0 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_0, I16x4_muval1_muval1);
//				I32x2_Ltmp0_Ltmp1_1 = AE_MULFP32X16X2RS_L(I32x2_Ltmp0_Ltmp1_1, I16x4_muval1_muval1);
//
//				deltaW_real01 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var11, q, W_COEF_Q);
//				deltaW_imag01 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_0), q, pwrDSVal_var11, q, W_COEF_Q);
//
//				deltaW_real11 = divide(ae_int32x2_vextract_0_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var12, q, W_COEF_Q);
//				deltaW_imag11 = divide(ae_int32x2_vextract_1_ae_int32(I32x2_Ltmp0_Ltmp1_1), q, pwrDSVal_var12, q, W_COEF_Q);
//
//
//            	deltaW_real00 = 0;
//				deltaW_imag00 = 0;
//                deltaW_real10 = 0;
//				deltaW_imag10 = 0;
//            }
//			else
//			{
//				deltaW_real00 = 0;
//				deltaW_imag00 = 0;
//				deltaW_real10 = 0;
//				deltaW_imag10 = 0;
//                deltaW_real01 = 0;
//				deltaW_imag01 = 0;
//				deltaW_real11 = 0;
//				deltaW_imag11 = 0;
//			}
//
//
//			normW00 = DVTXOP_L_mult(deltaW_real00, deltaW_real00);//Q(2*W_COEF_Q+1)
//			normW00 = DVTXOP_L_mac(normW00, deltaW_imag00, deltaW_imag00);
//			normW10 = DVTXOP_L_mult(deltaW_real10, deltaW_real10);//Q(2*W_COEF_Q+1)
//			normW10 = DVTXOP_L_mac(normW10, deltaW_imag10, deltaW_imag10);
//
//            normW01 = DVTXOP_L_mult(deltaW_real01, deltaW_real01);//Q(2*W_COEF_Q+1)
//			normW01 = DVTXOP_L_mac(normW01, deltaW_imag01, deltaW_imag01);
//			normW11 = DVTXOP_L_mult(deltaW_real11, deltaW_real11);//Q(2*W_COEF_Q+1)
//			normW11 = DVTXOP_L_mac(normW11, deltaW_imag11, deltaW_imag11);
//
//			if (normW00 > 26843545/*0.2(Q27)*/)
//			{
//				Ltmp0 = sqrt32(DVTXOP_L_shl(normW00,1));//Q(2*W_COEF_Q+1)
//				deltaW_real00 = divide(deltaW_real00, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//				deltaW_imag00 = divide(deltaW_imag00, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//			}
//			if (normW10 > 26843545/*0.2(Q27)*/)
//			{
//				Ltmp1 = sqrt32(DVTXOP_L_shl(normW10,1));//Q(2*W_COEF_Q+1)
//				deltaW_real10 = divide(deltaW_real10, W_COEF_Q, Ltmp1, (W_COEF_Q + 1), W_COEF_Q);
//				deltaW_imag10 = divide(deltaW_imag10, W_COEF_Q, Ltmp1, ( W_COEF_Q + 1), W_COEF_Q);
//			}
//
//			if (normW01 > 26843545/*0.2(Q27)*/)
//			{
//				Ltmp0 = sqrt32(DVTXOP_L_shl(normW01,1));//Q(2*W_COEF_Q+1)
//				deltaW_real01 = divide(deltaW_real01, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//				deltaW_imag01 = divide(deltaW_imag01, W_COEF_Q, Ltmp0, (W_COEF_Q + 1), W_COEF_Q);
//			}
//			if (normW11 > 26843545/*0.2(Q27)*/)
//			{
//				Ltmp1 = sqrt32(DVTXOP_L_shl(normW11,1));//Q(2*W_COEF_Q+1)
//				deltaW_real11 = divide(deltaW_real11, W_COEF_Q, Ltmp1, (W_COEF_Q + 1), W_COEF_Q);
//				deltaW_imag11 = divide(deltaW_imag11, W_COEF_Q, Ltmp1, ( W_COEF_Q + 1), W_COEF_Q);
//			}
//
//			/*WNfrm[0][idx_real0] = DVTXOP_add(w00r, DVTXOP_extract_l(deltaW_real00));//Q(W_COEF_Q)
//			WNfrm[0][idx_imag0] = DVTXOP_add(w00i, DVTXOP_extract_l(deltaW_imag00));//Q(W_COEF_Q)
//			WNfrm[1][idx_real0] = DVTXOP_add(w10r, DVTXOP_extract_l(deltaW_real10));//Q(W_COEF_Q)
//			WNfrm[1][idx_imag0] = DVTXOP_add(w10i, DVTXOP_extract_l(deltaW_imag10));//Q(W_COEF_Q)
//
//            WNfrm[0][idx_real1] = DVTXOP_add(w01r, DVTXOP_extract_l(deltaW_real01));//Q(W_COEF_Q)
//			WNfrm[0][idx_imag1] = DVTXOP_add(w01i, DVTXOP_extract_l(deltaW_imag01));//Q(W_COEF_Q)
//			WNfrm[1][idx_real1] = DVTXOP_add(w11r, DVTXOP_extract_l(deltaW_real11));//Q(W_COEF_Q)
//			WNfrm[1][idx_imag1] = DVTXOP_add(w11i, DVTXOP_extract_l(deltaW_imag11));//Q(W_COEF_Q)*/
//
//			ae_int32x4 I32x4tmp1 = {deltaW_imag10,deltaW_real10,deltaW_imag00,deltaW_real00};
//			ae_int32x4 I32x4tmp2 = {deltaW_imag11,deltaW_real11,deltaW_imag01,deltaW_real01};
//			I16_w0r_w0i = I16_w0r_w0ib + AE_CVT16X4_vector(I32x4tmp1);
//			I16_w1r_w1i = I16_w1r_w1ib + AE_CVT16X4_vector(I32x4tmp2);
//			AE_SA16X4_IP(I16_w0r_w0i, align1, WNfrm_ptr0);
//			AE_SA16X4_IP(I16_w1r_w1i, align1, WNfrm_ptr1);
//
//
//		}
//
//	}
//	else
//	{
//        int j;
//		for (i = 0,j=0; i < DVTX_FFT_HALFLEN_WB>>1/* + 1*/; i+=1, j+=2)
//		{
//			idx_real0 = i << 2;
//			idx_imag0 = idx_real0 + 1;
//			idx_real1 = idx_imag0+1;
//			idx_imag1 = idx_real1+1;
//
//
//
//			ae_int16x4 I16_x0rx0ix0rx0i, I16_x1rx1ix1rx1i, I16_XFB0r_0i_1r_1i;
//			AE_LA16X4_IP(I16_x0rx0ix0rx0i, align0, X_BMN_ptr0);
//			AE_LA16X4_IP(I16_x1rx1ix1rx1i, align0, X_BMN_ptr1);
//
//			ae_int32x2 I32_x0r_x0i0 = AE_CVT32X2F16_32(I16_x0rx0ix0rx0i)>>16;
//			ae_int32x2 I32_x0r_x0i1 = AE_CVT32X2F16_10(I16_x0rx0ix0rx0i)>>16;
//
//			ae_int32x2 I32_x1r_x1i0 = AE_CVT32X2F16_32(I16_x1rx1ix1rx1i)>>16;
//			ae_int32x2 I32_x1r_x1i1 = AE_CVT32X2F16_10(I16_x1rx1ix1rx1i)>>16;
//
//			ae_int16x4 I16_w0r_w0i, I16_w1r_w1i, I16_w0r_w0ib, I16_w1r_w1ib;
//
//			AE_LA16X4_IP(I16_w0r_w0i, align1, WNfrm_ptr0);
//			AE_LA16X4_IP(I16_w1r_w1i, align1, WNfrm_ptr1);
//
//
//			/*MICout_real0 = DVTXOP_L_mult(w00r, x00r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w00i, x00i);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10r, x10r);
//			MICout_real0 = DVTXOP_L_mac(MICout_real0, w10i, x10i);
//			MICout_real0 = MICout_real0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//			MICout_imag0 = DVTXOP_L_mult(w00r, x00i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w00i, x00r);
//			MICout_imag0 = DVTXOP_L_mac(MICout_imag0, w10r, x10i);
//			MICout_imag0 = DVTXOP_L_msu(MICout_imag0, w10i, x10r);
//			MICout_imag0 = MICout_imag0 >> 1;//Q(BLK_NORM+W_COEF_Q+1)*/
//
//
//			I16_w0r_w0ib = I16_w0r_w0i;
//			I16_w1r_w1ib = I16_w1r_w1i;
//			I16_w0r_w0i = PreCmplxMul(I16_w0r_w0i);
//			I16_w1r_w1i = PreCmplxMul(I16_w1r_w1i);
//			ae_int32x2 I32_MIC_Re_Im00 = AE_MULC32X16_H(I32_x0r_x0i0, I16_w0r_w0i);
//			AE_MULAC32X16_H(I32_MIC_Re_Im00, I32_x1r_x1i0, I16_w1r_w1i);
//
//            /*MICout_real1 = DVTXOP_L_mult(w01r, x01r); // Q(BLK_NORM) * Q(W_COEF_Q) = Q(BLK_NORM+W_COEF_Q+1)
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w01i, x01i);
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w11r, x11r);
//			MICout_real1 = DVTXOP_L_mac(MICout_real1, w11i, x11i);
//			MICout_real1 = MICout_real1 >> 1;//Q(BLK_NORM+W_COEF_Q+1)
//
//            MICout_imag1 = DVTXOP_L_mult(w01r, x01i);
//			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, w01i, x01r);
//			MICout_imag1 = DVTXOP_L_mac(MICout_imag1, w11r, x11i);
//			MICout_imag1 = DVTXOP_L_msu(MICout_imag1, w11i, x11r);
//			MICout_imag1 = MICout_imag1 >> 1;//Q(BLK_NORM+W_COEF_Q+1)*/
//
//
//
//			ae_int32x2 I32_MIC_Re_Im01 = AE_MULC32X16_L(I32_x0r_x0i1, I16_w0r_w0i);
//			AE_MULAC32X16_L(I32_MIC_Re_Im01, I32_x1r_x1i1, I16_w1r_w1i);
//
//			AE_LA16X4_IP(I16_XFB0r_0i_1r_1i, align2, X_FB_ptr);
//			ae_int32x2 I32_XFBr_i0 = AE_CVT32X2F16_32(I16_XFB0r_0i_1r_1i)>>16;
//			ae_int32x2 I32_XFBr_i1 = AE_CVT32X2F16_10(I16_XFB0r_0i_1r_1i)>>16;
//
//
//			/*MICout_real0 = DVTXOP_L_shr(MICout_real0, W_COEF_Q + 1);// Q(BLK_NORM)
//			MICout_imag0 = DVTXOP_L_shr(MICout_imag0, W_COEF_Q + 1);// Q(BLK_NORM)
//
//            MICout_real1 = DVTXOP_L_shr(MICout_real1, W_COEF_Q + 1);// Q(BLK_NORM)
//			MICout_imag1 = DVTXOP_L_shr(MICout_imag1, W_COEF_Q + 1);// Q(BLK_NORM)
//
//			int gscr = DVTXOP_L_sub(X_FB[idx_real0], DVTXOP_extract_l(MICout_real0));
//			int gsci = DVTXOP_L_sub(X_FB[idx_imag0], DVTXOP_extract_l(MICout_imag0));
//			int gscr1 = DVTXOP_L_sub(X_FB[idx_real1], DVTXOP_extract_l(MICout_real1));
//			int gsci1 = DVTXOP_L_sub(X_FB[idx_imag1], DVTXOP_extract_l(MICout_imag1));*/
//
//
//			I32_MIC_Re_Im00 = AE_SRAI32(I32_MIC_Re_Im00,W_COEF_Q + 1 );
//			I32_MIC_Re_Im01 = AE_SRAI32(I32_MIC_Re_Im01,W_COEF_Q + 1 );
//			ae_int32x2 I32_Out_GSC_r_i0 = AE_SUB32 (I32_XFBr_i0,I32_MIC_Re_Im00);
//			ae_int32x2 I32_Out_GSC_r_i1 = AE_SUB32 (I32_XFBr_i1,I32_MIC_Re_Im01);
//
//			ae_int16x4 I16x4_Out_GSC = AE_CVT16X4(I32_Out_GSC_r_i0, I32_Out_GSC_r_i1);
//
//			AE_SA16X4_IP(I16x4_Out_GSC, align3, Out_GSC_ptr);
//
//			/*
//			Out_GSC[idx_real0] = gscr;
//			Out_GSC[idx_imag0] = gsci;
//            Out_GSC[idx_real1] = gscr1;
//            Out_GSC[idx_imag1] = gsci1;*/
//		}
//
//	}
//
//
//	return;
//}


#endif
#endif
//short(*XoBcNSRNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2];
//short(*WgscNSRNfrm)[(DVTX_FFT_HALFLEN_WB/* + 1*/) * 2];
short WgscFreqUpdate[DVTX_FFT_HALFLEN_WB/* + 1*/];
#ifndef HOON_OPT_HIFI
void fn_MODULE_110_GSC(/*out*/short *XoutGSC, /*in*/short *XoutFBF, /*in*/short *XoutBM, short BLK_NORM, short *pH1mic, short Flag_FrmNoiseFree, short Flag_AbnormalMic, short VAD_LTSVgsc_multiFlag, short NgscDMA, BFStatus *BF_buf, SamsungSolomonVoiceWTxBFParam *BF_param, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf)
{
	/*
	(IN) pH1mic : Q0.15
	*/
	short i;
	short *WgscNSR;
	short mustep, mustep_2ch[2]; //Q0.15

	//short *WabmNSR;

	//XoBcNSRNfrm = BF_buf->XoBcNSRNfrm;
	WgscNSR = BF_buf->WgscNSR;
	//WgscNSRNfrm = BF_buf->WgscNSRNfrm;
	//WabmNSR = BF_buf->WabmNSR;

	
	// adaptive BM
	/*ABMmu = (pH1mic > 0.9);
	[XoutBM WbmNSR XoutMIC normWbm] = fn_freqGSCMIC(XoutBM, XoutFBF, WbmNSR, 0, ABMmu*0.01);*/
		
	//if ((Flag_FrmNoiseFree == 1) || (Flag_AbnormalMic == 1) || (FRAME_buf->STATE_Noise_Free == 1))
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = 0;
	//	}
	//	mustep = 0; //0.00 (Q0.15)
	//}
	//else if (VAD_LTSVgsc_multiFlag == 2)
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = (pH1mic[i] > 32000/*0.1*/) ? 1 : 0;
	//	}
	//	mustep = 256; //0.004 (Q0.15)
	//}
	//else if (VAD_LTSVgsc_multiFlag == 3)
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = (pH1mic[i] > 31000/*0.1*/) ? 1 : 0;
	//	}
	//	mustep = 128; //0.004 (Q0.15)
	//}
	//else if (VAD_LTSVgsc_multiFlag == 4)
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = (pH1mic[i] > 30000/*0.1*/) ? 1 : 0;
	//	}
	//	mustep = 64; //0.004 (Q0.15)
	//}
	//else if (VAD_LTSVgsc_multiFlag == 5)
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = (pH1mic[i] > 29000/*0.1*/) ? 1 : 0;
	//	}
	//	mustep = 32; //0.004 (Q0.15)
	//}
	//else
	//{
	//	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	//	{
	//		WgscFreqUpdate[i] = 0;
	//	}
	//	mustep = 0;
	//}
	//WgscFreqUpdate[0] = 0;
	//WgscFreqUpdate[1] = 0;
	//WgscFreqUpdate[2] = 0;
	//WgscFreqUpdate[3] = 0;
	//WgscFreqUpdate[4] = 0;

	//// use VADACC
	//if ((FRAME_buf->STATE_Voice_Active == 1) && (FRAME_buf->STATE_Noise_Free == 0))
	//{
	//	for (i = 0; i < DVTX_M_ACC_MAXFREQ; i++)
	//	{
	//		WgscFreqUpdate[i] = VADACC_buf->VADACCmask[i];
	//	}
	//	mustep = 64;
	//}
	//else
	//	mustep = 0;
	//fn_freqGSCMIC(XoutBM, XoutBM, XoutFBF, BLK_NORM, WabmNSR, 0, mustep, WgscFreqUpdate);



	// Adaptive MIC
	if (FRAME_buf->STATE_ACC_Effective == 0)
	{
		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			if ((Flag_FrmNoiseFree == 1) || (Flag_AbnormalMic == 1) /*|| (FRAME_buf->STATE_Noise_Free == 1)*/)
			{
				WgscFreqUpdate[i] = 0;
				mustep = 0; //0.00 (Q0.15)
			}
			else if (VAD_LTSVgsc_multiFlag == 0)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 16000/*0.1*/) ? 1 : 0;
				mustep = 1000; //0.004 (Q0.15)
			}
			else if (VAD_LTSVgsc_multiFlag == 1)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 14000/*0.1*/) ? 1 : 0;
				mustep = 800;
			}
			else if (VAD_LTSVgsc_multiFlag == 2)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 12000/*0.1*/) ? 1 : 0;
				mustep = 600;
			}
			else if (VAD_LTSVgsc_multiFlag == 3)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 10000/*0.1*/) ? 1 : 0;
				mustep = 400;
			}
			else if (VAD_LTSVgsc_multiFlag == 4)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 8000/*0.1*/) ? 1 : 0;
				mustep = 200;
			}
			else if (VAD_LTSVgsc_multiFlag == 5)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 6000/*0.1*/) ? 1 : 0;
				mustep = 100;
			}
			else
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 3277/*0.1*/) ? 1 : 0;
				mustep = 32;
			}
		}
	}
	else
	{
		// use VADACC		
		if ((FRAME_buf->STATE_Voice_Active == 0) /*&& (FRAME_buf->STATE_Noise_Free == 0)*/) //<-- °¡¼Óµµ ¼¾¼­ ¿µÇâ ¹ÞÀ½
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = 1;
			}
			mustep = 500;
		}
		else
			mustep = 0;
	}

	//for (i = 0; i < (DVTX_FFT_HALFLEN_WB/* + 1*/) * 2; i++)
	//{
	//	XoBcNSRNfrm[1][i] = XoBcNSRNfrm[0][i];
	//	XoBcNSRNfrm[0][i] = XoutBM[i];
	//}

	// adaptive IC
	fn_freqGSCMIC(XoutGSC, XoutFBF, XoutBM, BLK_NORM, WgscNSR, 0, mustep, WgscFreqUpdate);
	//mustep_2ch[0] = mustep;
	//mustep_2ch[1] = DVTXOP_shr(mustep, 1);
	//fn_freqGSCMIC_Nframe(XoutGSC, XoutGSC, XoBcNSRNfrm, BLK_NORM, WgscNSRNfrm, 0, mustep_2ch, WgscFreqUpdate, NgscDMA);

	return;
}
#else
#ifdef SetWgscFreqUpdate_OPT_DSP
void SetWgscFreqUpdate(short *WgscFreqUpdate,short *pH1mic, short thr, int Len )
{
	/*
	 * 		for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			WgscFreqUpdate[i] = (pH1mic[i] > thr) ? 1 : 0;
		}
	 */
	int i;
	ae_valign align1,align2;
	ae_int16x4 *pin, *pout;
	ae_int16x4 A1, thrV, oneV, zeroV, outV;
	xtbool4 Bool4;
	pout = (ae_int16x4*)WgscFreqUpdate;
	pin = (ae_int16x4*)pH1mic;
	align1 = AE_LA64_PP(pin);
	align2= AE_ZALIGN64();
	thrV = AE_MOV16(thr);
	oneV = AE_MOV16(1);
	for (i = 0; i < Len; i+=4)
	{
		AE_LA16X4_IP(A1, align1, pin);
		Bool4 = AE_LT16(thrV, A1);
		outV = AE_MOV16(0);
		AE_MOVT16X4(outV, oneV, Bool4);
		AE_SA16X4_IP(outV, align2, pout);

	}
	AE_SA64POS_FP(align2, pout);
}
#endif
void fn_MODULE_110_GSC(/*out*/short *XoutGSC, /*in*/short *XoutFBF, /*in*/short *XoutBM, short BLK_NORM, short *pH1mic, short Flag_FrmNoiseFree, short Flag_AbnormalMic, short VAD_LTSVgsc_multiFlag, short NgscDMA, BFStatus *BF_buf, SamsungSolomonVoiceWTxBFParam *BF_param, VADACCStatus *VADACC_buf, FRAMEStatus*   FRAME_buf)
{
	/*
	(IN) pH1mic : Q0.15
	*/


	short i;
    short *WgscNSR;
	//short *WabmNSR;
	short mustep, mustep_2ch[2]; //Q0.15
	
	ae_int16x4 *ptr =  (ae_int16x4 *)WgscFreqUpdate;

	//XoBcNSRNfrm = BF_buf->XoBcNSRNfrm;
	WgscNSR = BF_buf->WgscNSR;
	//WgscNSRNfrm = BF_buf->WgscNSRNfrm;
	//WabmNSR = BF_buf->WabmNSR;


//	// Adaptive BM
//	if ((Flag_FrmNoiseFree == 1) || (Flag_AbnormalMic == 1) || (FRAME_buf->STATE_Noise_Free == 1))
//		{
//#ifndef SetZeros
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = 0;
//			}
//#else
//		ae_int16x4 *ptr =  (ae_int16x4 *)WgscFreqUpdate;
//		ae_int16x4 zeroarry = AE_MOV16(0);
//		for (i = 0; i < DVTX_FFT_HALFLEN_WB>>2; i++)
//		{
//			//WgscFreqUpdate[i] = 0;
//			*ptr++ = zeroarry;
//		}
//#endif
//			mustep = 0; //0.00 (Q0.15)
//		}
//		else if (VAD_LTSVgsc_multiFlag == 2)
//		{
//#ifndef SetWgscFreqUpdate_OPT_DSP
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = (pH1mic[i] > 32000/*0.1*/) ? 1 : 0;
//			}
//#else
//		SetWgscFreqUpdate(WgscFreqUpdate,pH1mic, 32000, DVTX_FFT_HALFLEN_WB) ;
//#endif
//			mustep = 256; //0.004 (Q0.15)
//		}
//		else if (VAD_LTSVgsc_multiFlag == 3)
//		{
//#ifndef SetWgscFreqUpdate_OPT_DSP
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = (pH1mic[i] > 31000/*0.1*/) ? 1 : 0;
//			}
//#else
//		SetWgscFreqUpdate(WgscFreqUpdate,pH1mic, 31000, DVTX_FFT_HALFLEN_WB) ;
//#endif
//			mustep = 128; //0.004 (Q0.15)
//		}
//		else if (VAD_LTSVgsc_multiFlag == 4)
//		{
//#ifndef SetWgscFreqUpdate_OPT_DSP
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = (pH1mic[i] > 30000/*0.1*/) ? 1 : 0;
//			}
//#else
//		SetWgscFreqUpdate(WgscFreqUpdate,pH1mic, 30000, DVTX_FFT_HALFLEN_WB) ;
//#endif
//			mustep = 64; //0.004 (Q0.15)
//		}
//		else if (VAD_LTSVgsc_multiFlag == 5)
//		{
//#ifndef SetWgscFreqUpdate_OPT_DSP
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = (pH1mic[i] > 29000/*0.1*/) ? 1 : 0;
//			}
//#else
//		SetWgscFreqUpdate(WgscFreqUpdate,pH1mic, 29000, DVTX_FFT_HALFLEN_WB) ;
//#endif
//			mustep = 32; //0.004 (Q0.15)
//		}
//		else
//		{
//#ifndef SetZeros
//			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
//			{
//				WgscFreqUpdate[i] = 0;
//			}
//#else
//		ae_int16x4 *ptr =  (ae_int16x4 *)WgscFreqUpdate;
//		ae_int16x4 zeroarry = AE_MOV16(0);
//		for (i = 0; i < DVTX_FFT_HALFLEN_WB>>2; i++)
//		{
//			//WgscFreqUpdate[i] = 0;
//			*ptr++ = zeroarry;
//		}
//#endif
//			mustep = 0;
//		}
//		WgscFreqUpdate[0] = 0;
//		WgscFreqUpdate[1] = 0;
//		WgscFreqUpdate[2] = 0;
//		WgscFreqUpdate[3] = 0;
//		WgscFreqUpdate[4] = 0;
//	
//		// use VADACC
//	if ((FRAME_buf->STATE_Voice_Active == 1) && (FRAME_buf->STATE_Noise_Free == 0))
//		{
//			for (i = 0; i < DVTX_M_ACC_MAXFREQ; i++)
//			{
//				WgscFreqUpdate[i] = VADACC_buf->VADACCmask[i];
//			}
//			mustep = 64;
//		}
//		else
//			mustep = 0;
//
//	fn_freqGSCMIC(XoutBM, XoutBM, XoutFBF, BLK_NORM, WabmNSR, 0, mustep, WgscFreqUpdate);








	if (FRAME_buf->STATE_ACC_Effective == 0)
	{
		if ((Flag_FrmNoiseFree == 1) || (Flag_AbnormalMic == 1) /*|| (FRAME_buf->STATE_Noise_Free == 1)*/)
		{
			ae_int16x4 zeroarry = AE_MOVINT16X4_FROMINT64(0L);
			for (i = 0; i < DVTX_FFT_HALFLEN_WB >> 2; i++)
			{
				//WgscFreqUpdate[i] = 0;
				*ptr++ = zeroarry;
			}
			mustep = 0; //0.00 (Q0.15)

		}
		else if (VAD_LTSVgsc_multiFlag == 0)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 16000/*0.1*/) ? 1 : 0;
			}
			mustep = 1000; //0.004 (Q0.15)
		}
		else if (VAD_LTSVgsc_multiFlag == 1)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 14000/*0.1*/) ? 1 : 0;
			}
			mustep = 800; //0.004 (Q0.15)
		}
		else if (VAD_LTSVgsc_multiFlag == 2)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 12000/*0.1*/) ? 1 : 0;
			}
			mustep = 600; //0.004 (Q0.15)
		}
		else if (VAD_LTSVgsc_multiFlag == 3)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 10000/*0.1*/) ? 1 : 0;
			}
			mustep = 400; //0.004 (Q0.15)
		}
		else if (VAD_LTSVgsc_multiFlag == 4)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 8000/*0.1*/) ? 1 : 0;
			}
			mustep = 200; //0.004 (Q0.15)
		}
		else if (VAD_LTSVgsc_multiFlag == 5)
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 6000/*0.1*/) ? 1 : 0;
			}
			mustep = 100; //0.004 (Q0.15)
		}
		else
		{
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = (pH1mic[i] < 3277/*0.25*/) ? 1 : 0;
			}
			mustep = 32; //0.04 (Q0.15)
		}
	}
	else
	{
		// use VADACC
		if ((FRAME_buf->STATE_Voice_Active == 0) /*&& (FRAME_buf->STATE_Noise_Free == 0)*/)
		{
#ifndef SetOnes
			for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
			{
				WgscFreqUpdate[i] = 1;
			}
#else
			ae_int16x4 *ptr =  (ae_int16x4 *)WgscFreqUpdate;
			ae_int16x4 onearry = AE_MOV16(1);
			for (i = 0; i < DVTX_FFT_HALFLEN_WB>>2; i++)
			{
				//WgscFreqUpdate[i] = 1;
				*ptr++ = onearry;
			}
#endif
			mustep = 500;
		}
		else
			mustep = 0;
	}


//#ifndef OPT_COPY_FUNC
//	for (i = 0; i < (DVTX_FFT_HALFLEN_WB << 1); i++)
//	{
//		XoBcNSRNfrm[1][i] = XoBcNSRNfrm[0][i];
//		XoBcNSRNfrm[0][i] = XoutBM[i];
//	}
//#else
//	{
//		//void Fx_vector_copy_s(short *Out, short *A, short N)	
//		ae_valign align1, align2, align3, align4;
//		ae_int16x4 *pt1, *pt2;
//		ae_int16x4 *pt3, *pt4;
//		ae_int16x4 data, data1;
//		pt1=(ae_int16x4 *)XoBcNSRNfrm[0];
//		pt2=(ae_int16x4 *)XoBcNSRNfrm[1];
//		pt3=(ae_int16x4 *)XoutBM;
//		pt4=(ae_int16x4 *)XoBcNSRNfrm[0];
//
//		align1 = AE_LA64_PP(pt1);
//		align2 = AE_ZALIGN64();
//		align3 = AE_LA64_PP(pt3);
//		align4 = AE_ZALIGN64();
//		for (i = 0; i < (DVTX_FFT_HALFLEN_WB << 1); i+=4)
//		{
//			AE_LA16X4_IP(data, align1, pt1);
//			AE_LA16X4_IP(data1, align3, pt3);
//			AE_SA16X4_IP(data, align2, pt2);
//			AE_SA16X4_IP(data1, align4, pt4);
//		}
//		AE_SA64POS_FP(align2, pt2);
//		AE_SA64POS_FP(align4, pt4);
//	}
//#endif

	// adaptive BM
	/*ABMmu = (pH1mic > 0.9);
	[XoutBM WbmNSR XoutMIC normWbm] = fn_freqGSCMIC(XoutBM, XoutFBF, WbmNSR, 0, ABMmu*0.01);*/

	// adaptive IC
	fn_freqGSCMIC(XoutGSC, XoutFBF, XoutBM, BLK_NORM, WgscNSR, 0, mustep, WgscFreqUpdate);
	//mustep_2ch[0] = mustep;
	//mustep_2ch[1] = DVTXOP_shr(mustep, 1);
	//fn_freqGSCMIC_Nframe(XoutGSC, XoutGSC, XoBcNSRNfrm, BLK_NORM, WgscNSRNfrm, 0, mustep_2ch, WgscFreqUpdate, NgscDMA);

	return;
}
#endif
#ifndef fn_MODULE_120_GSC_adjustment_DSP_OPT
void fn_MODULE_120_GSC_adjustment(/*out*/int *XXgsc, /*in/out*/short *XoutGSC, /*in*/int *XXo1, /*in*/short *Xo1, /*in*/short *X_F_NSR, BFStatus *BF_buf, short Flag_wind)
{
	short i;

	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i++)
	{
		short idx_real = 2 * i;
		short idx_imag = 2 * i + 1;
		int tmp;

		tmp = DVTXOP_L_mult(XoutGSC[idx_real], XoutGSC[idx_real]);        //Q15,0*Q15,0 = Q31,0
		XXgsc[i] = DVTXOP_L_mac(tmp, XoutGSC[idx_imag], XoutGSC[idx_imag]); //q31,0

		// GSC out boosting case: if GEC out > input then GSC out = input
		if (XXgsc[i] > XXo1[i])
		{
			XoutGSC[idx_real] = Xo1[idx_real];
			XoutGSC[idx_imag] = Xo1[idx_imag];
			XXgsc[i] = XXo1[i];
		}
	}

	if (Flag_wind)
	{
		for (i = 48; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;
			int tmp;
			
			XoutGSC[idx_real] = X_F_NSR[idx_real];
			XoutGSC[idx_imag] = X_F_NSR[idx_imag];

			tmp = DVTXOP_L_mult(X_F_NSR[idx_real], X_F_NSR[idx_real]);        //Q15,0*Q15,0 = Q31,0
			XXgsc[i] = DVTXOP_L_mac(tmp, X_F_NSR[idx_imag], X_F_NSR[idx_imag]); //q31,0
		}
	}

	return;
}
#else
void fn_MODULE_120_GSC_adjustment(/*out*/int *XXgsc, /*in/out*/short *XoutGSC, /*in*/int *XXo1, /*in*/short *Xo1, /*in*/short *X_F_NSR, BFStatus *BF_buf, short Flag_wind)
{
	int L_tmp;
	short i;

	ae_f16x4 ae_tmp1, ae_tmp2, ae_tmp3;
	ae_f16x4 *ae_p1, *ae_p2, *ae_p3;
	ae_valign align1, align2, align3;
	ae_f32x2 ae_Ltmp1, ae_Ltmp2, ae_Ltmp3, ae_Ltmp4;
	ae_f32x2 *ae_Lp1, *ae_Lp2;
	ae_valign Lalign1, Lalign2;
	xtbool2 bool2_1;

	ae_p1 = (ae_f16x4 *)&XoutGSC[0]; align1 = AE_LA64_PP(ae_p1); //XoutGSC
	ae_p2 = (ae_f16x4 *)&Xo1[0]; align2 = AE_LA64_PP(ae_p2); //Xo1
	ae_p3 = (ae_f16x4 *)&XoutGSC[0]; align3 = AE_ZALIGN64(); //XoutGSC out
	ae_Lp1 = (ae_f32x2 *)&XXo1[0]; Lalign1 = AE_LA64_PP(ae_Lp1); //XXo1
	ae_Lp2 = (ae_f32x2 *)&XXgsc[0]; Lalign2 = AE_ZALIGN64(); //XXgsc out
	for (i = 0; i < DVTX_FFT_HALFLEN_WB; i+=2)
	{
		AE_LA16X4_IP(ae_tmp1, align1, ae_p1); //ae_tmp1: XoutGSC
		AE_LA32X2_IP(ae_Ltmp1, Lalign1, ae_Lp1); //ae_Ltmp5: XXo1
		ae_tmp2 = AE_SEL16_7520(ae_tmp1, ae_tmp1);
		AE_MULF16X4SS(ae_Ltmp3, ae_Ltmp4, ae_tmp2, ae_tmp2);
		ae_Ltmp3 = AE_ADD32S(ae_Ltmp3, ae_Ltmp4);
		AE_LA16X4_IP(ae_tmp2, align2, ae_p2); //ae_tmp2: Xo1
		bool2_1 = AE_LT32(ae_Ltmp1, ae_Ltmp3);
		AE_MOVT32X2(ae_Ltmp3, ae_Ltmp1, bool2_1); //ae_Ltmp3: XXgsc
		ae_Ltmp1 = AE_MOVF32X2_FROMF16X4(ae_tmp1);
		ae_Ltmp2 = AE_MOVF32X2_FROMF16X4(ae_tmp2);
		AE_MOVT32X2(ae_Ltmp1, ae_Ltmp2, bool2_1);
		ae_tmp1 = AE_MOVF16X4_FROMF32X2(ae_Ltmp1); //XoutGSC
		AE_SA32X2_IP(ae_Ltmp3, Lalign2, ae_Lp2);
		AE_SA16X4_IP(ae_tmp1, align3, ae_p3);
	}
	AE_SA64POS_FP(Lalign2, ae_Lp2);
	AE_SA64POS_FP(align3, ae_p3);


	if (Flag_wind)
	{
		for (i = 48; i < DVTX_FFT_HALFLEN_WB; i++)
		{
			short idx_real = 2 * i;
			short idx_imag = 2 * i + 1;
			int tmp;

			XoutGSC[idx_real] = X_F_NSR[idx_real];
			XoutGSC[idx_imag] = X_F_NSR[idx_imag];

			tmp = DVTXOP_L_mult(X_F_NSR[idx_real], X_F_NSR[idx_real]);        //Q15,0*Q15,0 = Q31,0
			XXgsc[i] = DVTXOP_L_mac(tmp, X_F_NSR[idx_imag], X_F_NSR[idx_imag]); //q31,0
		}
	}

	return;
}
#endif

void fx_WindEnergy_Norm(short *Xo1, short *Xo2, int *E_mic1_L, int *E_mic2_L, short tx_ch_tbl_nswb[][2], short N)
{
	short i, j, j1, j2;
	short E_ratio_S;
	short tmp_S;
	int tmp_L;

	for (i = 0; i <= N; i++)
	{
		j1 = tx_ch_tbl_nswb[i][0];
		j2 = tx_ch_tbl_nswb[i][1];

		if (E_mic1_L[i] > E_mic2_L[i])
		{
			tmp_S = DVTXOP_norm_l(E_mic1_L[i]);
			E_mic1_L[i] = E_mic1_L[i] << tmp_S;
			E_mic2_L[i] = E_mic2_L[i] << tmp_S;
			tmp_L = DVTXOP_L_divide(E_mic2_L[i], E_mic1_L[i]);
			E_ratio_S = int_sqrt_0_50(tmp_L);

			for (j = j1; j <= j2; j++)
			{
				Xo1[2 * j] = DVTXOP_L_mpy_ls(Xo1[2 * j], E_ratio_S);
				Xo1[2 * j + 1] = DVTXOP_L_mpy_ls(Xo1[2 * j + 1], E_ratio_S);
			}
		}
		else if (E_mic2_L[i] > E_mic1_L[i])
		{
			tmp_S = DVTXOP_norm_l(E_mic2_L[i]);
			E_mic1_L[i] = E_mic1_L[i] << tmp_S;
			E_mic2_L[i] = E_mic2_L[i] << tmp_S;
			tmp_L = DVTXOP_L_divide(E_mic1_L[i], E_mic2_L[i]);
			E_ratio_S = int_sqrt_0_50(tmp_L);

			for (j = j1; j <= j2; j++)
			{
				Xo2[2 * j] = DVTXOP_L_mpy_ls(Xo2[2 * j], E_ratio_S);
				Xo2[2 * j + 1] = DVTXOP_L_mpy_ls(Xo2[2 * j + 1], E_ratio_S);
			}
		}
	}
	return;
}


short  fltfx_LTSV_multi_VAD_flag(int L_PwrNpsdgsc, int LTSV)
{
	short VAD_LTSVgsc_multiFlag;
	int THD_LSTV_0, THD_LSTV_1, THD_LSTV_2, THD_LSTV_3, THD_LSTV_4;

	if (L_PwrNpsdgsc < 158489) //10.^([52 58 64 70]'/10)
	{
		THD_LSTV_0 = DVTX_LTSV_03;   //([0.03 0.04 0.05 0.06 0.07]' + 0.01)*2^27
		THD_LSTV_1 = DVTX_LTSV_04;
		THD_LSTV_2 = DVTX_LTSV_04;
		THD_LSTV_3 = DVTX_LTSV_05;
		THD_LSTV_4 = DVTX_LTSV_06;
	}
	else if (L_PwrNpsdgsc < 630957)
	{
		THD_LSTV_0 = DVTX_LTSV_04;   
		THD_LSTV_1 = DVTX_LTSV_04;
		THD_LSTV_2 = DVTX_LTSV_05;
		THD_LSTV_3 = DVTX_LTSV_06;
		THD_LSTV_4 = DVTX_LTSV_07;
	}
	else if (L_PwrNpsdgsc < 2511886)
	{
		THD_LSTV_0 = DVTX_LTSV_04;   
		THD_LSTV_1 = DVTX_LTSV_05;
		THD_LSTV_2 = DVTX_LTSV_06;
		THD_LSTV_3 = DVTX_LTSV_07;
		THD_LSTV_4 = DVTX_LTSV_08;
	}
	else if (L_PwrNpsdgsc < 10000000)
	{
		THD_LSTV_0 = DVTX_LTSV_05;   
		THD_LSTV_1 = DVTX_LTSV_06;
		THD_LSTV_2 = DVTX_LTSV_07;
		THD_LSTV_3 = DVTX_LTSV_08;
		THD_LSTV_4 = DVTX_LTSV_09;
	}
	else
	{
		THD_LSTV_0 = DVTX_LTSV_05;
		THD_LSTV_1 = DVTX_LTSV_06;
		THD_LSTV_2 = DVTX_LTSV_07;
		THD_LSTV_3 = DVTX_LTSV_08;
		THD_LSTV_4 = DVTX_LTSV_09;
	}
	

	if (LTSV < THD_LSTV_0)
		VAD_LTSVgsc_multiFlag = 0;
	else if (LTSV < THD_LSTV_1)
		VAD_LTSVgsc_multiFlag = 1;
	else if (LTSV < THD_LSTV_2)
		VAD_LTSVgsc_multiFlag = 2;
	else if (LTSV < THD_LSTV_3)
		VAD_LTSVgsc_multiFlag = 3;
	else if (LTSV < THD_LSTV_4)
		VAD_LTSVgsc_multiFlag = 4;
	else
		VAD_LTSVgsc_multiFlag = 5;


#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	//debugNS 1
	fprintf(fp_deg_2micBF[20], "%ld %ld %ld %ld %ld %d\n", LTSV, THD_LSTV_1, THD_LSTV_2, THD_LSTV_3, THD_LSTV_4, VAD_LTSVgsc_multiFlag);
#endif
#endif


	return VAD_LTSVgsc_multiFlag;

}



#ifndef FN_BF_DSP_OPT
#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
int Npsdgsc_Norm[256] = { 0, };
int ps_cepsavg_denorm[DVTX_M_FFT_LEN_WB] = { 0, };
#endif
short pH1avg[DVTX_M_FFT_HALFLEN_WB] = { 0, };
void FN_BF(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars)
{
	//static short fmrcnt = 0;
	FRAMEStatus* FRAME_buf = &DVTX_ECNS_vars->FRAME_buf;
	BFStatus* BF_buf = &DVTX_ECNS_vars->BF_buf;
	VADACCStatus*  VADACC_buf = &DVTX_ECNS_vars->VADACC_buf;
	
#ifdef __SV_USE_ANC_RESULT__
	InterChnanelANCStatus *ANC_buf = (InterChnanelANCStatus*)DVTX_ECNS_vars->ICANC_buf;
	short *Xenh_in = ANC_buf->Xout_inner;
	short Rx_vad = ANC_buf->Rx_VAD;
	int *XXenh = ANC_buf->XX_inner;
	int *H1_inner = ANC_buf->H1;
	short VAD_ANC = ANC_buf->VAD;
	short BLK_NORM_IN;
#endif
	SamsungSolomonVoiceWTxBFParam* BF_param = &DVTX_ECNS_vars->BF_param;

#if(FLAG_SELECT_C_DSP == 1)
	short print0;
	short *dbg_data_buffer_BFfbf = FRAME_buf->fftbuf_Outer_1.dbg_data_buffer_BFfbf;
	short *dbg_data_buffer_BFbm  = FRAME_buf->fftbuf_Outer_1.dbg_data_buffer_BFbm;
	short *dbg_data_buffer_BFgsc = FRAME_buf->fftbuf_Outer_1.dbg_data_buffer_BFgsc;;
#endif


	short i, j;
	short DOAindex = 0;
	short NgscDMA = 2;

	short FFT_LEN, FFT_HALFLEN;
	short Flag_AbnormalMic, Flag_FrmNoiseFree, Flag_NoiseOnly, Flag_wind;
	short VAD_LTSVgsc_multiFlag;

	short BLK_NORM_Outer1, BLK_NORM_Outer2, BLK_NORM_Acc;
	short *Xo1, *Xo2, *XoutGSC;

	int *XXo1 = BF_buf->XXo1;
	int *XXo2 = BF_buf->XXo2;
	int *tmpvec256A = BF_buf->tmpvec256A;
	int *tmpvec256B = BF_buf->tmpvec256B;

	int *PwrXo1EQ = BF_buf->PwrXo1EQ;
	int *PwrXo2EQ = BF_buf->PwrXo2EQ;
	int *GXo1Xo2EQ = BF_buf->GXo1Xo2EQ;

	int *Npsdmic = BF_buf->Npsdmic;
	int *Npsdsppmic = BF_buf->Npsdsppmic;
	short *pH1mic = BF_buf->pH1mic;
	short *pH1micavg = BF_buf->pH1micavg;

	int *Npsdgsc = BF_buf->Npsdgsc;

	int *Npsdsppgsc = BF_buf->Npsdsppgsc;
	short *pH1gscavg = BF_buf->pH1gscavg;
	short *pH1gsc = BF_buf->pH1gsc;

	short *X_F_NSR = BF_buf->X_F_NSR;
	short *X_B_NSR = BF_buf->X_B_NSR;

#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
	int *ps = BF_buf->ps;
	int *ps_ceps = BF_buf->ps_ceps;
	int *ps_cepsavg = BF_buf->ps_cepsavg;

	int *XX_GSCcpes = BF_buf->XX_GSCcpes;
#endif

	int *XXgsc = BF_buf->XXgsc;

	short tmp, q_diff;

	int PwrMic1, PwrMic2, MicPwrDiff, beta, LTSV;

	// AMS 
	short AMSweigthSubMic, AmsweightGSCout;
	int Ltmp1, Ltmp2, Ltmp3, Ltmp4;
	
	// NpsdBM
	int Ltmp, THD_PowNoiseAvg, THD_NoiseMixingMask;
	short forgetOld, forgetNew;

	//int *PwrXXgsc  = BF_buf->PwrXXgsc;
	//int *PwrXXbm   = BF_buf->PwrXXbm;
	int *NpsdBM    = BF_buf->NpsdBM;
	//int *G_gsc_bm  = BF_buf->G_gsc_bm;
	int *NpsdBFout = BF_buf->NpsdBFout;

	// wind
	int E_mic1_L[40] = { 0, };
	int E_mic2_L[40] = { 0, };

	short Flag_Tx_silent_mode_BF;
	static int L_PwrNpsdgsc = 0;
	
	Flag_Tx_silent_mode_BF = DVTX_ECNS_vars->AEC_Outer_buf_1.Flag_Tx_silent_mode;
	Flag_wind = DVTX_ECNS_vars->Mix_buf.WND_strong_ON;

	// WB/NB para setting
	if (DVTX_ECNS_vars->FRAME_param.TX_Outer_bandwidth == DVTX_FRM_LEN_WB)
	{
		FFT_LEN = DVTX_FFT_LEN_WB;
		FFT_HALFLEN = DVTX_FFT_HALFLEN_WB;
	}
	else
	{
		FFT_LEN = DVTX_FFT_LEN_NB;
		FFT_HALFLEN = DVTX_FFT_HALFLEN_NB;
	}

	/* Input */
	Xo1 = FRAME_buf->fftbuf_Outer_1.data_buffer;
	Xo2 = FRAME_buf->fftbuf_Outer_2.data_buffer;
	XoutGSC = BF_buf->XoutGSC;
	BLK_NORM_Outer1 = FRAME_buf->fftbuf_Outer_1.BLK_NORM;
	BLK_NORM_Outer2 = FRAME_buf->fftbuf_Outer_2.BLK_NORM;

	BLK_NORM_Acc = FRAME_buf->fftbuffer_Acc.BLK_NORM;

#ifdef __SV_USE_ANC_RESULT__
	BLK_NORM_IN = FRAME_buf->fftbuf_Inner.BLK_NORM;
#endif

#if 0 //#ifdef __EQ_COMPENSATION_MAIN_SUB_MIC__
	// SUB MIC EQ(PRE-COMPENSATION)
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		j = 2 * i;
		Ltmp = Xo2[j];
		Ltmp = DVTXOP_L_shl(Ltmp, 3);
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, SUB_MIC_EQ[i]);
		Xo2[j] = DVTXOP_extract_l(Ltmp);

		Ltmp = Xo2[j+1];
		Ltmp = DVTXOP_L_shl(Ltmp, 3);
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, SUB_MIC_EQ[i]);
		Xo2[j + 1] = DVTXOP_extract_l(Ltmp);
	}
#endif

	// MODULE_20 input FFT bin square (1420)
	fltfx_SolomonVoice_FFT_to_FFTpwr(XXo1, Xo1, FFT_HALFLEN);
	fltfx_SolomonVoice_FFT_to_FFTpwr(XXo2, Xo2, FFT_HALFLEN);	

	// Wind (strong) ==> normalize
	if (Flag_wind)
	{
		fx_SolomonVoice_FFTpwr_to_FFTband(E_mic1_L, XXo1, tx_ch_tbl_nswb, tx_ch_tbl_sh_wb, DVTX_CHAN_HIGH_WB);
		fx_SolomonVoice_FFTpwr_to_FFTband(E_mic2_L, XXo2, tx_ch_tbl_nswb, tx_ch_tbl_sh_wb, DVTX_CHAN_HIGH_WB);
		
		fx_WindEnergy_Norm(Xo1, Xo2, E_mic1_L, E_mic2_L, tx_ch_tbl_nswb, DVTX_CHAN_HIGH_WB);
	}

#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	//debugNS 0
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		fprintf(fp_deg_2micBF[0], "%ld %ld\n", DVTXOP_L_shl(XXo1[i], 8 - (2 * BLK_NORM_Outer1 + 1)), DVTXOP_L_shl(XXo2[i], 8 - (2 * BLK_NORM_Outer2 + 1)));
	}
#endif
#endif

#if(def_ctrl_AMS_onoff == 1)
	// MODULE_30 input pwr & abnormal input detection  (1450)
	PwrMic1 = fltfn_LogPwrSumHighBand(XXo1, 0, 0, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSumHighBand(XXo2, 0, 0, 2 * (BLK_NORM_Outer2)+1); //Q23

	if (BF_buf->PwrMic2Avg > PwrMic2) //slow decreasing 
	{
		forgetOld = 32504; //0.992
		forgetNew =   263;
	}
	else  // fast increasing
	{
		forgetOld = DVTX_WORD16_0_8;
		forgetNew = DVTX_WORD16_0_2;
	}	
	if (Flag_wind == 0)
	{
	BF_buf->PwrMic1Avg = DVTXOP_L_add(DVTXOP_L_mpy_ls(BF_buf->PwrMic1Avg, forgetOld), DVTXOP_L_mpy_ls(PwrMic1, forgetNew));
	BF_buf->PwrMic2Avg = DVTXOP_L_add(DVTXOP_L_mpy_ls(BF_buf->PwrMic2Avg, forgetOld), DVTXOP_L_mpy_ls(PwrMic2, forgetNew));
	}
	else
	{
		BF_buf->PwrMic1Avg = 0;
		BF_buf->PwrMic2Avg = 0;
	}
	
	MicPwrDiff = DVTXOP_L_abs(DVTXOP_L_sub(BF_buf->PwrMic1Avg, BF_buf->PwrMic2Avg)); //Q23

	if(DVTX_ECNS_vars->AEC_Outer_buf_1.Flag_RxVAD_AEC == 0)
		Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ST/*(6 << 23)*/ ? 1 : 0;
	else
		Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ETHO/*(12 << 23)*/ ? 1 : 0;

	PwrMic1 = fltfn_LogPwrSum(XXo1, 2, 223, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSum(XXo2, 2, 223, 2 * (BLK_NORM_Outer2)+1); //Q23

	Flag_FrmNoiseFree = THD_NOISEFREE_FRAME_PWR_MIC2/*(45 << 23)*/ > PwrMic2 ? 1 : 0;
#else
        // MODULE_30 input pwr & abnormal input detection  (1450)
	PwrMic1 = fltfn_LogPwrSum(XXo1, 2, 223, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSum(XXo2, 2, 223, 2 * (BLK_NORM_Outer2)+1); //Q23
	MicPwrDiff = DVTXOP_L_abs(DVTXOP_L_sub(PwrMic1, PwrMic2)); //Q23
	Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ST/*(6 << 23)*/ ? 1 : 0;
	Flag_FrmNoiseFree = THD_NOISEFREE_FRAME_PWR_MIC2/*(45 << 23)*/ > PwrMic1 ? 1 : 0;
#endif
	

	// MODULE_40 EQ for mic input (1510)
	beta = 2126008811;  //0.99 in Q31
	fltfn_spectralavg(tmpvec256A, XXo1, FFT_HALFLEN, 3);	//Q(2*BLK_NORM_Outer1+1)
	BF_buf->qXX01EQ = fltfn_RecursiveVectorAvg_q(PwrXo1EQ, BF_buf->qXX01EQ, tmpvec256A, 2 * BLK_NORM_Outer1 + 1, FFT_HALFLEN, beta); //Q(qXX01EQ-16), PwrXo1EQ Á¤È®µµ ¸ðÀÚ¸§..

	fltfn_spectralavg(tmpvec256A, XXo2, FFT_HALFLEN, 3);
	BF_buf->qXX02EQ = fltfn_RecursiveVectorAvg_q(PwrXo2EQ, BF_buf->qXX02EQ, tmpvec256A, 2 * BLK_NORM_Outer2 + 1, FFT_HALFLEN, beta); //Q(qXX02EQ-16)

#if(def_ctrl_AMS_onoff == 1)	
	if (Flag_wind == 1)
	{
		q_diff = -(BF_buf->qXX01EQ - BF_buf->qXX02EQ);
		for (i = 0; i < FFT_HALFLEN; i++)
		{
			tmp = PowerRatio2Gain(PwrXo2EQ[i], PwrXo1EQ[i], q_diff); //Q12
			tmpvec256A[i] = (int)tmp << 16; //Q28
		}
		fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
		fltfn_FreqBinGain(Xo1, GXo1Xo2EQ, FFT_HALFLEN);
	}
	else
	{
	q_diff = BF_buf->qXX01EQ - BF_buf->qXX02EQ;
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		tmp = PowerRatio2Gain(PwrXo1EQ[i], PwrXo2EQ[i], q_diff); //Q12
		tmpvec256A[i] = (int)tmp << 16; //Q28
	}

	fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
	fltfn_FreqBinGain(Xo2, GXo1Xo2EQ, FFT_HALFLEN);
	}
#else
	q_diff = -(BF_buf->qXX01EQ - BF_buf->qXX02EQ);
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		tmp = PowerRatio2Gain(PwrXo2EQ[i], PwrXo1EQ[i], q_diff); //Q12
		tmpvec256A[i] = (int)tmp << 16; //Q28
	}
	fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
	fltfn_FreqBinGain(Xo1, GXo1Xo2EQ, FFT_HALFLEN);
#endif	

#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	// debugNS 0
	fprintf(fp_deg_2micBF[15], "%ld %ld %d %d\n", BF_buf->PwrMic1Avg, BF_buf->PwrMic2Avg, Flag_AbnormalMic, Flag_FrmNoiseFree);
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		fprintf(fp_deg_2micBF[2], "%ld\n", GXo1Xo2EQ[i]);
	}

	print0 = Flag_AbnormalMic * 16384;
	for (i = 0; i < DVTX_FRM_LEN_WB; i++)
		fwrite(&print0, sizeof(short), 1, fp_dbg_AMSState);
#endif
#endif


	// MODULE_45 Frame VAD : LTSV	 (1540)
	LTSV = fltfn_LTSV_VAD(BF_buf->SxMtxLtsv, tmpvec256B, XXgsc, BF_buf->qXXgsc/*BLK_NORM_Outer1*/, DVTX_M_LTSV_Ksrt, DVTX_M_LTSV_Nbin, DVTX_M_LTSV_R, BF_buf->ColIndexSxMtx);
	if (++BF_buf->ColIndexSxMtx >= DVTX_M_LTSV_R) BF_buf->ColIndexSxMtx = 0;
	BF_buf->qXXgsc = BLK_NORM_Outer1;

	BF_buf->LSTV_value_BF = LTSV;
	Flag_NoiseOnly = (THD_NOISEONLY_FRAME_LTSV > LTSV) ? 1 : 0; //3355443 0.025 8039797:0.06,, too high......should be modified 5368709 is 0.04 in Q27	
	BF_buf->Flag_AbnormalMic = Flag_AbnormalMic;
	BF_buf->Flag_NoiseOnly = Flag_NoiseOnly;

	// add VAD by inear mic, when inear mic power is larger than THD, then speech active	
	//FRAME_buf->FrmPiLowBand_Inner : pwr Pinear
	
	VAD_LTSVgsc_multiFlag = fltfx_LTSV_multi_VAD_flag(FRAME_buf->PwrNoise_Npsdgsc, LTSV); //this function should be optimized by noise context
	if (Flag_AbnormalMic == 1) 
		VAD_LTSVgsc_multiFlag = 5;
	if (FRAME_buf->FrmPiLowBand_Inner > 2700)
		VAD_LTSVgsc_multiFlag = 5;
	BF_buf->VAD_LTSVgsc_multiFlag = VAD_LTSVgsc_multiFlag;


#ifdef __SV_USE_ANC_RESULT__
	/*if(ANC_buf->VAD == SPEECH)
		VAD_LTSVgsc_multiFlag = 5;*/
#endif 

#if(FLAG_SELECT_C_DSP == 1)
#if(Debug_File_Write_C == 1)
	//debugNS 1
	fprintf(fp_deg_2micBF[1], "%ld %ld %d %d %d %ld %d %d\n", PwrMic1, PwrMic2, Flag_AbnormalMic, Flag_FrmNoiseFree, Flag_NoiseOnly, LTSV, VAD_LTSVgsc_multiFlag, VADACC_buf->VADACCframe_Fast);
#endif
#endif

	// MODULE_50 input Npsd & SPP (1610)
	fltfn_unbiasedMMSE_Npsd_SPP(XXo1, Npsdmic, BLK_NORM_Outer1, Npsdsppmic, pH1micavg, pH1mic, tmpvec256A, FFT_HALFLEN, Flag_FrmNoiseFree, Flag_NoiseOnly, VAD_LTSVgsc_multiFlag, Flag_Tx_silent_mode_BF, 0, VADACC_buf);
			
	// MODULE_100 maxNSR filtering (1630)
	fn_MODULE_100_maxNSR_filtering(X_F_NSR, X_B_NSR, Xo1, Xo2, DOAindex, BF_buf); //Q(BLK_NORM_Outer1)

	// MODULE_115 MaxNSR filter out adjustment (1700)
	Flag_AbnormalMic = fn_MODULE_115_MaxNSR_filter_out_adjustment(X_F_NSR, X_B_NSR, BLK_NORM_Outer1,
		Xo1, Xo2, PwrMic1, Flag_AbnormalMic, Flag_Tx_silent_mode_BF, Flag_wind, BF_param);

#if 1//#ifdef __EQ_COMPENSATION_BFOUT_BMOUT__
	// BM OUT EQ(PRE-COMPENSATION)
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		j = 2 * i;
		Ltmp = X_B_NSR[j];		
#if 0	//#ifndef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
		Ltmp = DVTXOP_L_shl(Ltmp, 2);
#endif
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, BMOUT_EQ[i]);
		X_B_NSR[j] = DVTXOP_extract_l(Ltmp);

		Ltmp = X_B_NSR[j + 1];		
#if 0	//#ifndef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
		Ltmp = DVTXOP_L_shl(Ltmp, 2);
#endif
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, BMOUT_EQ[i]);
		X_B_NSR[j + 1] = DVTXOP_extract_l(Ltmp);
	}
#endif

	// MODULE_110 GSC (1730)
#ifdef __ANC_XCORR_BASED_VAD_IN_BF__
	if (VAD_ANC == NOISE)
	{
		for (i = 0; i < FFT_HALFLEN; i++) pH1mic[i] = 0;
	}
#endif
	
	for (i = 0; i < FFT_HALFLEN; i++)
	{	
		pH1avg[i] = DVTXOP_add(DVTXOP_mult_r(pH1mic[i], DVTX_WORD16_0_3), DVTXOP_mult_r(pH1gsc[i], DVTX_WORD16_0_7));
	}

	fn_MODULE_110_GSC(XoutGSC, X_F_NSR, X_B_NSR, BLK_NORM_Outer1, pH1avg, Flag_FrmNoiseFree, Flag_AbnormalMic, VAD_LTSVgsc_multiFlag, NgscDMA, BF_buf, BF_param, VADACC_buf, FRAME_buf);


	// MODULE_120 GSC adjustment (1740)	
	fn_MODULE_120_GSC_adjustment(XXgsc, XoutGSC, XXo1, Xo1, X_F_NSR, BF_buf, Flag_wind); // ref. mic changed to mic2.. since AMS
	
#if(FLAG_SELECT_C_DSP == 1)
	for (i = 0; i < DVTX_FFT_LEN_WB; i++) dbg_data_buffer_BFfbf[i] = X_F_NSR[i];
	for (i = 0; i < DVTX_FFT_LEN_WB; i++) dbg_data_buffer_BFbm[i]  = X_B_NSR[i];
	for (i = 0; i < DVTX_FFT_LEN_WB; i++) dbg_data_buffer_BFgsc[i] = XoutGSC[i];
#endif



#if(def_ctrl_AMS_onoff == 1) // <-- TODO : AMS should be funtionize!
	// MODULE_125 ouer Sub-mic mixing for abnormal mic condition
	//Flag_AbnormalMic = MicPwrDiff > 50331648/*(6 << 23)*/ ? 1 : 0;
	if (MicPwrDiff > (12 << 23))
		AMSweigthSubMic = 9000;
	else if (MicPwrDiff > (10 << 23))
		AMSweigthSubMic = 8000;
	else if (MicPwrDiff > (9 << 23))
		AMSweigthSubMic = 7000;
	else if (MicPwrDiff > (8 << 23))
		AMSweigthSubMic = 6000;
	else if (MicPwrDiff > (7 << 23))
		AMSweigthSubMic = 5000;
	else if (MicPwrDiff > (6 << 23))
		AMSweigthSubMic = 4000;
	else if (MicPwrDiff > (5 << 23))
		AMSweigthSubMic = 3000;
	else if (MicPwrDiff > (4 << 23))
		AMSweigthSubMic = 2000;
	else if (MicPwrDiff > (3 << 23))
		AMSweigthSubMic = 1000;
	else
		AMSweigthSubMic = 0;

	
	BF_buf->AMSweightSubMicAvg = DVTXOP_L_add(DVTXOP_mult_r(BF_buf->AMSweightSubMicAvg, DVTX_WORD16_0_95), DVTXOP_mult_r(AMSweigthSubMic, DVTX_WORD16_0_05));
	AmsweightGSCout = DVTXOP_sub(32767, BF_buf->AMSweightSubMicAvg);

	for (i = 0; i < FFT_HALFLEN; i++) // 2500Hz
	{
		Ltmp1 = DVTXOP_L_mult(XoutGSC[2 * i], AmsweightGSCout);// Q.norm*Q15=Qnorm+15+1
		Ltmp2 = DVTXOP_L_mult(XoutGSC[2 * i + 1], AmsweightGSCout);

		// fre-EQ
		/*Mix_buf->FreqMix_data_buffer[2 * i] = (DVTXOP_shr(Mix_buf->FreqMix_data_buffer[2 * i], BLK_NORM_diff - 1));
		Mix_buf->FreqMix_data_buffer[2 * i + 1] = (DVTXOP_shr(Mix_buf->FreqMix_data_buffer[2 * i+1], BLK_NORM_diff - 1));*/
				
		Ltmp3 = DVTXOP_L_mult(Xo1[2 * i], BF_buf->AMSweightSubMicAvg);
		Ltmp4 = DVTXOP_L_mult(Xo1[2 * i + 1], BF_buf->AMSweightSubMicAvg);

//	
		/*pwrMic = DVTXOP_L_add(DVTXOP_L_mpy_ls(Ltmp1, DVTXOP_extract_h(Ltmp1)), DVTXOP_L_mpy_ls(Ltmp2, DVTXOP_extract_h(Ltmp2)));
		pwrAcc = DVTXOP_L_add(DVTXOP_L_mpy_ls(Ltmp3, DVTXOP_extract_h(Ltmp3)), DVTXOP_L_mpy_ls(Ltmp4, DVTXOP_extract_h(Ltmp4)));*/

		XoutGSC[2 * i] = DVTXOP_extract_h(DVTXOP_L_add(Ltmp1, Ltmp3));
		XoutGSC[2 * i + 1] = DVTXOP_extract_h(DVTXOP_L_add(Ltmp2, Ltmp4));

	}

#endif



	// MODULE_130 Npsdgsc and SPPgsc (1800)
	fltfn_unbiasedMMSE_Npsd_SPP(XXgsc, Npsdgsc, BLK_NORM_Outer1, Npsdsppgsc, pH1gscavg, pH1gsc, tmpvec256A, FFT_HALFLEN, Flag_FrmNoiseFree, Flag_NoiseOnly, VAD_LTSVgsc_multiFlag, Flag_Tx_silent_mode_BF, 1, VADACC_buf);


	// MODULE 135 NpsdBM 
	// XXgsc : Q(2*BLK_NORM_Outer1+1)
	//fltfx_SolomonVoice_FFT_to_FFTpwr(tmpvec256A, X_B_NSR, FFT_HALFLEN); //XXbm, Q(2*BLK_NORM_Outer1+1)
	//fltfn_NpsdBM_estimation(NpsdBM, G_gsc_bm, pH1gsc, PwrXXgsc, XXgsc, PwrXXbm, tmpvec256A, BLK_NORM_Outer1, tmpvec256B, FFT_HALFLEN, FRAME_buf);

	//Npsd mixing : THD = 10^(67/10) noise free~noise1´Ü°è, 	THDpsdMask = 500	
	THD_PowNoiseAvg = 5011872;
	THD_NoiseMixingMask = 2000;
#if(def_ctrl_AMS_onoff == 1)	
	if (Flag_AbnormalMic == 1)
	{
		THD_PowNoiseAvg = 630957; //10^(58/10)
		THD_NoiseMixingMask = 100000000;
	}
#endif
	Ltmp = fltfn_NpsdBM_Npsdgsc_Mixing(NpsdBFout, Npsdgsc, NpsdBM, THD_PowNoiseAvg, THD_NoiseMixingMask, FFT_HALFLEN);
	L_PwrNpsdgsc = Ltmp;

	//if (FRAME_buf->STATE_Voice_Active == 0)
	{
		if(FRAME_buf->PwrNoise_Npsdgsc > Ltmp)
			FRAME_buf->PwrNoise_Npsdgsc = Fx_recursive_avg(FRAME_buf->PwrNoise_Npsdgsc, Ltmp, DVTX_WORD16_0_85);
		else
			FRAME_buf->PwrNoise_Npsdgsc = Fx_recursive_avg(FRAME_buf->PwrNoise_Npsdgsc, Ltmp, DVTX_WORD16_0_95);
	}
		
	

	FRAME_buf->Flag_HighNoise_MixACC_MixNpsd = FRAME_buf->PwrNoise_Npsdgsc > THD_PowNoiseAvg ? 1 : 0;

#if(FLAG_SELECT_C_DSP == 1)	
#if(Debug_File_Write_C == 1)
		for (i = 0; i < FFT_HALFLEN; i++)
		{
			fprintf(fp_deg_2micBF[4], "%ld %ld %ld %ld %ld\n", 0/*PwrXXgsc[i]*/, 0/*PwrXXbm[i]*/, 0,/*G_gsc_bm[i],*/ NpsdBM[i], Npsdgsc[i]);
		}
		fprintf(fp_deg_2micBF[5], "%ld %ld\n", FRAME_buf->PwrNoise_Npsdgsc, THD_PowNoiseAvg);
#endif
#endif

#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
	// MODULE_140 cepstrum smoothing based postNS
	/* preNS for cepstrum */ //(1820)
	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++)
	{
		Npsdgsc_Norm[i] = DVTXOP_L_shl(NpsdBFout[i], 8 + 2 * (BLK_NORM_Outer1 - 8) + 1);
	}

	//// Npsd under estimation 
	/////fltfn_Npsd_Under_Eatimation(Npsdgsc_Norm, 10000, FFT_HALFLEN);

	// mix XXgsc and XXacc
	/*tmp = (BLK_NORM_Acc - BLK_NORM_Outer1) * 2;
	for (i = 0; i < DVTX_M_ACC_MAXFREQ; i++)	{
		
		Ltmp = DVTXOP_L_shr(VADACC_buf->XXacc[i], tmp);
		XXgsc[i] = DVTXOP_L_add(DVTXOP_L_shr(XXgsc[i],1), DVTXOP_L_shr(Ltmp,1));
	}*/

	
	fn_BF_PitchEnhance_1_preNS(ps, XXgsc, Npsdgsc_Norm, BLK_NORM_Outer1, BF_param, VADACC_buf, BLK_NORM_Acc); // calculate a posteriori SNR
			
	/*cepstrum*/ //(1840)
	fn_BF_PitchEnhance_2_cepstrum(ps_ceps, ps, BLK_NORM_Outer1); //Q(31-BLK_NORM) // calculate cepstrum(log&FFT)

	/* pitch enhencement */ //(1900)
	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++) //dbg
	{
		ps_ceps[i] = DVTXOP_L_shr(ps_ceps[i], 16 - BLK_NORM_Outer1);
	}
	fn_BF_PitchEnhance_3_pitch_enhencement(ps_cepsavg, ps_ceps, BLK_NORM_Outer1, BF_buf, BF_param, FRAME_buf);

	/* Inverse cepstrum */ //(1920)
	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++) //dbg
	{
		ps_cepsavg_denorm[i] = DVTXOP_L_shl(ps_cepsavg[i], 16 - BLK_NORM_Outer1);
	}
	fn_BF_PitchEnhance_4_Invcepstrum(XX_GSCcpes, ps_cepsavg_denorm, BLK_NORM_Outer1);

	/* cepstrum NS */ //(1940)
	for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i++)
	{
		Npsdgsc_Norm[i] = DVTXOP_L_shl(NpsdBFout[i], (2 * BLK_NORM_Outer1 + 1) - 8);
	}
#ifdef __SV_USE_ANC_RESULT__
	if(Rx_vad == 0 && ANC_buf->NoiseLevel == 1)
	for (i = 0; i < ANC_REF_FBIN_SIZE; i++)
	{
		{
			Ltmp = XXenh[i];
			Ltmp = DVTXOP_L_shl(Ltmp, (2 * BLK_NORM_Outer1 + 1 - 2 * BLK_NORM_IN));
			if (H1_inner[i] > 20000) XX_GSCcpes[i] = (XX_GSCcpes[i] > Ltmp) ? XX_GSCcpes[i] : Ltmp;
			else XX_GSCcpes[i] = Ltmp;
		}
	}
#endif
	fn_BF_PitchEnhance_5_cepstrumNS(XoutGSC, XX_GSCcpes/*Q(2*BLK_NORM+1)*/, Npsdgsc_Norm/*Q(2*BLK_NORM+1)*/, BF_buf, Flag_Tx_silent_mode_BF, VADACC_buf, FRAME_buf, DVTX_ECNS_vars->Context_buf.CNTX_N_LEVEL);
#endif


#if(FLAG_SELECT_C_DSP == 1)	
#if(Debug_File_Write_C == 1)
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		fprintf(fp_deg_2micBF[18], "%ld %ld %ld\n", DVTXOP_L_shr(ps_cepsavg[i], 0), 
			                                        DVTXOP_L_shr(ps_ceps[i], 0), 
			                                        DVTXOP_L_shr(XX_GSCcpes[i], 2 * BLK_NORM_Outer1 + 1));
	}	
#endif
#endif

#ifdef __SV_PHASE_ENH__
	// phase enhancement
	if(ANC_buf->VAD == SPEECH)
	for (i = 0; i < ANC_REF_FBIN_SIZE; i++)
	{
		int XXm, XXi;
		short new_g;
		short idx_real = i << 1;
		short idx_imag = idx_real + 1;

		XXm = XoutGSC[idx_real] * XoutGSC[idx_real] + XoutGSC[idx_imag] * XoutGSC[idx_imag];
		XXi = XXenh[i];
		Ltmp = divide(XXm, 2 * BLK_NORM_Outer1, XXi, 2 * BLK_NORM_IN, 20);
		Ltmp = sqrt32(Ltmp);
		new_g = DVTXOP_saturate(Ltmp);


		XoutGSC[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(Xenh_in[idx_real] * new_g, 10 + BLK_NORM_IN - BLK_NORM_Outer1));
		XoutGSC[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(Xenh_in[idx_imag] * new_g, 10 + BLK_NORM_IN - BLK_NORM_Outer1));
	}
#endif

	// test bypass	
	for (i = 0; i < FFT_LEN; i++)
	{
		FRAME_buf->fftbuf_Outer_1.data_buffer[i] = XoutGSC[i];// X_B_NSR[i];// XoutGSC[i];
	}
	//__vec_memcpy(FRAME_buf->fftbuf_Outer_1.data_buffer,XoutGSC,(FFT_LEN<<1));

	return;
}
#else
#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
int Npsdgsc_Norm[256] = { 0, };
int ps_cepsavg_denorm[DVTX_M_FFT_LEN_WB] = { 0, };
#endif
short pH1avg[DVTX_M_FFT_HALFLEN_WB] = { 0, };
void FN_BF(DVTX_ECNS_Cfg_t* DVTX_ECNS_vars)
{
	//static short fmrcnt = 0;
	FRAMEStatus* FRAME_buf = &DVTX_ECNS_vars->FRAME_buf;
	BFStatus* BF_buf = &DVTX_ECNS_vars->BF_buf;

	VADACCStatus*  VADACC_buf = &DVTX_ECNS_vars->VADACC_buf;
	


#ifdef __SV_USE_ANC_RESULT__
	InterChnanelANCStatus *ANC_buf = (InterChnanelANCStatus*)DVTX_ECNS_vars->ICANC_buf;
	short *Xenh_in = ANC_buf->Xout_inner;
	short Rx_vad = ANC_buf->Rx_VAD;
	int *XXenh = ANC_buf->XX_inner;
	int *H1_inner = ANC_buf->H1;
	short VAD_ANC = ANC_buf->VAD;
	short BLK_NORM_IN;
#endif
	SamsungSolomonVoiceWTxBFParam* BF_param = &DVTX_ECNS_vars->BF_param;

	short i, j;
	short DOAindex = 0;
	short NgscDMA = 2;

	short FFT_LEN, FFT_HALFLEN;
	short Flag_AbnormalMic, Flag_FrmNoiseFree, Flag_NoiseOnly, Flag_wind;
	short VAD_LTSVgsc_multiFlag;

	short BLK_NORM_Outer1, BLK_NORM_Outer2, BLK_NORM_Acc;
	short *Xo1, *Xo2, *XoutGSC;

	int *XXo1 = BF_buf->XXo1;
	int *XXo2 = BF_buf->XXo2;
	int *tmpvec256A = BF_buf->tmpvec256A;
	int *tmpvec256B = BF_buf->tmpvec256B;

	int *PwrXo1EQ = BF_buf->PwrXo1EQ;
	int *PwrXo2EQ = BF_buf->PwrXo2EQ;
	int *GXo1Xo2EQ = BF_buf->GXo1Xo2EQ;

	int *Npsdmic = BF_buf->Npsdmic;
	int *Npsdsppmic = BF_buf->Npsdsppmic;
	short *pH1mic = BF_buf->pH1mic;
	short *pH1micavg = BF_buf->pH1micavg;

	int *Npsdgsc = BF_buf->Npsdgsc;
//	int Npsdgsc_Norm[256] = { 0, };
	int *Npsdsppgsc = BF_buf->Npsdsppgsc;
	short *pH1gscavg = BF_buf->pH1gscavg;
	short *pH1gsc = BF_buf->pH1gsc;

	short *X_F_NSR = BF_buf->X_F_NSR;
	short *X_B_NSR = BF_buf->X_B_NSR;

#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
	int *ps = BF_buf->ps;
	int *ps_ceps = BF_buf->ps_ceps;
	int *ps_cepsavg = BF_buf->ps_cepsavg;
//	int ps_cepsavg_denorm[DVTX_M_FFT_LEN_WB] = { 0, };
	int *XX_GSCcpes = BF_buf->XX_GSCcpes;
#endif

	int *XXgsc = BF_buf->XXgsc;

	short tmp, q_diff;

	int PwrMic1, PwrMic2, MicPwrDiff, beta, LTSV;

	// AMS 
	short AMSweigthSubMic, AmsweightGSCout;
	int Ltmp1, Ltmp2, Ltmp3, Ltmp4;

	// NpsdBM
	int Ltmp, THD_PowNoiseAvg, THD_NoiseMixingMask;
	short forgetOld, forgetNew;

	//int *PwrXXgsc  = BF_buf->PwrXXgsc;
	//int *PwrXXbm   = BF_buf->PwrXXbm;
	int *NpsdBM    = BF_buf->NpsdBM;
	//int *G_gsc_bm  = BF_buf->G_gsc_bm;
	int *NpsdBFout = BF_buf->NpsdBFout;
    short tmp_f;

	int E_mic1_L[40] = { 0, };
	int E_mic2_L[40] = { 0, };
	short Flag_Tx_silent_mode_BF;
	static int L_PwrNpsdgsc = 0;

	Flag_Tx_silent_mode_BF = DVTX_ECNS_vars->AEC_Outer_buf_1.Flag_Tx_silent_mode;
	Flag_wind = DVTX_ECNS_vars->Mix_buf.WND_strong_ON;
	
	// WB/NB para setting
	if (DVTX_ECNS_vars->FRAME_param.TX_Outer_bandwidth == DVTX_FRM_LEN_WB)
	{
		FFT_LEN = DVTX_FFT_LEN_WB;
		FFT_HALFLEN = DVTX_FFT_HALFLEN_WB;
	}
	else
	{
		FFT_LEN = DVTX_FFT_LEN_NB;
		FFT_HALFLEN = DVTX_FFT_HALFLEN_NB;
	}

	/* Input */
	Xo1 = FRAME_buf->fftbuf_Outer_1.data_buffer;
	Xo2 = FRAME_buf->fftbuf_Outer_2.data_buffer;
	XoutGSC = BF_buf->XoutGSC;
	BLK_NORM_Outer1 = FRAME_buf->fftbuf_Outer_1.BLK_NORM;
	BLK_NORM_Outer2 = FRAME_buf->fftbuf_Outer_2.BLK_NORM;

	BLK_NORM_Acc = FRAME_buf->fftbuffer_Acc.BLK_NORM;

#ifdef __SV_USE_ANC_RESULT__
	BLK_NORM_IN = FRAME_buf->fftbuf_Inner.BLK_NORM;
#endif

#if 0 //#ifdef __EQ_COMPENSATION_MAIN_SUB_MIC__
	// SUB MIC EQ(PRE-COMPENSATION)
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		j = 2 * i;
		Ltmp = Xo2[j];
		Ltmp = DVTXOP_L_shl(Ltmp, 3);
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, SUB_MIC_EQ[i]);
		Xo2[j] = DVTXOP_extract_l(Ltmp);

		Ltmp = Xo2[j + 1];
		Ltmp = DVTXOP_L_shl(Ltmp, 3);
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, SUB_MIC_EQ[i]);
		Xo2[j + 1] = DVTXOP_extract_l(Ltmp);
	}
#endif


	// MODULE_20 input FFT bin square (1420)
	fltfx_SolomonVoice_FFT_to_FFTpwr(XXo1, Xo1, FFT_HALFLEN);
	fltfx_SolomonVoice_FFT_to_FFTpwr(XXo2, Xo2, FFT_HALFLEN);

	// Wind (strong) ==> normalize
	if (Flag_wind)
	{
		fx_SolomonVoice_FFTpwr_to_FFTband(E_mic1_L, XXo1, tx_ch_tbl_nswb, tx_ch_tbl_sh_wb, DVTX_CHAN_HIGH_WB);
		fx_SolomonVoice_FFTpwr_to_FFTband(E_mic2_L, XXo2, tx_ch_tbl_nswb, tx_ch_tbl_sh_wb, DVTX_CHAN_HIGH_WB);

		fx_WindEnergy_Norm(Xo1, Xo2, E_mic1_L, E_mic2_L, tx_ch_tbl_nswb, DVTX_CHAN_HIGH_WB);
	}

#if(def_ctrl_AMS_onoff == 1)
	// MODULE_30 input pwr & abnormal input detection  (1450)
	PwrMic1 = fltfn_LogPwrSumHighBand(XXo1, 0, 0, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSumHighBand(XXo2, 0, 0, 2 * (BLK_NORM_Outer2)+1); //Q23

	if (BF_buf->PwrMic2Avg > PwrMic2) //slow decreasing 
	{
		forgetOld = 32504; //0.992
		forgetNew = 263;
	}
	else  // fast increasing
	{
		forgetOld = DVTX_WORD16_0_8;
		forgetNew = DVTX_WORD16_0_2;
	}
	if (Flag_wind == 0)
	{
	BF_buf->PwrMic1Avg = DVTXOP_L_add(DVTXOP_L_mpy_ls(BF_buf->PwrMic1Avg, forgetOld), DVTXOP_L_mpy_ls(PwrMic1, forgetNew));
	BF_buf->PwrMic2Avg = DVTXOP_L_add(DVTXOP_L_mpy_ls(BF_buf->PwrMic2Avg, forgetOld), DVTXOP_L_mpy_ls(PwrMic2, forgetNew));
	}
	else
	{
		BF_buf->PwrMic1Avg = 0;
		BF_buf->PwrMic2Avg = 0;
	}

	MicPwrDiff = DVTXOP_L_abs(DVTXOP_L_sub(BF_buf->PwrMic1Avg, BF_buf->PwrMic2Avg)); //Q23
	if (DVTX_ECNS_vars->AEC_Outer_buf_1.Flag_RxVAD_AEC == 0)
		Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ST/*(6 << 23)*/ ? 1 : 0;
	else
		Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ETHO/*(12 << 23)*/ ? 1 : 0;

	PwrMic1 = fltfn_LogPwrSum(XXo1, 2, 223, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSum(XXo2, 2, 223, 2 * (BLK_NORM_Outer2)+1); //Q23

	Flag_FrmNoiseFree = THD_NOISEFREE_FRAME_PWR_MIC2/*(45 << 23)*/ > PwrMic2 ? 1 : 0;
#else
	// MODULE_30 input pwr & abnormal input detection  (1450)
	PwrMic1 = fltfn_LogPwrSum(XXo1, 2, 223, 2 * (BLK_NORM_Outer1)+1); //Q23
	PwrMic2 = fltfn_LogPwrSum(XXo2, 2, 223, 2 * (BLK_NORM_Outer2)+1); //Q23
	MicPwrDiff = DVTXOP_L_abs(DVTXOP_L_sub(PwrMic1, PwrMic2)); //Q23
	Flag_AbnormalMic = MicPwrDiff > THD_ABNORMAL_MIC_PWRDIFF_ST/*(6 << 23)*/ ? 1 : 0;
	Flag_FrmNoiseFree = THD_NOISEFREE_FRAME_PWR_MIC2/*(45 << 23)*/ > PwrMic1 ? 1 : 0;
#endif

	// MODULE_40 EQ for mic input (1510)
	beta = 2126008811;  //0.99 in Q31
	fltfn_spectralavg(tmpvec256A, XXo1, FFT_HALFLEN, 3);	//Q(2*BLK_NORM_Outer1+1)
	BF_buf->qXX01EQ = fltfn_RecursiveVectorAvg_q(PwrXo1EQ, BF_buf->qXX01EQ, tmpvec256A, 2 * BLK_NORM_Outer1 + 1, FFT_HALFLEN, beta); //Q(qXX01EQ-16), PwrXo1EQ Á¤È®µµ ¸ðÀÚ¸§..

	fltfn_spectralavg(tmpvec256A, XXo2, FFT_HALFLEN, 3);
	BF_buf->qXX02EQ = fltfn_RecursiveVectorAvg_q(PwrXo2EQ, BF_buf->qXX02EQ, tmpvec256A, 2 * BLK_NORM_Outer2 + 1, FFT_HALFLEN, beta); //Q(qXX02EQ-16)

#if(def_ctrl_AMS_onoff == 1)	
	if (Flag_wind == 1)
	{
		q_diff = -(BF_buf->qXX01EQ - BF_buf->qXX02EQ);
#ifndef FN_BF_loop_DSP_OPT
		for (i = 0; i < FFT_HALFLEN; i++)
		{
			tmp = PowerRatio2Gain(PwrXo2EQ[i], PwrXo1EQ[i], q_diff); //Q12
			tmpvec256A[i] = (int)tmp << 16; //Q28
		}
#else
		PowerRatio2Gain_0(PwrXo2EQ, PwrXo1EQ, q_diff, tmpvec256A, FFT_HALFLEN); //Q12
		for (i = 0; i < FFT_HALFLEN; i++)
		{

			if ((PwrXo2EQ[i] == 0) && (PwrXo1EQ[i] != 0))
				tmpvec256A[i] = 0;
			if ((PwrXo2EQ[i] != 0) && (PwrXo1EQ[i] == 0))
				tmpvec256A[i] = 20480 << 16;
		}
#endif

		fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
		fltfn_FreqBinGain(Xo1, GXo1Xo2EQ, FFT_HALFLEN);
	}
	else 
	{
	q_diff = BF_buf->qXX01EQ - BF_buf->qXX02EQ;
#ifndef FN_BF_loop_DSP_OPT
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		tmp = PowerRatio2Gain(PwrXo1EQ[i], PwrXo2EQ[i], q_diff); //Q12
		tmpvec256A[i] = (int)tmp << 16; //Q28
	}
#else
	PowerRatio2Gain_0(PwrXo1EQ, PwrXo2EQ, q_diff, tmpvec256A, FFT_HALFLEN); //Q12
	for (i = 0; i < FFT_HALFLEN; i++)
	{

		if ((PwrXo1EQ[i] == 0) && (PwrXo2EQ[i] != 0))
			tmpvec256A[i] = 0;
		if ((PwrXo1EQ[i] != 0) && (PwrXo2EQ[i] == 0))
			tmpvec256A[i] = 20480 << 16;
	}
#endif

	fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
	fltfn_FreqBinGain(Xo2, GXo1Xo2EQ, FFT_HALFLEN);
	}
#else
	
	q_diff = -(BF_buf->qXX01EQ - BF_buf->qXX02EQ);
#ifndef FN_BF_loop_DSP_OPT
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		tmp = PowerRatio2Gain(PwrXo2EQ[i], PwrXo1EQ[i], q_diff); //Q12
		tmpvec256A[i] = (int)tmp << 16; //Q28
	}
#else
	PowerRatio2Gain_0(PwrXo2EQ, PwrXo1EQ, q_diff, tmpvec256A, FFT_HALFLEN); //Q12
	for (i = 0; i < FFT_HALFLEN; i++)
	{

		if ((PwrXo2EQ[i] == 0) && (PwrXo1EQ[i] != 0))
			tmpvec256A[i] = 0;
		if ((PwrXo2EQ[i] != 0) && (PwrXo1EQ[i] == 0))
			tmpvec256A[i] = 20480 << 16;
	}
#endif

	fltfn_RecursiveVectorAvg(GXo1Xo2EQ, tmpvec256A, FFT_HALFLEN, beta); //BF_buf->GXo1Xo2EQ in Q28
	fltfn_FreqBinGain(Xo1, GXo1Xo2EQ, FFT_HALFLEN);

#endif	


	// MODULE_45 Frame VAD : LTSV	 (1540)
	LTSV = fltfn_LTSV_VAD(BF_buf->SxMtxLtsv, tmpvec256B, XXgsc, BF_buf->qXXgsc/*BLK_NORM_Outer1*/, DVTX_M_LTSV_Ksrt, DVTX_M_LTSV_Nbin, DVTX_M_LTSV_R, BF_buf->ColIndexSxMtx);
	if (++BF_buf->ColIndexSxMtx >= DVTX_M_LTSV_R) BF_buf->ColIndexSxMtx = 0;
	BF_buf->qXXgsc = BLK_NORM_Outer1;

	BF_buf->LSTV_value_BF = LTSV;
	Flag_NoiseOnly = (THD_NOISEONLY_FRAME_LTSV > LTSV) ? 1 : 0; //5368709 is 0.04 in Q27
	BF_buf->Flag_AbnormalMic = Flag_AbnormalMic;
	BF_buf->Flag_NoiseOnly = Flag_NoiseOnly;

	// add VAD by inear mic, when inear mic power is larger than THD, then speech active	
	//FRAME_buf->FrmPiLowBand_Inner : pwr Pinear
	
	VAD_LTSVgsc_multiFlag = fltfx_LTSV_multi_VAD_flag(FRAME_buf->PwrNoise_Npsdgsc, LTSV);
	if (Flag_AbnormalMic == 1)
		VAD_LTSVgsc_multiFlag = 5;
	if (FRAME_buf->FrmPiLowBand_Inner > 2700)
		VAD_LTSVgsc_multiFlag = 5;
	BF_buf->VAD_LTSVgsc_multiFlag = VAD_LTSVgsc_multiFlag;

#ifdef __SV_USE_ANC_RESULT__
	//if (ANC_buf->VAD == SPEECH)
	//	VAD_LTSVgsc_multiFlag = 5;
#endif 

	// MODULE_50 input Npsd & SPP (1610)
	fltfn_unbiasedMMSE_Npsd_SPP(XXo1, Npsdmic, BLK_NORM_Outer1, Npsdsppmic, pH1micavg, pH1mic, tmpvec256A, FFT_HALFLEN, Flag_FrmNoiseFree, Flag_NoiseOnly, VAD_LTSVgsc_multiFlag, Flag_Tx_silent_mode_BF, 0, VADACC_buf);

	// MODULE_100 maxNSR filtering (1630)
	fn_MODULE_100_maxNSR_filtering(X_F_NSR, X_B_NSR, Xo1, Xo2, DOAindex, BF_buf); //Q(BLK_NORM_Outer1)

	// MODULE_115 MaxNSR filter out adjustment (1700)
	Flag_AbnormalMic = fn_MODULE_115_MaxNSR_filter_out_adjustment(X_F_NSR, X_B_NSR, BLK_NORM_Outer1,
		Xo1, Xo2, PwrMic1, Flag_AbnormalMic, Flag_Tx_silent_mode_BF, Flag_wind, BF_param);

#if 1//#ifdef __EQ_COMPENSATION_BFOUT_BMOUT__
	// BM OUT EQ(PRE-COMPENSATION)
	for (i = 0; i < FFT_HALFLEN; i++)
	{
		j = 2 * i;
		Ltmp = X_B_NSR[j];
#if 0	//#ifndef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
		Ltmp = DVTXOP_L_shl(Ltmp, 2);
#endif
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, BMOUT_EQ[i]);
		X_B_NSR[j] = DVTXOP_extract_l(Ltmp);

		Ltmp = X_B_NSR[j + 1];
#if 0	//#ifndef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
		Ltmp = DVTXOP_L_shl(Ltmp, 2);
#endif
		Ltmp = DVTXOP_L_mpy_ls(Ltmp, BMOUT_EQ[i]);
		X_B_NSR[j + 1] = DVTXOP_extract_l(Ltmp);
	}
#endif


	// MODULE_110 GSC (1730)
#ifdef __ANC_XCORR_BASED_VAD_IN_BF__
	if (VAD_ANC == NOISE)
	{
		for (i = 0; i < FFT_HALFLEN; i++) pH1mic[i] = 0;
	}
#endif

	for (i = 0; i < FFT_HALFLEN; i++)
	{
		pH1avg[i] = DVTXOP_add(DVTXOP_mult_r(pH1mic[i], DVTX_WORD16_0_3), DVTXOP_mult_r(pH1gsc[i], DVTX_WORD16_0_7));
	}	
	fn_MODULE_110_GSC(XoutGSC, X_F_NSR, X_B_NSR, BLK_NORM_Outer1, pH1avg, Flag_FrmNoiseFree, Flag_AbnormalMic, VAD_LTSVgsc_multiFlag, NgscDMA, BF_buf, BF_param, VADACC_buf, FRAME_buf);


	// MODULE_120 GSC adjustment (1740)
	fn_MODULE_120_GSC_adjustment(XXgsc, XoutGSC, XXo1, Xo1, X_F_NSR, BF_buf, Flag_wind); 

#if(def_ctrl_AMS_onoff == 1)	

	// MODULE_125 ouer Sub-mic mixing for abnormal mic condition
	//Flag_AbnormalMic = MicPwrDiff > 50331648/*(6 << 23)*/ ? 1 : 0;
	if (MicPwrDiff > (12 << 23))
		AMSweigthSubMic = 9000;
	else if (MicPwrDiff > (10 << 23))
		AMSweigthSubMic = 8000;
	else if (MicPwrDiff > (9 << 23))
		AMSweigthSubMic = 7000;
	else if (MicPwrDiff > (8 << 23))
		AMSweigthSubMic = 6000;
	else if (MicPwrDiff > (7 << 23))
		AMSweigthSubMic = 5000;
	else if (MicPwrDiff > (6 << 23))
		AMSweigthSubMic = 4000;
	else if (MicPwrDiff > (5 << 23))
		AMSweigthSubMic = 3000;
	else if (MicPwrDiff > (4 << 23))
		AMSweigthSubMic = 2000;
	else if (MicPwrDiff > (3 << 23))
		AMSweigthSubMic = 1000;
	else
		AMSweigthSubMic = 0;


	BF_buf->AMSweightSubMicAvg = DVTXOP_L_add(DVTXOP_mult_r(BF_buf->AMSweightSubMicAvg, DVTX_WORD16_0_95), DVTXOP_mult_r(AMSweigthSubMic, DVTX_WORD16_0_05));
	AmsweightGSCout = DVTXOP_sub(32767, BF_buf->AMSweightSubMicAvg);

	for (i = 0; i < FFT_HALFLEN; i++) // 2500Hz
	{
		Ltmp1 = DVTXOP_L_mult(XoutGSC[2 * i], AmsweightGSCout);
		Ltmp2 = DVTXOP_L_mult(XoutGSC[2 * i + 1], AmsweightGSCout);

		// fre-EQ
		/*Mix_buf->FreqMix_data_buffer[2 * i] = (DVTXOP_shr(Mix_buf->FreqMix_data_buffer[2 * i], BLK_NORM_diff - 1));
		Mix_buf->FreqMix_data_buffer[2 * i + 1] = (DVTXOP_shr(Mix_buf->FreqMix_data_buffer[2 * i+1], BLK_NORM_diff - 1));*/

		Ltmp3 = DVTXOP_L_mult(Xo1[2 * i], BF_buf->AMSweightSubMicAvg);
		Ltmp4 = DVTXOP_L_mult(Xo1[2 * i + 1], BF_buf->AMSweightSubMicAvg);

//
		/*pwrMic = DVTXOP_L_add(DVTXOP_L_mpy_ls(Ltmp1, DVTXOP_extract_h(Ltmp1)), DVTXOP_L_mpy_ls(Ltmp2, DVTXOP_extract_h(Ltmp2)));
		pwrAcc = DVTXOP_L_add(DVTXOP_L_mpy_ls(Ltmp3, DVTXOP_extract_h(Ltmp3)), DVTXOP_L_mpy_ls(Ltmp4, DVTXOP_extract_h(Ltmp4)));*/

		XoutGSC[2 * i] = DVTXOP_extract_h(DVTXOP_L_add(Ltmp1, Ltmp3));
		XoutGSC[2 * i + 1] = DVTXOP_extract_h(DVTXOP_L_add(Ltmp2, Ltmp4));

	}

#endif

	// MODULE_130 Npsdgsc and SPPgsc (1800)
	fltfn_unbiasedMMSE_Npsd_SPP(XXgsc, Npsdgsc, BLK_NORM_Outer1, Npsdsppgsc, pH1gscavg, pH1gsc, tmpvec256A, FFT_HALFLEN, Flag_FrmNoiseFree, Flag_NoiseOnly, VAD_LTSVgsc_multiFlag, Flag_Tx_silent_mode_BF, 1, VADACC_buf);


	// MODULE 135 NpsdBM 
	// XXgsc : Q(2*BLK_NORM_Outer1+1)
	//fltfx_SolomonVoice_FFT_to_FFTpwr(tmpvec256A, X_B_NSR, FFT_HALFLEN); //XXbm, Q(2*BLK_NORM_Outer1+1)
	//fltfn_NpsdBM_estimation(NpsdBM, G_gsc_bm, pH1gsc, PwrXXgsc, XXgsc, PwrXXbm, tmpvec256A, BLK_NORM_Outer1, tmpvec256B, FFT_HALFLEN, FRAME_buf);

	//Npsd mixing : THD = 10^(55/10) noise free~noise1´Ü°è, 	THDpsdMask = 500
	THD_PowNoiseAvg = 5011872;
	THD_NoiseMixingMask = 2000;
#if(def_ctrl_AMS_onoff == 1)	
	if (Flag_AbnormalMic == 1)
	{
		THD_PowNoiseAvg = 630957; //10^(58/10)
		THD_NoiseMixingMask = 100000000;
	}
#endif
	Ltmp = fltfn_NpsdBM_Npsdgsc_Mixing(NpsdBFout, Npsdgsc, NpsdBM, THD_PowNoiseAvg, THD_NoiseMixingMask, FFT_HALFLEN);
	L_PwrNpsdgsc = Ltmp;

	//if (FRAME_buf->STATE_Voice_Active == 0)
	{
		if (FRAME_buf->PwrNoise_Npsdgsc > Ltmp)
			FRAME_buf->PwrNoise_Npsdgsc = Fx_recursive_avg(FRAME_buf->PwrNoise_Npsdgsc, Ltmp, DVTX_WORD16_0_85);
		else
			FRAME_buf->PwrNoise_Npsdgsc = Fx_recursive_avg(FRAME_buf->PwrNoise_Npsdgsc, Ltmp, DVTX_WORD16_0_95);
	}

	FRAME_buf->Flag_HighNoise_MixACC_MixNpsd = FRAME_buf->PwrNoise_Npsdgsc > THD_PowNoiseAvg ? 1 : 0;



#if 1	//#ifdef __CEPSTRAL_SNR_SMOOTHING_BASED_NS__
	// MODULE_140 cepstrum smoothing based postNS
	/* preNS for cepstrum */ //(1820)
	tmp_f=8 + 2 * (BLK_NORM_Outer1 - 8) + 1;
	{
		ae_valign   align1,align2;
		ae_int32x2 tmp_con= AE_MOVDA32(tmp_f);
		ae_int32x2  tmp1;
		ae_int32x2  *p_NpsdBFout=(ae_int32x2 *)(NpsdBFout);
		ae_int32x2  *p_Npsdgsc_Norm=(ae_int32x2 *)(Npsdgsc_Norm);
		align1 = AE_LA64_PP(p_NpsdBFout);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i+=2)
		{
	//		Npsdgsc_Norm[i] = DVTXOP_L_shl(Npsdgsc[i], tmp_f);
	//		Npsdgsc_Norm[i+1] = DVTXOP_L_shl(Npsdgsc[i+1], tmp_f);
			AE_LA32X2_IP(tmp1,align1,p_NpsdBFout);
			tmp1=AE_SLAA32S(tmp1, tmp_con);
			AE_SA32X2_IP(tmp1,align2,p_Npsdgsc_Norm);
		}
		AE_SA64POS_FP(align2, p_Npsdgsc_Norm);
	}
	fn_BF_PitchEnhance_1_preNS(ps, XXgsc, Npsdgsc_Norm, BLK_NORM_Outer1, BF_param, VADACC_buf, BLK_NORM_Acc);

	/*cepstrum*/ //(1840)
	fn_BF_PitchEnhance_2_cepstrum(ps_ceps, ps, BLK_NORM_Outer1); //Q(31-BLK_NORM)

	/* pitch enhencement */ //(1900)
	tmp_f=16 - BLK_NORM_Outer1;
	{
		ae_valign   align1,align2;
		ae_int32x2 tmp_con= AE_MOVDA32(tmp_f);
		ae_int32x2  tmp1;
		ae_int32x2  *p_ps_ceps=(ae_int32x2 *)(ps_ceps);
		ae_int32x2  *p_ps_ceps_s=(ae_int32x2 *)(ps_ceps);
		align1 = AE_LA64_PP(p_ps_ceps);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i+=2) //dbg
		{
	//		ps_ceps[i] = DVTXOP_L_shr(ps_ceps[i], tmp_f);
	//		ps_ceps[i+1] = DVTXOP_L_shr(ps_ceps[i+1], tmp_f);
			AE_LA32X2_IP(tmp1,align1,p_ps_ceps);
			tmp1=AE_SRAA32S(tmp1, tmp_con);
			AE_SA32X2_IP(tmp1,align2,p_ps_ceps_s);
		}
		AE_SA64POS_FP(align2, p_ps_ceps_s);
	}
	fn_BF_PitchEnhance_3_pitch_enhencement(ps_cepsavg, ps_ceps, BLK_NORM_Outer1, BF_buf, BF_param, FRAME_buf);

	/* Inverse cepstrum */ //(1920)
	tmp_f=16 - BLK_NORM_Outer1;
	{
		ae_valign   align1,align2;
		ae_int32x2 tmp_con= AE_MOVDA32(tmp_f);
		ae_int32x2  tmp1;
		ae_int32x2  *p_ps_cepsavg=(ae_int32x2 *)(ps_cepsavg);
		ae_int32x2  *p_ps_cepsavg_denorm=(ae_int32x2 *)(ps_cepsavg_denorm);
		align1 = AE_LA64_PP(p_ps_cepsavg);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i+=2) //dbg
		{
	//		ps_cepsavg_denorm[i] = DVTXOP_L_shl(ps_cepsavg[i], tmp_f);
	//		ps_cepsavg_denorm[i+1] = DVTXOP_L_shl(ps_cepsavg[i+1], tmp_f);
			AE_LA32X2_IP(tmp1,align1,p_ps_cepsavg);
			tmp1=AE_SLAA32S(tmp1, tmp_con);
			AE_SA32X2_IP(tmp1,align2,p_ps_cepsavg_denorm);
		}
		AE_SA64POS_FP(align2, p_ps_cepsavg_denorm);
	}
	fn_BF_PitchEnhance_4_Invcepstrum(XX_GSCcpes, ps_cepsavg_denorm, BLK_NORM_Outer1);

	/* cepstrum NS */ //(1940)
	tmp_f=(2 * BLK_NORM_Outer1 + 1) - 8;
	{
		ae_valign   align1,align2;
		ae_int32x2 tmp_con= AE_MOVDA32(tmp_f);
		ae_int32x2  tmp1;
		ae_int32x2  *p_NpsdBFout=(ae_int32x2 *)(NpsdBFout);
		ae_int32x2  *p_Npsdgsc_Norm=(ae_int32x2 *)(Npsdgsc_Norm);
		align1 = AE_LA64_PP(p_NpsdBFout);
		align2 = AE_ZALIGN64();
		for (i = 0; i < DVTX_M_FFT_HALFLEN_WB; i+=2)
		{
			AE_LA32X2_IP(tmp1,align1,p_NpsdBFout);
			tmp1=AE_SLAA32S(tmp1, tmp_con);
			AE_SA32X2_IP(tmp1,align2,p_Npsdgsc_Norm);
		}
		AE_SA64POS_FP(align2, p_Npsdgsc_Norm);
	}
#ifdef __SV_USE_ANC_RESULT__
	if (Rx_vad == 0 && ANC_buf->NoiseLevel == 1)
		for (i = 0; i < ANC_REF_FBIN_SIZE; i++)
		{
			{
				Ltmp = XXenh[i];
				Ltmp = DVTXOP_L_shl(Ltmp, (2 * BLK_NORM_Outer1 + 1 - 2 * BLK_NORM_IN));
				if (H1_inner[i] > 20000) XX_GSCcpes[i] = (XX_GSCcpes[i] > Ltmp) ? XX_GSCcpes[i] : Ltmp;
				else XX_GSCcpes[i] = Ltmp;
			}
		}
#endif
	fn_BF_PitchEnhance_5_cepstrumNS(XoutGSC, XX_GSCcpes/*Q(2*BLK_NORM+1)*/, Npsdgsc_Norm/*Q(2*BLK_NORM+1)*/, BF_buf, Flag_Tx_silent_mode_BF, VADACC_buf, FRAME_buf, DVTX_ECNS_vars->Context_buf.CNTX_N_LEVEL);

#endif



#ifdef __SV_PHASE_ENH__
	// phase enhancement
	if (ANC_buf->VAD == SPEECH)
		for (i = 0; i < ANC_REF_FBIN_SIZE; i++)
		{
			int XXm, XXi;
			short new_g;
			short idx_real = i << 1;
			short idx_imag = idx_real + 1;

			XXm = XoutGSC[idx_real] * XoutGSC[idx_real] + XoutGSC[idx_imag] * XoutGSC[idx_imag];
			XXi = XXenh[i];
			Ltmp = divide(XXm, 2 * BLK_NORM_Outer1, XXi, 2 * BLK_NORM_IN, 20);
			Ltmp = sqrt32(Ltmp);
			new_g = DVTXOP_saturate(Ltmp);


			XoutGSC[idx_real] = DVTXOP_saturate(DVTXOP_L_shr(Xenh_in[idx_real] * new_g, 10 + BLK_NORM_IN - BLK_NORM_Outer1));
			XoutGSC[idx_imag] = DVTXOP_saturate(DVTXOP_L_shr(Xenh_in[idx_imag] * new_g, 10 + BLK_NORM_IN - BLK_NORM_Outer1));
		}
#endif



	// test bypass
	{

		ae_valign   align1,align2;
		ae_int16x4  tmp1;
		ae_int16x4  *p_XoutGSC=(ae_int16x4 *)(XoutGSC);
		ae_int16x4  *p_buf=(ae_int16x4 *)(FRAME_buf->fftbuf_Outer_1.data_buffer);
		align1 = AE_LA64_PP(p_XoutGSC);
		align2 = AE_ZALIGN64();
		for (i = 0; i < FFT_LEN; i+=4)
		{

			AE_LA16X4_IP(tmp1,align1,p_XoutGSC);
			AE_SA16X4_IP(tmp1,align2,p_buf);
		}
		AE_SA64POS_FP(align2, p_buf);
	}

	return;
}
#endif

