#include "SamsungSolomonVoiceW_Int.h"
#include "SamsungSolomonVoiceW_Layer.h"


#if(FLAG_SELECT_C_DSP == 1)
#include <stdio.h>      
#include <stdlib.h> 
#endif

void Setting_Params_FRAME_param(SamsungSolomonVoiceWTxFRAMEParam* FRAME_param, short bandwidth)
{
	FRAME_param->PARA_txMode = 1;
	FRAME_param->PARA_call_mode_HS_HF_EAR = DVTX_CALL_INER;

	FRAME_param->TX_Inner_bandwidth = DVTX_M_FRM_LEN_NB;
	FRAME_param->TX_Outer_bandwidth = bandwidth;

	FRAME_param->PARA_AEC_ONOFF_Inner = 1;
	FRAME_param->PARA_AEC_ONOFF_Outer = 1;
	FRAME_param->PARA_FNLMS_ONOFF_Inner = 1;
	FRAME_param->PARA_FNLMS_ONOFF_Outer = 1;
	FRAME_param->PARA_RES_ONOFF_Inner = 1;
	FRAME_param->PARA_RES_ONOFF_Outer = 1;
	FRAME_param->PARA_NS_ONOFF_Inner = 1;
	FRAME_param->PARA_NS_ONOFF_Outer = 1;
	FRAME_param->PARA_Mixing_ONOFF_Outer = 1;

	FRAME_param->PARA_FLAG_FIRST_FRM_Inner = 1;
	FRAME_param->PARA_FLAG_FIRST_FRM_Outer = 1;

	FRAME_param->PARA_Q_for_InSigGain_Inner = 10;
	FRAME_param->PARA_Gain_TxSig_Inner = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Inner);
	FRAME_param->PARA_Gain_RxSig_Inner = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Inner);
	FRAME_param->PARA_Gain_TxSig_NS_IN_Inner = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Inner);
	FRAME_param->PARA_Gain_RxSig_NS_IN_Inner = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Inner);
	FRAME_param->PARA_Gain_TxSig_NS_Out_Inner = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Inner);

	FRAME_param->PARA_Q_for_InSigGain_Outer = 10;
	FRAME_param->PARA_Gain_TxSig_Outer = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);//3.1622f
	FRAME_param->PARA_Gain_RxSig_Outer = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);
	FRAME_param->PARA_Gain_TxSig_NS_IN_Outer = DVTX_FLOAT2FIXED(2.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);
	FRAME_param->PARA_Gain_RxSig_NS_IN_Outer = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);
	
	FRAME_param->PARA_Gain_TxSig_NS_Out_Outer = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);
	FRAME_param->PARA_Gain_TxSig_Out = DVTX_FLOAT2FIXED(5.3088f, FRAME_param->PARA_Q_for_InSigGain_Outer);// 14.5dB

	//FRAME_param->PARA_reserved_11 = DVTX_FLOAT2FIXED(1.0f, FRAME_param->PARA_Q_for_InSigGain_Outer);
	FRAME_param->PARA_reserved_11 = 1;

	FRAME_param->PARA_reserved_12 = 0; //reserved
	FRAME_param->PARA_reserved_13 = 0;
	FRAME_param->PARA_reserved_14 = 0;
	FRAME_param->PARA_reserved_15 = 0;
	FRAME_param->PARA_reserved_16 = 0;
	FRAME_param->PARA_reserved_17 = 0;
	FRAME_param->PARA_reserved_18 = 0;
	FRAME_param->PARA_reserved_19 = 0;
	FRAME_param->PARA_reserved_20 = 0;

	return;

}


void Setting_Params_AEC_Inner_param(SamsungSolomonVoiceWTxAECParam* AEC_Inner_param)
{
	AEC_Inner_param->PARA_reserved_1 = 1; //AEC on/off
	
	AEC_Inner_param->PARA_FLAG_RxVAD_First_AEC = 0;
	AEC_Inner_param->PARA_reserved_7 = 30;
	
	AEC_Inner_param->PARA_Nadfdelay = 185; // 50 for gear s4
	AEC_Inner_param->PARA_Pwr_LoTHD_ADF_IN = DVTX_FLOAT2FIXED(41.f, 8);
	AEC_Inner_param->PARA_THD_Pwr_Rx_AEC_IN_dB = DVTX_FLOAT2FIXED(30.f, 8);
	AEC_Inner_param->PARA_THD_Pwr_Tx_dB = DVTX_FLOAT2FIXED(30.0f, 8);
	AEC_Inner_param->PARA_THD_Pwr_Tx_Loud_dB = DVTX_FLOAT2FIXED(56.0f, 8);   //DVTX_FLOAT2FIXED(45.0f, 8)
	AEC_Inner_param->PARA_THD_RxTx_Pwr_Difference = DVTX_FLOAT2FIXED(5.0f, 8);// pwr diff for sample by sample for AEC update
	AEC_Inner_param->PARA_ADF_reference_step_lowbit = (DVTX_FLOAT2FIXED(0.000015f, 31) & 0xFFFF);// minimum step is 0.00001
	AEC_Inner_param->PARA_ADF_reference_step_highbit = (DVTX_FLOAT2FIXED(0.000015f, 31) >> 16);
	AEC_Inner_param->PARA_ADF_Wvar_THD_lowbit = (DVTX_FLOAT2FIXED(0.005f, 21) & 0xFFFF);// filter Q
	AEC_Inner_param->PARA_ADF_Wvar_THD_highbit = (DVTX_FLOAT2FIXED(0.005f, 21) >> 16);
	
	AEC_Inner_param->PARA_reserved_21 = DVTX_FLOAT2FIXED(0.90f, 13);// PARA_THD_XECC_high : xcorr upper threshold	
	AEC_Inner_param->PARA_reserved_22 = DVTX_FLOAT2FIXED(0.10f, 13);// PARA_THD_XECC_low  : xcorr lower threshold	
	AEC_Inner_param->PARA_reserved_23 = DVTX_FLOAT2FIXED(0.1f, 10);// PARA_EchoPSD_Gain_highXECC : resi Echo psd gain in high xcorr	
	AEC_Inner_param->PARA_reserved_24 = DVTX_FLOAT2FIXED(0.1f, 10);// PARA_EchoPSD_Gain_lowXECC  : resi Echo psd gain in low  xcorr	
	AEC_Inner_param->PARA_reserved_25 = (400000000 & 0xFFFF); //ringback sig pwrdiff thd lowbit
	AEC_Inner_param->PARA_reserved_26 = (400000000 >> 16); //ringback sig pwrdiff thd lowbit
	AEC_Inner_param->PARA_reserved_27 = DVTX_FLOAT2FIXED(14.0f, 8); // PwrDiff_TxRx_to detect strong ST
	AEC_Inner_param->PARA_reserved_28 = 20000; //RxClipping_Bound
	AEC_Inner_param->PARA_reserved_29 = DVTX_FLOAT2FIXED(41.0f, 8); // PARA_THD_Pwr_Tx_AECin_low
	AEC_Inner_param->PARA_reserved_30 = DVTX_FLOAT2FIXED(35.0f, 8);//PwrDiff TxRx to detect strong tx-NET only
	AEC_Inner_param->PARA_reserved_33 = DVTX_FLOAT2FIXED(7.0f, 8); //PARA_THD_AECinoutDIFFerence to update Waux	
	
	AEC_Inner_param->PARA_reserved_34 = 0;	
	AEC_Inner_param->PARA_reserved_35 = 0;
	AEC_Inner_param->PARA_reserved_36 = 0;
	AEC_Inner_param->PARA_reserved_37 = 0;
	AEC_Inner_param->PARA_reserved_38 = 0;
	AEC_Inner_param->PARA_reserved_39 = 0;
	AEC_Inner_param->PARA_reserved_40 = 0;
}

void Setting_Params_AEC_Outer_1_param(SamsungSolomonVoiceWTxAECParam* AEC_Outer_param_1)
{//´Ù½Ã ÇÒ °Í.
	AEC_Outer_param_1->PARA_reserved_1 = 1; //AEC on/off

	AEC_Outer_param_1->PARA_FLAG_RxVAD_First_AEC = 0;
	AEC_Outer_param_1->PARA_reserved_7 = 40;

	AEC_Outer_param_1->PARA_Nadfdelay = 370; // 50 for gear s4
	AEC_Outer_param_1->PARA_Pwr_LoTHD_ADF_IN = DVTX_FLOAT2FIXED(39.f, 8); // ADF input Rx THD
	AEC_Outer_param_1->PARA_THD_Pwr_Rx_AEC_IN_dB = DVTX_FLOAT2FIXED(49.f, 8); // RxVAD THD
	AEC_Outer_param_1->PARA_THD_Pwr_Tx_dB = DVTX_FLOAT2FIXED(17.0f, 8); // TxTHD to detect silence
	AEC_Outer_param_1->PARA_THD_Pwr_Tx_Loud_dB = DVTX_FLOAT2FIXED(41.0f, 8);   //DVTX_FLOAT2FIXED(45.0f, 8)
	AEC_Outer_param_1->PARA_THD_RxTx_Pwr_Difference = DVTX_FLOAT2FIXED(-22.0f, 8); // pwr diff for sample by sample for AEC update
	AEC_Outer_param_1->PARA_ADF_reference_step_lowbit = (DVTX_FLOAT2FIXED(0.00005f, 31) & 0xFFFF);// minimum step is 0.00001
	AEC_Outer_param_1->PARA_ADF_reference_step_highbit = (DVTX_FLOAT2FIXED(0.00005f, 31) >> 16);
	AEC_Outer_param_1->PARA_ADF_Wvar_THD_lowbit = (DVTX_FLOAT2FIXED(0.0010f, 21) & 0xFFFF);// filter Q
	AEC_Outer_param_1->PARA_ADF_Wvar_THD_highbit = (DVTX_FLOAT2FIXED(0.0010f, 21) >> 16);

	AEC_Outer_param_1->PARA_reserved_21 = DVTX_FLOAT2FIXED(0.90f, 13);// PARA_THD_XECC_high : xcorr upper threshold	
	AEC_Outer_param_1->PARA_reserved_22 = DVTX_FLOAT2FIXED(0.30f, 13);// PARA_THD_XECC_low  : xcorr lower threshold
	AEC_Outer_param_1->PARA_reserved_23 = DVTX_FLOAT2FIXED(0.05f, 10);// PARA_EchoPSD_Gain_highXECC : resi Echo psd gain in high xcorr
	AEC_Outer_param_1->PARA_reserved_24 = DVTX_FLOAT2FIXED(0.05f, 10);// PARA_EchoPSD_Gain_lowXECC  : resi Echo psd gain in low  xcorr
	AEC_Outer_param_1->PARA_reserved_25 = (1500000000 & 0xFFFF); //ringback sig pwrdiff thd lowbit
	AEC_Outer_param_1->PARA_reserved_26 = (1500000000 >> 16); //ringback sig pwrdiff thd lowbit
	AEC_Outer_param_1->PARA_reserved_27 = DVTX_FLOAT2FIXED(-19.f, 8);	// PwrDiff_TxRx_to detect strong ST
	AEC_Outer_param_1->PARA_reserved_28 = 30000; //RxClipping_Bound
	AEC_Outer_param_1->PARA_reserved_29 = DVTX_FLOAT2FIXED(24.0f, 8);	// PARA_THD_Pwr_Tx_AECin_low
	AEC_Outer_param_1->PARA_reserved_30 = DVTX_FLOAT2FIXED(28.f, 8);	//PwrDiff TxRx to detect strong tx-NET only
	AEC_Outer_param_1->PARA_reserved_33 = DVTX_FLOAT2FIXED(5.0f, 8); //PARA_THD_AECinoutDIFFerence to update Waux	

	AEC_Outer_param_1->PARA_reserved_34 = 0;
	AEC_Outer_param_1->PARA_reserved_35 = 0;
	AEC_Outer_param_1->PARA_reserved_36 = 0;
	AEC_Outer_param_1->PARA_reserved_37 = 0;
	AEC_Outer_param_1->PARA_reserved_38 = 0;
	AEC_Outer_param_1->PARA_reserved_39 = 0;
	AEC_Outer_param_1->PARA_reserved_40 = 0;

	return;

}

void Setting_Params_AEC_Outer_2_param(SamsungSolomonVoiceWTxAECParam* AEC_Outer_param_2)
{//´Ù½Ã ÇÒ °Í.
	AEC_Outer_param_2->PARA_reserved_1 = 1; //AEC on/off

	AEC_Outer_param_2->PARA_FLAG_RxVAD_First_AEC = 0;
	AEC_Outer_param_2->PARA_reserved_7 = 40;

	AEC_Outer_param_2->PARA_Nadfdelay = 370; // 50 for gear s4
	AEC_Outer_param_2->PARA_Pwr_LoTHD_ADF_IN = DVTX_FLOAT2FIXED(39.f, 8); // ADF input Rx THD
	AEC_Outer_param_2->PARA_THD_Pwr_Rx_AEC_IN_dB = DVTX_FLOAT2FIXED(49.f, 8); // RxVAD THD
	AEC_Outer_param_2->PARA_THD_Pwr_Tx_dB = DVTX_FLOAT2FIXED(17.0f, 8); // TxTHD to detect silence
	AEC_Outer_param_2->PARA_THD_Pwr_Tx_Loud_dB = DVTX_FLOAT2FIXED(41.0f, 8);   //DVTX_FLOAT2FIXED(45.0f, 8)
	AEC_Outer_param_2->PARA_THD_RxTx_Pwr_Difference = DVTX_FLOAT2FIXED(-22.0f, 8); // pwr diff for sample by sample for AEC update
	AEC_Outer_param_2->PARA_ADF_reference_step_lowbit = (DVTX_FLOAT2FIXED(0.00005f, 31) & 0xFFFF);// minimum step is 0.00001
	AEC_Outer_param_2->PARA_ADF_reference_step_highbit = (DVTX_FLOAT2FIXED(0.00005f, 31) >> 16);
	AEC_Outer_param_2->PARA_ADF_Wvar_THD_lowbit = (DVTX_FLOAT2FIXED(0.0010f, 21) & 0xFFFF);// filter Q
	AEC_Outer_param_2->PARA_ADF_Wvar_THD_highbit = (DVTX_FLOAT2FIXED(0.0010f, 21) >> 16);

	AEC_Outer_param_2->PARA_reserved_21 = DVTX_FLOAT2FIXED(0.90f, 13);// PARA_THD_XECC_high : xcorr upper threshold	
	AEC_Outer_param_2->PARA_reserved_22 = DVTX_FLOAT2FIXED(0.30f, 13);// PARA_THD_XECC_low  : xcorr lower threshold
	AEC_Outer_param_2->PARA_reserved_23 = DVTX_FLOAT2FIXED(0.05f, 10);// PARA_EchoPSD_Gain_highXECC : resi Echo psd gain in high xcorr
	AEC_Outer_param_2->PARA_reserved_24 = DVTX_FLOAT2FIXED(0.05f, 10);// PARA_EchoPSD_Gain_lowXECC  : resi Echo psd gain in low  xcorr
	AEC_Outer_param_2->PARA_reserved_25 = (1500000000 & 0xFFFF); //ringback sig pwrdiff thd lowbit
	AEC_Outer_param_2->PARA_reserved_26 = (1500000000 >> 16); //ringback sig pwrdiff thd lowbit
	AEC_Outer_param_2->PARA_reserved_27 = DVTX_FLOAT2FIXED(-19.f, 8);	// PwrDiff_TxRx_to detect strong ST
	AEC_Outer_param_2->PARA_reserved_28 = 30000; //RxClipping_Bound
	AEC_Outer_param_2->PARA_reserved_29 = DVTX_FLOAT2FIXED(24.0f, 8);	// PARA_THD_Pwr_Tx_AECin_low
	AEC_Outer_param_2->PARA_reserved_30 = DVTX_FLOAT2FIXED(28.f, 8);	//PwrDiff TxRx to detect strong tx-NET only
	AEC_Outer_param_2->PARA_reserved_33 = DVTX_FLOAT2FIXED(5.0f, 8); //PARA_THD_AECinoutDIFFerence to update Waux	

	AEC_Outer_param_2->PARA_reserved_34 = 0;
	AEC_Outer_param_2->PARA_reserved_35 = 0;
	AEC_Outer_param_2->PARA_reserved_36 = 0;
	AEC_Outer_param_2->PARA_reserved_37 = 0;
	AEC_Outer_param_2->PARA_reserved_38 = 0;
	AEC_Outer_param_2->PARA_reserved_39 = 0;
	AEC_Outer_param_2->PARA_reserved_40 = 0;

	return;

}

void Setting_Params_BF_param(SamsungSolomonVoiceWTxBFParam* BF_param)
{
	/*BF_param->q1st = 50;
	BF_param->qend = 220;
	BF_param->beta = 0.92;*/

	return;

}

void Setting_Params_RES_Inner_param(SamsungSolomonVoiceWTxRESParam* RES_Inner_param)
{
	int i;

	RES_Inner_param->PARA_reserved_2 = 1; // FNLMS ON / OFF
	RES_Inner_param->PARA_reserved_3 = 1; // RES ON/OFF
	RES_Inner_param->PARA_Gain_EchoPSD_RES = DVTX_FLOAT2FIXED(0.2f, 15);
	RES_Inner_param->PARA_NoiseFloor_RES = DVTX_FLOAT2FIXED(0.1f, 15);// 0.05*2^15  Q0.15
	for (i = 0; i < 40; i++) 
		RES_Inner_param->PARA_Gain_Echo_PSD[i] = Gain_Echo_PSD_GEAR_NB[i];
	
	//RES_Inner_param->PARA_reserved_28 = 20000; // PARA_RxClipping_Bound
	RES_Inner_param->PARA_reserved_31 = DVTX_FLOAT2FIXED(0.005f, 15); //PARA_RESgainlIMIT_IniRxSigOnSet
	RES_Inner_param->PARA_reserved_32 = 0; //PARA_RES_prioSNRga in ST interval : not used
	
	RES_Inner_param->PARA_reserved_41 = 5; // Fadf oversubtraction bit sifht 0~1kHz
	RES_Inner_param->PARA_reserved_42 = 5; // Fadf oversubtraction bit sifht 1~4kHz
	RES_Inner_param->PARA_reserved_43 = 5; // Fadf oversubtraction bit sifht 4~8kHz
	RES_Inner_param->PARA_reserved_44 = 1; // over Rx psd estimation for single NET flag
	RES_Inner_param->PARA_reserved_45 = DVTX_FLOAT2FIXED(0.99f, 15); // single NET flag, Wiener gain THD 0~1.0
	RES_Inner_param->PARA_reserved_46 = 29000; // Wfnlms ini value
	RES_Inner_param->PARA_reserved_47 = 0;
	RES_Inner_param->PARA_reserved_48 = 0;
	RES_Inner_param->PARA_reserved_49 = 0;
	RES_Inner_param->PARA_reserved_50 = 0;
	RES_Inner_param->PARA_reserved_51 = 0;
	RES_Inner_param->PARA_reserved_52 = 0;
	RES_Inner_param->PARA_reserved_53 = 0;
	RES_Inner_param->PARA_reserved_54 = 0;
	RES_Inner_param->PARA_reserved_55 = 0;
	RES_Inner_param->PARA_reserved_56 = 0;
	RES_Inner_param->PARA_reserved_57 = 0;
	RES_Inner_param->PARA_reserved_58 = 0;
	RES_Inner_param->PARA_reserved_59 = 0;
	RES_Inner_param->PARA_reserved_60 = 0;
	
	return;
}

void Setting_Params_RES_Outer_param(SamsungSolomonVoiceWTxRESParam* RES_Outer_param)
{
	int i;

	RES_Outer_param->PARA_reserved_2 = 1; // FNLMS ON / OFF
	RES_Outer_param->PARA_reserved_3 = 1; // RES ON/OFF
	RES_Outer_param->PARA_Gain_EchoPSD_RES = DVTX_FLOAT2FIXED(0.0001f, 15);
	RES_Outer_param->PARA_NoiseFloor_RES = DVTX_FLOAT2FIXED(0.0001f, 15);// 0.05*2^15  Q0.15
	for (i = 0; i < 40; i++)
		RES_Outer_param->PARA_Gain_Echo_PSD[i] = Gain_Echo_PSD_GEAR_WB[i];

	//RES_Outer_param->PARA_reserved_28 = 20000; // PARA_RxClipping_Bound
	RES_Outer_param->PARA_reserved_31 = DVTX_FLOAT2FIXED(0.005f, 15); //PARA_RESgainlIMIT_IniRxSigOnSet
	RES_Outer_param->PARA_reserved_32 = 0; //PARA_RES_prioSNRga in ST interval : not used

	RES_Outer_param->PARA_reserved_41 = 0; // Fadf oversubtraction bit sifht 0~1kHz, not used
	RES_Outer_param->PARA_reserved_42 = 0; // Fadf oversubtraction bit sifht 1~4kHz
	RES_Outer_param->PARA_reserved_43 = 0; // Fadf oversubtraction bit sifht 4~8kHz
	RES_Outer_param->PARA_reserved_44 = 0; // over Rx psd estimation for single NET flag
	RES_Outer_param->PARA_reserved_45 = DVTX_FLOAT2FIXED(0.99f, 15); // single NET flag, Wiener gain THD 0~1.0
	RES_Outer_param->PARA_reserved_46 = 16000; // Wfnlms ini value
	RES_Outer_param->PARA_reserved_47 = 0;
	RES_Outer_param->PARA_reserved_48 = 0;
	RES_Outer_param->PARA_reserved_49 = 0;
	RES_Outer_param->PARA_reserved_50 = 0;
	RES_Outer_param->PARA_reserved_51 = 0;
	RES_Outer_param->PARA_reserved_52 = 0;
	RES_Outer_param->PARA_reserved_53 = 0;
	RES_Outer_param->PARA_reserved_54 = 0;
	RES_Outer_param->PARA_reserved_55 = 0;
	RES_Outer_param->PARA_reserved_56 = 0;
	RES_Outer_param->PARA_reserved_57 = 0;
	RES_Outer_param->PARA_reserved_58 = 0;
	RES_Outer_param->PARA_reserved_59 = 0;
	RES_Outer_param->PARA_reserved_60 = 0;

	return;

}

void Setting_Params_NS_Inner_param(SamsungSolomonVoiceWTxNSParam* NS_Inner_param)
{
	int i;

	NS_Inner_param->PARA_ns_level = DVTX_FLOAT2FIXED(0.0f, 15);

	NS_Inner_param->PARA_HangOver_Cnt_NoiseFree = 0;
	NS_Inner_param->PARA_Gain_EchoPSD_NS = DVTX_FLOAT2FIXED(0.0001f, 15); // Echo psd gain for Noisd psd calculation 0 to 32767 q15
	NS_Inner_param->PARA_xi_for_SPP_Table = 0;// 0 to 15 [dB] scale
	NS_Inner_param->PARA_Npsd_Gain_MIN = DVTX_FLOAT2FIXED(0.7f, 15);//	Npsd	gain	in	silence	interval
	NS_Inner_param->PARA_NoiseFloor_Offset_MAX = DVTX_FLOAT2FIXED(0.2f, 15);//	Gain	floor	offset	in	silence	interval
	NS_Inner_param->PARA_MIN_CHAN_PWR = 1;
	NS_Inner_param->PARA_MIN_NOISE_PWR = 1;
	NS_Inner_param->PARA_NoiseFloorOffset_0_250Hz_low = DVTX_FLOAT2FIXED(0.1f, 15); // 0.2 Q15
	NS_Inner_param->PARA_NoiseFloorOffset_0_250Hz_high = DVTX_FLOAT2FIXED(0.12f, 15);// 0.25 Q15
	NS_Inner_param->PARA_NoiseFloorOffset_250_4000Hz_low = DVTX_FLOAT2FIXED(0.1f, 15);// 0.12 Q15
	NS_Inner_param->PARA_NoiseFloorOffset_250_4000Hz_high = DVTX_FLOAT2FIXED(0.12f, 15); // 0.3 Q15
	NS_Inner_param->PARA_NoiseFloorOffset_4000_8000Hz_low = DVTX_FLOAT2FIXED(0.10f, 15);// 0.04 Q15
	NS_Inner_param->PARA_NoiseFloorOffset_4000_8000Hz_high = DVTX_FLOAT2FIXED(0.12f, 15); // 0.3 Q15
	NS_Inner_param->PARA_THD_Pwr_Lo_1k_4k_lowbit = (0 & 0xFFFF);
	NS_Inner_param->PARA_THD_Pwr_Lo_1k_4k_highbit = (0 >> 16);
	NS_Inner_param->PARA_Slop_SNRiniAvg_for_beta = DVTX_FLOAT2FIXED(1.0f / (5.0f - 1.5f), 15);//1/(5.0-1.5)*2^15 q15
	NS_Inner_param->PARA_THD_Lo_SNRiniAvg_for_beta_lowbit = (DVTX_FLOAT2FIXED(1.5f, 15) & 0xFFFF);
	NS_Inner_param->PARA_THD_Lo_SNRiniAvg_for_beta_highbit = (DVTX_FLOAT2FIXED(1.5f, 15) >> 16);
	NS_Inner_param->PARA_THD_Hi_SNRiniAvg_for_beta_lowbit = (DVTX_FLOAT2FIXED(5.0f, 15) & 0xFFFF);
	NS_Inner_param->PARA_THD_Hi_SNRiniAvg_for_beta_highbit = (DVTX_FLOAT2FIXED(5.0f, 15) >> 16);
	NS_Inner_param->PARA_THD_Lo_prioriSNR_for_NoiseFloor_lowbit = (20675 & 0xFFFF);
	NS_Inner_param->PARA_THD_Lo_prioriSNR_for_NoiseFloor_highbit = (20675 >> 16);
	NS_Inner_param->PARA_THD_Hi_prioriSNR_for_NoiseFloor_lowbit = (327680 & 0xFFFF);
	NS_Inner_param->PARA_THD_Hi_prioriSNR_for_NoiseFloor_highbit = (327680 >> 16);
	NS_Inner_param->PARA_slope_prioriSNR_for_NoiseFloor = 27979; //=1/(x2-x1) = 1/(10^(10/10)-10^(-2/10))*2^18 q18
	for (i = 0; i < 40; i++) {
		NS_Inner_param->PARA_FixedXi_iniSNR[i] = FixedXi_GEAR_NB[i][0];
		NS_Inner_param->PARA_FixedXi_srtSNR[i] = FixedXi_GEAR_NB[i][1];
		NS_Inner_param->PARA_FixedXi_lotSNR[i] = FixedXi_GEAR_NB[i][2];
	}

	NS_Inner_param->PARA_reserved_4 = 1;
	NS_Inner_param->PARA_reserved_61 = 1;     // PARA_post_fDRC_OnOff_FLAG : 0(off), 1(on)
	NS_Inner_param->PARA_reserved_62 = 10;   // PARA_THD_TxPwr_LOWER
	NS_Inner_param->PARA_reserved_63 = 10000;  // PARA_THD_TxPwr_UPPER
	NS_Inner_param->PARA_reserved_64 = 32000; // PARA_fDRC_SNT_Gain : Rx off fDRC gain
	NS_Inner_param->PARA_reserved_65 = 14;
	
	NS_Inner_param->PARA_reserved_66 = 0;
	NS_Inner_param->PARA_reserved_67 = 0;
	NS_Inner_param->PARA_reserved_68 = 0;
	NS_Inner_param->PARA_reserved_69 = 0;
	NS_Inner_param->PARA_reserved_70 = 0;
	NS_Inner_param->PARA_reserved_71 = 0;
	NS_Inner_param->PARA_reserved_72 = 0;
	NS_Inner_param->PARA_reserved_73 = 0;
	NS_Inner_param->PARA_reserved_74 = 0;
	NS_Inner_param->PARA_reserved_75 = 0;
	NS_Inner_param->PARA_reserved_76 = 0;
	NS_Inner_param->PARA_reserved_77 = 0;
	NS_Inner_param->PARA_reserved_78 = 0;
	NS_Inner_param->PARA_reserved_79 = 0;
	NS_Inner_param->PARA_reserved_80 = 0;
									   
	return;
}

void Setting_Params_NS_Outer_param(SamsungSolomonVoiceWTxNSParam* NS_Outer_param)
{
	int i;

	NS_Outer_param->PARA_ns_level = DVTX_FLOAT2FIXED(0.0f, 15);

	NS_Outer_param->PARA_HangOver_Cnt_NoiseFree = 100;
	NS_Outer_param->PARA_Gain_EchoPSD_NS = DVTX_FLOAT2FIXED(0.0001f, 15); // Echo psd gain for Noisd psd calculation 0 to 32767 q15
	NS_Outer_param->PARA_xi_for_SPP_Table = 0;// 0 to 15 [dB] scale
	NS_Outer_param->PARA_Npsd_Gain_MIN = DVTX_FLOAT2FIXED(0.4f, 15);//	Npsd	gain	in	silence	interval
	NS_Outer_param->PARA_NoiseFloor_Offset_MAX = DVTX_FLOAT2FIXED(0.5f, 15);//	Gain	floor	offset	in	silence	interval
	NS_Outer_param->PARA_MIN_CHAN_PWR = 1;
	NS_Outer_param->PARA_MIN_NOISE_PWR = 1;
	NS_Outer_param->PARA_NoiseFloorOffset_0_250Hz_low = DVTX_FLOAT2FIXED(0.20f, 15);			// 0.2 Q15
	NS_Outer_param->PARA_NoiseFloorOffset_0_250Hz_high = DVTX_FLOAT2FIXED(0.22f, 15);		// 0.25 Q15
	NS_Outer_param->PARA_NoiseFloorOffset_250_4000Hz_low = DVTX_FLOAT2FIXED(0.18f, 15);		// 0.12 Q15
	NS_Outer_param->PARA_NoiseFloorOffset_250_4000Hz_high = DVTX_FLOAT2FIXED(0.20f, 15);	// 0.3 Q15
	NS_Outer_param->PARA_NoiseFloorOffset_4000_8000Hz_low = DVTX_FLOAT2FIXED(0.16f, 15);		// 0.04 Q15
	NS_Outer_param->PARA_NoiseFloorOffset_4000_8000Hz_high = DVTX_FLOAT2FIXED(0.18f, 15);	// 0.3 Q15
	NS_Outer_param->PARA_THD_Pwr_Lo_1k_4k_lowbit = (400 & 0xFFFF);
	NS_Outer_param->PARA_THD_Pwr_Lo_1k_4k_highbit = (400 >> 16);
	NS_Outer_param->PARA_Slop_SNRiniAvg_for_beta = DVTX_FLOAT2FIXED(1.0f / (5.0f - 1.5f), 15);//1/(5.0-1.5)*2^15 q15
	NS_Outer_param->PARA_THD_Lo_SNRiniAvg_for_beta_lowbit = (DVTX_FLOAT2FIXED(1.5f, 15) & 0xFFFF);
	NS_Outer_param->PARA_THD_Lo_SNRiniAvg_for_beta_highbit = (DVTX_FLOAT2FIXED(1.5f, 15) >> 16);
	NS_Outer_param->PARA_THD_Hi_SNRiniAvg_for_beta_lowbit = (DVTX_FLOAT2FIXED(5.0f, 15) & 0xFFFF);
	NS_Outer_param->PARA_THD_Hi_SNRiniAvg_for_beta_highbit = (DVTX_FLOAT2FIXED(5.0f, 15) >> 16);
	NS_Outer_param->PARA_THD_Lo_prioriSNR_for_NoiseFloor_lowbit = (20675 & 0xFFFF);
	NS_Outer_param->PARA_THD_Lo_prioriSNR_for_NoiseFloor_highbit = (20675 >> 16);
	NS_Outer_param->PARA_THD_Hi_prioriSNR_for_NoiseFloor_lowbit = (327680 & 0xFFFF);
	NS_Outer_param->PARA_THD_Hi_prioriSNR_for_NoiseFloor_highbit = (327680 >> 16);
	NS_Outer_param->PARA_slope_prioriSNR_for_NoiseFloor = 27979; //=1/(x2-x1) = 1/(10^(10/10)-10^(-2/10))*2^18 q18
	for (i = 0; i < 40; i++) 
	{
		NS_Outer_param->PARA_FixedXi_iniSNR[i] = 2;
		NS_Outer_param->PARA_FixedXi_srtSNR[i] = 5;
		NS_Outer_param->PARA_FixedXi_lotSNR[i] = 5;
	}

	NS_Outer_param->PARA_reserved_4  = 1;     // flag NS on off
	NS_Outer_param->PARA_reserved_61 = 1;     // PARA_post_fDRC_OnOff_FLAG : 0(off), 1(on)
	NS_Outer_param->PARA_reserved_62 = 8;   // PARA_THD_TxPwr_LOWER
	NS_Outer_param->PARA_reserved_63 = 5000;  // PARA_THD_TxPwr_UPPER
	NS_Outer_param->PARA_reserved_64 = 1000; // PARA_fDRC_SNT_Gain : Rx off fDRC gain
	NS_Outer_param->PARA_reserved_65 = 14;

	NS_Outer_param->PARA_reserved_66 = 0;
	NS_Outer_param->PARA_reserved_67 = 0;
	NS_Outer_param->PARA_reserved_68 = 0;
	NS_Outer_param->PARA_reserved_69 = 0;
	NS_Outer_param->PARA_reserved_70 = 0;
	NS_Outer_param->PARA_reserved_71 = 0;
	NS_Outer_param->PARA_reserved_72 = 0;
	NS_Outer_param->PARA_reserved_73 = 0;
	NS_Outer_param->PARA_reserved_74 = 0;
	NS_Outer_param->PARA_reserved_75 = 0;
	NS_Outer_param->PARA_reserved_76 = 0;
	NS_Outer_param->PARA_reserved_77 = 0;
	NS_Outer_param->PARA_reserved_78 = 0;
	NS_Outer_param->PARA_reserved_79 = 0;
	NS_Outer_param->PARA_reserved_80 = 0;

	return;
}

void Setting_Params_PreNS_Inner_param(SamsungSolomonVoiceWTxPRENSParam* PreNS_Inner_param)
{
	PreNS_Inner_param->PreNS_onoff = 1;

	return;
}

void Setting_Params_PreNS_Outer_param(SamsungSolomonVoiceWTxPRENSParam* PreNS_Outer_param)
{
	PreNS_Outer_param->PreNS_onoff = 1;
	
	return;
}

void Setting_Params_ANC_Inner_param(SamsungSolomonVoiceWTxANCParam* ANC_Inner_param)
{
	ANC_Inner_param->ANC_onoff = 1;

	return;
}

void Setting_Params_ANC_Outer_param(SamsungSolomonVoiceWTxANCParam* ANC_Outer_param)
{
	ANC_Outer_param->ANC_onoff = 1;
	
	return;
}

void Setting_Params_Mix_param(SamsungSolomonVoiceWTxMixParam* Mix_param)
{
	Mix_param->Mix_Freq_onoff  = 1;
	Mix_param->Mix_Time_onoff  = 1;
	Mix_param->PARA_reserved_9 = 1;
	Mix_param->PARA_reserved_5 = 0; //InPARA_Modechange_Hangover
	Mix_param->PARA_reserved_6 = 0; // InPARA_TxRxHPFcoef_index for BT path

	return;
}

void Setting_Params_AGC_NSIN_param(SamsungSolomonVoiceWTxAGCParam* AGC_param)
{
	AGC_param->denom = 102;
	AGC_param->size = DVTX_FRAME_LENGTH_WB;

	AGC_param->agc_comThd = TX_AGC_COMPRESSOR_THRESHOLD_M20DB;
	AGC_param->agc_comSlope = TX_AGC_COMPRESSOR_SLOPE_8P5;
	AGC_param->agc_expThd = TX_AGC_EXPANSION_THRESHOLD_M70DB;
	AGC_param->agc_expSlope = TX_AGC_EXPANSION_SLOPE_1_1P0;
	
	return;
}

void Setting_Params_AGC_NSOUT_param(SamsungSolomonVoiceWTxAGCParam* AGC_param)
{
	AGC_param->denom = 102;
	AGC_param->size = DVTX_FRAME_LENGTH_WB;

	AGC_param->agc_comThd = TX_AGC_COMPRESSOR_THRESHOLD_M26DB;
	AGC_param->agc_comSlope = TX_AGC_COMPRESSOR_SLOPE_8P5;
	AGC_param->agc_expThd = TX_AGC_EXPANSION_THRESHOLD_M70DB;
	AGC_param->agc_expSlope = TX_AGC_EXPANSION_SLOPE_1_1P0;

	return;
}

//SamsungSolomonVoiceWTxMBDRCParam	mbdrc_Param_m = { 5, { 1000, 1500, 2200, 2700, 8000 }, { 0, 0, 0, 0, 0 }, { 0, 35, 40, 45, 60 },  };
SamsungSolomonVoiceWTxMBDRCParam	mbdrc_Param_m = { 5, { 2000, 3000, 4000, 6000, 8000 }, { 0, 0, 0, 0, 0 }, { 10, 25, 35, 45, 52 }, };
void Setting_Params_MBDRC_param(SamsungSolomonVoiceWTxMBDRCParam* MBDRC_param)
{
	short i;

	MBDRC_param->mbdrcBandNum = mbdrc_Param_m.mbdrcBandNum;

	for (i = 0; i < MBDRC_NUM; i++)
	{
		MBDRC_param->mbdrcCrossFreq[i] = mbdrc_Param_m.mbdrcCrossFreq[i];
		MBDRC_param->mbdrcBandsGain[i] = mbdrc_Param_m.mbdrcBandsGain[i];
		MBDRC_param->mbdrcBandLimit[i] = mbdrc_Param_m.mbdrcBandLimit[i];
	}

	return;
}

void Setting_Params_FIR_param(SamsungSolomonVoiceWTxFIRParam* FIR_param)
{
	int i;

	i = 325;
	
	return;
}

int FN_NBcall_ParaConfig(SamsungSolomonVoiceWTxNSParam* NS_Outer_param, SamsungSolomonVoiceWTxAECParam* AEC_Outer_param)
{

	NS_Outer_param->PARA_HangOver_Cnt_NoiseFree = 300;// 0 to 15 [dB] scale

	NS_Outer_param->PARA_xi_for_SPP_Table = 0;// 0 to 15 [dB] scale
	NS_Outer_param->PARA_Npsd_Gain_MIN = 22000;//DVTX_FLOAT2FIXED(0.67f, 15);//	Npsd	gain	in	silence	interval
	NS_Outer_param->PARA_NoiseFloor_Offset_MAX = 5500;// DVTX_FLOAT2FIXED(0.18f, 15);//	Gain	floor	offset	in	silence	interval
	NS_Outer_param->PARA_THD_Pwr_Lo_1k_4k = 8000;

	NS_Outer_param->PARA_reserved_61 = 0;

	AEC_Outer_param->PARA_Nadfdelay = 185;// 0 to 15 [dB] scale

	return 0;
}
void SamsungSolomonVoiceWEngineInit(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx)
{

	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Inner = NULL;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Outer_1 = NULL;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Inner = NULL;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Outer = NULL;

	SamsungDiamondVoiceEngine_vars_Tx->OutSignal = NULL;

	SamsungDiamondVoiceEngine_vars_Tx->Mode = 0;
	SamsungDiamondVoiceEngine_vars_Tx->BandWidth_Inner = DVTX_FRAME_LENGTH_NB;
	SamsungDiamondVoiceEngine_vars_Tx->BandWidth_Outer = DVTX_FRAME_LENGTH_WB;

	SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars = &SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars_STRUCT;

	SolomonVoiceECNSINIT(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars);

	return;
}

void SamsungSolomonVoiceWParamSetting(SamsungSolomonVoiceParam* DiamondVoice_DV_TX_Config, short bandwidth)
{

	Setting_Params_FRAME_param(&DiamondVoice_DV_TX_Config->FRAME_param, bandwidth);
	Setting_Params_AEC_Inner_param(&DiamondVoice_DV_TX_Config->AEC_Inner_param);
	Setting_Params_AEC_Outer_1_param(&DiamondVoice_DV_TX_Config->AEC_Outer_param_1);
	Setting_Params_AEC_Outer_2_param(&DiamondVoice_DV_TX_Config->AEC_Outer_param_2);
	Setting_Params_BF_param(&DiamondVoice_DV_TX_Config->BF_param);
	Setting_Params_RES_Inner_param(&DiamondVoice_DV_TX_Config->RES_Inner_param);
	Setting_Params_RES_Outer_param(&DiamondVoice_DV_TX_Config->RES_Outer_param);
	Setting_Params_NS_Inner_param(&DiamondVoice_DV_TX_Config->NS_Inner_param);
	Setting_Params_NS_Outer_param(&DiamondVoice_DV_TX_Config->NS_Outer_param);
	Setting_Params_PreNS_Inner_param(&DiamondVoice_DV_TX_Config->PreNS_Inner_param);
	Setting_Params_PreNS_Outer_param(&DiamondVoice_DV_TX_Config->PreNS_Outer_param);
	Setting_Params_ANC_Inner_param(&DiamondVoice_DV_TX_Config->ANC_Inner_param);
	Setting_Params_ANC_Outer_param(&DiamondVoice_DV_TX_Config->ANC_Outer_param);
	Setting_Params_Mix_param(&DiamondVoice_DV_TX_Config->Mix_param);
	Setting_Params_ANC_Outer_param(&DiamondVoice_DV_TX_Config->ANC_Outer_param);
	Setting_Params_AGC_NSIN_param(&DiamondVoice_DV_TX_Config->AGC_param_2input);
	Setting_Params_AGC_NSOUT_param(&DiamondVoice_DV_TX_Config->AGC_param_output);
	Setting_Params_MBDRC_param(&DiamondVoice_DV_TX_Config->MBDRC_param);
	Setting_Params_FIR_param(&DiamondVoice_DV_TX_Config->FIR_param);

	return;
}

void SamsungSolomonVoiceWEngineConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam* SamsungDiamondParam_varsTx)
{
	// Set on/off 

	// Set tunning parameter for ECNS
	SolomonVoiceWParamConfig(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars, SamsungDiamondParam_varsTx);

	//Add config for other modules (Tx filter and so on) here

	return;
}

#if(FLAG_SELECT_C_DSP == 1)
int SamsungSolomonVoiceEngineInOutConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_Rx_Inner, short *Speech_Rx_Outer, short *OutSignal,
	short *Output_buf_Inner_NB, short *Output_buf_Inner_WB, short *Output_buf_Outer)
{
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Inner = Speech_Tx_Inner;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Outer_1 = Speech_Tx_Outer_1;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Outer_2 = Speech_Tx_Outer_2;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Inner = Speech_Rx_Inner;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Outer = Speech_Rx_Outer;
	SamsungDiamondVoiceEngine_vars_Tx->OutSignal = OutSignal;

	SamsungTxECNSInOutConfig(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars, 
		Speech_Tx_Inner, Speech_Tx_Outer_1, Speech_Tx_Outer_2, Speech_Rx_Inner, Speech_Rx_Outer, OutSignal,
		Output_buf_Inner_NB, Output_buf_Inner_WB, Output_buf_Outer);

	return 0;
}
#else
int SamsungSolomonVoiceEngineInOutConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_Rx_Inner, short *Speech_Rx_Outer, short *OutSignal)
{
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Inner = Speech_Tx_Inner;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Outer_1 = Speech_Tx_Outer_1;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Tx_Outer_2 = Speech_Tx_Outer_2;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Inner = Speech_Rx_Inner;
	SamsungDiamondVoiceEngine_vars_Tx->Speech_Rx_Outer = Speech_Rx_Outer;
	SamsungDiamondVoiceEngine_vars_Tx->OutSignal = OutSignal;

	SamsungTxECNSInOutConfig(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars,
		Speech_Tx_Inner, Speech_Tx_Outer_1,Speech_Tx_Outer_2, Speech_Rx_Inner, Speech_Rx_Outer, OutSignal);

	return 0;
}
#endif

#if(FLAG_SELECT_C_DSP == 1)
void SamsungSolomonVoiceWEngineExe(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam *SamsungDiamondParam_varsTx, 
								short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_rx_Inner, short *Speech_rx_Outer, short *OutSignal,
								short *Output_buf_Inner_NB, short *Output_buf_Inner_WB, short *Output_buf_Outer)
{
	// Copy Input data into output data buffer
	SamsungSolomonVoiceEngineInOutConfig(SamsungDiamondVoiceEngine_vars_Tx, 
								Speech_Tx_Inner, Speech_Tx_Outer_1, Speech_Tx_Outer_2, Speech_rx_Inner, Speech_rx_Outer, OutSignal,
								Output_buf_Inner_NB, Output_buf_Inner_WB, Output_buf_Outer);
	
	SolomonVoiceWECNSExe(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars);

	return;
}
#else
void SamsungSolomonVoiceWEngineExe(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx, SamsungSolomonVoiceParam *SamsungDiamondParam_varsTx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_rx_Inner, short *Speech_rx_Outer, short *OutSignal)
{
	// Copy Input data into output data buffer
	SamsungSolomonVoiceEngineInOutConfig(SamsungDiamondVoiceEngine_vars_Tx,
		Speech_Tx_Inner, Speech_Tx_Outer_1, Speech_Tx_Outer_2, Speech_rx_Inner, Speech_rx_Outer, OutSignal);
	SolomonVoiceWECNSExe(SamsungDiamondVoiceEngine_vars_Tx->DVTX_ECNS_vars);

	return;
}
#endif
