#define _CRT_SECURE_NO_WARNINGS

#define DNN_PARAM_TUNNING_ENABLE 0

#include "platform.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "SamsungSolomonVoiceECNSTx.h"

//static short solomon_WB_HS_Parms[] = { 1,63,0,1,25,25,3,1,0,0,0,0,0,0,0,0,70,70,70,70,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,10,0,1,-30,-25,3277,3277,3277,3277,3277,3277,13763,13763,25000,30000,13763,13763,13763,13763,2,2,1000,10,31785,0,58,58,368,368,48,100,100,32,32,32,32,32000,32000,6,8,29491,29491,16384,16384,26214,26214,5120,5120,32,32,4915,4915,5,5,-15,0,0,0,0,0,1,1,1,0,0,5120,3072,5120,5120,1024,1024,1024,5120,10240,3584,1792,3,20,32,65,65,65,65,1536,1024,2560,1024,1024,1024,0,327,32604,32735,29491,32735,38,300,500,4,4,4,0,15892,0,0,10240,3072,5120,10240,1024,1024,1024,5120,10240,3584,1024,3,32,44,65,65,65,65,1024,1536,3584,1024,1024,1024,0,0,32604,32735,29491,32735,38,147,6554,4,4,4,0,16350,0,0,10240,3072,5120,10240,1024,1024,1024,5120,10240,3584,1024,3,32,44,65,65,65,65,1024,1536,3584,1024,1024,1024,0,0,32604,32735,29491,32735,38,147,6554,4,4,4,0,16350,0,0,0,0,0,0,0,1024,256,64,0,0,512,512,1024,1024,256,3840,3840,3840,3840,3840,1,16384,6553,0,0,0,0,-10240,-10240,-10240,-10240,-10240,-10240,-5000,-10240,-10240,-10240,-10240,-10240,1,48,10,2048,1024,1024,1024,960,960,960,960,2048,2048,1024,1024,101,101,101,101,160,0,160,0,160,0,160,0,160,0,160,0,160,0,160,0,1024,819,819,819,204,204,409,409,512,512,256,256,2048,819,819,819,204,409,409,0,1024,512,256,256,0,0,0,0,0,0,980,26214,10,512,655,655,327,327,327,327,32,26,3,3,3,3,0,0,0,0,10,1,5,25,3162,3162,0,0,0,0,0,0,0,0,10,40,33,2,20,1536,5120,1,1,19661,6554,-2,10,1,1311,2622,1311,2622,1311,2622,1311,2622,0,0,10000,5000,10,1282,1282,1282,1282,1282,0,0,0,0,0,1,1,5,63,63,63,63,0,0,0,0,0,0,-2,0,-2,-1,-2,325,325,325,325,325,325,325,325,0,0,21,0,0,0,0,0,16384,325,325,325,325,6554,9830,325,325,325,325,325,325,325,325,325,325,325, };
//static short solomon_WB_HF_Parms[] = { 1,159,1,1,25,25,3,2,0,0,0,0,0,0,0,0,200,200,200,200,-35,36,0,0,-457,642,-696,816,-815,994,-1077,1297,-1082,879,-1056,1156,-732,1143,-53,12246,-430,186,-551,315,-454,543,-349,737,-501,838,-623,517,-357,587,696,10408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,1,-30,-25,3277,3277,3277,3277,3277,3277,13763,13763,27500,30000,30000,30000,25000,25000,2,2,1000,1000,31785,0,58,58,368,368,48,100,100,32,32,32,32,10000,10000,6,8,16384,16384,4096,8192,26214,26214,3277,3277,32,32,8192,8192,5,5,-15,0,0,0,0,0,0,0,0,16,0,5120,1025,3072,5120,1025,1025,1025,5120,5120,1024,1280,6,10,22,35,48,52,65,1792,2048,1536,1792,1280,3072,0,0,32440,32700,32440,32604,22,2073,23253,4,3,3,0,16384,15,12,5120,2048,3072,5120,1280,1280,1280,5120,5120,1024,1024,2,34,65,65,65,65,65,3072,3072,1024,1024,1024,1024,0,0,32440,32735,32440,32604,22,23253,23253,4,3,3,0,16384,10000,0,10240,2048,3072,10240,1280,1280,1280,5120,10240,1024,1024,2,34,65,65,65,65,65,3072,3072,1024,1024,1024,1024,0,0,32440,32735,32440,32604,22,23253,23253,4,3,3,0,16384,10000,0,0,0,0,0,0,512,64,0,0,0,700,1024,1024,1600,512,7680,7680,7680,7680,7680,0,26213,26213,0,0,0,0,-7000,-7000,-7000,-7000,-7000,-7000,0,-3048,-3048,-7680,-7680,-7680,1,0,10,2547,1607,4038,4038,508,805,160,960,2348,1024,1024,1024,64,64,64,960,636,-1870,1270,-4904,801,-6582,160,0,160,0,1009,-30688,1009,0,1009,0,512,122,245,204,512,204,409,409,1500,1024,1024,1024,0,122,245,204,204,409,409,0,0,1024,307,102,1600,512,512,512,512,1,600,26214,10,912,655,655,655,655,655,655,1000,1400,1400,600,600,600,100,100,100,100,519,1,0,0,2100,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, };
//static short solomon_WB_EAR_Parms[] = { 1,31,2,1,25,25,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16384,0,0,1,-20,-20,400,3277,800,3277,3277,3277,13763,13763,25000,32000,13763,13763,13763,13763,2,2,1000,10,32767,0,550,550,3500,3500,32767,100,100,32,32,32,32,32000,32000,6,8,29491,29491,16384,16384,26214,26214,8192,8192,32,32,4915,4915,5,5,-15,0,0,0,0,0,1,0,0,0,0,5120,3072,5120,3072,1024,1024,1024,5120,5120,1024,1024,3,32,47,65,65,65,65,1024,1536,2560,1024,1024,1024,0,0,32604,32735,29491,32735,38,30,1000,4,4,4,0,15892,0,0,10240,3072,5120,10240,1024,1024,1024,5120,10240,1024,1024,1,65,65,65,65,65,65,1024,1024,1024,1024,1024,1024,0,0,32604,32735,29491,32735,38,5,5,4,4,4,0,16350,0,0,10240,3072,5120,10240,1024,1024,1024,5120,10240,1024,1024,1,65,65,65,65,65,65,1024,1024,1024,1024,1024,1024,0,0,32604,32735,29491,32735,38,5,5,4,4,4,0,16350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,10,40,33,2,20,1536,5120,1,1,19661,6554,-2,10,1,1311,2622,1311,2622,1311,2622,1311,2622,1,200,10000,5000,10,1282,1282,1282,1282,1282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, };

short LoadParm[500] = { 0,0,0, };

SamsungSolomonVoiceTxParam DVTX_Config = { 0, };
SamsungSolomonVoiceTxEngine_Handle_t DVTX_vars;


/*
typedef enum CALL_MODE_ { HS, HF, EAR, BT, DEX_1MIC } CALL_MODE;
typedef enum BAND_TYPE_ { NB, WB, SWB } BAND_TYPE;
*/
void usage(void) {
	printf("===========================================================================================\n");
	printf(" SolomonVoice Engine HELP               Displays this text\n");
	printf("===========================================================================================\n");
	printf("\n");
	printf("Arguments : tx1.pcm tx2.pcm tx3.pcm tx4.pcm rx1.pcm rx2.pcm out_ns.pcm 1 0 param.txt\n");
	printf(" Arg 1st  : tx1.pcm : mic1 input file \n");
	printf(" Arg 2nd  : tx2.pcm : mic2 input file \n");
	printf(" Arg 3rd  : tx3.pcm : mic3 input file \n");
	printf(" Arg 4th  : tx4.pcm : mic4 input file (actually this is dummy file) \n");
	printf(" Arg 5th  : rx1.pcm : rx reference 1 input file \n");
	printf(" Arg 6th  : rx2.pcm : rx reference 2 input file \n");
	printf(" Arg 7th  : solomon_out.pcm : SolomonVoice output file \n");
	printf(" Arg 8th  : 1 : Band Type { NB, WB, SWB } \n"); 
	printf(" Arg 9th  : 1 : Call Mode { HS, HF, EAR, BT, DEX_1MIC }\n");
	printf(" Arg 10th : solomon_param.txt : Tuning Parameter file \n");
	printf("===========================================================================================\n");
}


void read_tunning_param_config(char *fn_in, int config_param[]) {
	FILE* pFile;
	char strTemp[1024];
	char *pStr;
	char *p;
	int i;
	int paraCnt = 0;

	if ((pFile = fopen(fn_in, "r")) == NULL)
	{
		/* Open source file. */
		perror("fopen source-file");
	}

	while (!feof(pFile))
	{
		pStr = fgets(strTemp, sizeof(strTemp), pFile);
		p = strtok(pStr, "\t");
		i = 0;
		while (p != NULL) {
			short value;
			if (i % 2 == 1) {
				if (strstr(p, "0x") != NULL) {
					//if there is 0x : read as hex
					value = (short)strtol(p, NULL, 16);
				}
				else {
					//or read as dec 
					value = atoi(p);
				}
				config_param[paraCnt++] = value;
			}
			i++;
			p = strtok(NULL, "\t");
		}
	}
	printf("# of parameters : %d \n", paraCnt);
	fclose(pFile);
}

void ParseTuningFile(char *TuningFilePath)
{
	
	FILE *Tf;
	if( (Tf = fopen(TuningFilePath, "rb")) == NULL ) {
		fprintf(stderr, "input Tuning file error..\n");
		exit(0);
	}

	int i;
	char dummy[255];
	for (i = 0; i < 500; i++)
	{
		fscanf(Tf, "%s %d", &dummy, &LoadParm[i]);
	}
	

	//read_tunning_param_config(TuningFilePath, LoadParm);

	int tmp_ind = 0;
	

	DVTX_Config.MODE_param.txMode = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.ECNS_Mode = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Call_Mode = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Band_Mode = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Len_Frm_Mute_Init_In = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Len_Frm_Mute_Init_Out = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Num_Tx_Channel = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Num_Rx_Channel = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.HPF_cutoff_0 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.HPF_cutoff_1 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.HPF_cutoff_2 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.HPF_cutoff_3 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_Tx_In_0 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_Tx_In_1 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_Tx_In_2 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_Tx_In_3 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_NS_In_0 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_NS_In_1 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_NS_In_2 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_NS_In_3 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.Gain_Out = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.MODE_param.RSV_2 = LoadParm[tmp_ind++];

	DVTX_Config.EQ_param.FIR_EQ_0_Coef[0] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[1] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[2] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[3] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[4] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[5] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[6] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[7] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[8] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[9] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[10] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[11] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[12] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[13] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[14] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_0_Coef[15] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[0] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[1] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[2] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[3] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[4] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[5] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[6] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[7] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[8] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[9] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[10] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[11] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[12] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[13] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[14] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_1_Coef[15] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[0] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[1] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[2] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[3] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[4] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[5] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[6] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[7] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[8] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[9] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[10] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[11] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[12] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[13] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[14] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_2_Coef[15] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[0] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[1] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[2] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[3] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[4] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[5] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[6] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[7] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[8] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[9] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[10] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[11] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[12] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[13] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[14] = LoadParm[tmp_ind++];
	DVTX_Config.EQ_param.FIR_EQ_3_Coef[15] = LoadParm[tmp_ind++];

	DVTX_Config.AEC_param.LEN_RX_DELAY = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.LEN_RX_DELAY_SEARCH = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.N_MDF = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_NLMS_FILTER_MISMATCH_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_NLMS_FILTER_MISMATCH_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_INIT_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_INIT_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_EPC_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_NLMS_STEPSIZE_EPC_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_RES_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_RES_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_LF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_LF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_HF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_DTD_AEC_HF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.LEN_FRM_NLMS_AUX_FILTER_UPDATE_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.LEN_FRM_NLMS_AUX_FILTER_UPDATE_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_REGUL_MAX_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_REGUL_MAX_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_REGUL_OUT_PWR = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_TX_PWR_DIFF = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_TX_PWR_RATIO_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_TX_PWR_RATIO_LF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_TX_PWR_RATIO_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_TX_PWR_RATIO_LF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_TX_PWR_RATIO = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_PWR_RX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_PWR_RX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_FRICATIVE_RATIO_RX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_FRICATIVE_RATIO_RX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_ONSET_RX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_RX_ONSET_RX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_TX_CLIPPING_DETECTION_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_TX_CLIPPING_DETECTION_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_Q_FMT_ADF_COEFF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_Q_FMT_ADF_COEFF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_PSD_BETA_RELEASE = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_RX_PSD_BETA_ATTACK = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_1_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_1_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_2_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_2_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_3_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_3_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_4_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_EPC_4_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_BETA_EPC_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_BETA_EPC_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_HG_EPCDT_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.PARAM_HG_EPCDT_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.THD_PWR_NOISE_FREE_AEC = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.RSV_2 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.RSV_3 = LoadParm[tmp_ind++];
	DVTX_Config.AEC_param.RSV_4 = LoadParm[tmp_ind++];

	DVTX_Config.RES_param.RES_MODE_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RES_MODE_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RES_MODE_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.ERL_ECHO_REF_3RD = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RX2_PROX = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_0N6_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_1_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_2_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_3_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_4_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_5_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_7N8_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_9_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_10_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_13_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_MIN_TOTAL_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_NUM_OVER_BANDS_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_0_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_1_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_2_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_3_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_4_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_5_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_0_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_1_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_2_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_3_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_4_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_5_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_1ST_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_TOTAL_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_LIN_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_LIN_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_NL_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_NL_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_LF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_LF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_HF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.LEN_FRM_RES_AUX_FILTER_UPDATE_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_LF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_HF_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_HG_RX_VAD_ONSET_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MAX_SPP_NPSD_ECHO_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_PWR_NOISE_FREE_RES_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MIN_BAND_ECHO_TX0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_0N6_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_1_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_2_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_3_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_4_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_5_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_7N8_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_9_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_10_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_13_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_MIN_TOTAL_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_NUM_OVER_BANDS_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_0_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_1_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_2_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_3_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_4_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_5_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_0_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_1_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_2_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_3_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_4_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_5_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_1ST_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_TOTAL_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_LIN_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_LIN_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_NL_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_NL_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_LF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_LF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_HF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.LEN_FRM_RES_AUX_FILTER_UPDATE_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_LF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_HF_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_HG_RX_VAD_ONSET_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MAX_SPP_NPSD_ECHO_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_PWR_NOISE_FREE_RES_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MIN_BAND_ECHO_TX1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_0N6_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_1_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_2_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_3_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_4_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_5_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_7N8_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_9_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_10_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_STATUS_13_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_MIN_TOTAL_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_NUM_OVER_BANDS_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_0_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_1_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_2_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_3_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_4_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_5_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_0_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_1_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_2_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_3_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_4_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_OVER_BAND_5_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_1ST_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.GAIN_RES_MIN_TOTAL_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_LIN_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_LIN_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_RELEASE_NL_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BETA_ATTACK_NL_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_BAND_LF_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_LF_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_REGRESSION_INIT_HF_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.LEN_FRM_RES_AUX_FILTER_UPDATE_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_LF_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.PARAM_LATE_ECHO_DECAY_HF_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_HG_RX_VAD_ONSET_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MAX_SPP_NPSD_ECHO_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_PWR_NOISE_FREE_RES_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.THD_MIN_BAND_ECHO_TX2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RSV_2 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RSV_3 = LoadParm[tmp_ind++];
	DVTX_Config.RES_param.RSV_4 = LoadParm[tmp_ind++];

	DVTX_Config.NS_param.DNN__noise_mismatch_bias1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_bias2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_bias3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_bias4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_bias5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__dnn_out_boosting_bias1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__dnn_out_boosting_bias2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__dnn_out_boosting_bias3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__dnn_out_boosting_bias4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__dnn_out_boosting_bias5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_for_noise_free1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_for_noise_free2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_for_noise_free3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_for_noise_free4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__noise_mismatch_for_noise_free5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__gain_control_enable = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__minG_mask_for_resi_Npsd_freq6 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_freq6 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.DNN__out_bgn_log_gain_low_snr_freq6 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap_mode = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__output_mode = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__DC_remove = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_2nd_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_2nd_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_2nd_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch1_2nd_4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_2nd_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_2nd_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_2nd_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_bound_ch2_2nd_4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_1_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_1_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_3_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_3_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_4_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_4_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_1_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_1_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_2_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_2_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_3_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_3_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_4_MSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gamma_0_2_4_LSB = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef_abnormal_pos_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef_abnormal_pos_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef_abnormal_pos_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap1_oef_abnormal_pos_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef_abnormal_pos_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef_abnormal_pos_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef_abnormal_pos_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__sap2_oef_abnormal_pos_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_abnormal_pos_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_abnormal_pos_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_abnormal_pos_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_abnormal_pos_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_high_snr_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_high_snr_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_high_snr_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_high_snr_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Npsd_oef_high_snr_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__gain_compensation_disable = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Gmin_gain = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__final_gain_forgetting_factor_alpha = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Gmin_non_speech = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__Gmin_lowbounder = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_mag_gain_freq6 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq5 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__bgn_pow_gain_freq6 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__thd_NS_freq1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__thd_NS_freq2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__thd_NS_freq3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__thd_NS_freq4 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.PF__thd_NG_time = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.VAD__use_frm_VAD2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__noise_onset_thd = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__HS_abnormal_pos_max_cnt = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__thd_noise_free = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__thd_noise_free_Rx = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__thd_noise_free_ultra = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.STATE__noise_free_flag_hg_max_ultra = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.RSV_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.RSV_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_param.RSV_4 = LoadParm[tmp_ind++];

	DVTX_Config.NS_1mic_param.PARA_ns_level = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Pwr_Tx_dB = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Pwr_Tx_Loud_dB = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Pwr_Lo_1k_4k_dB = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_xi_for_SPP_Table = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_HangOver_Cnt_NoiseFree = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Lo_SNRiniAvg_for_beta = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Hi_SNRiniAvg_for_beta = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_Slop_SNRiniAvg_for_beta = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_MIN_NOISE_PWR = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_Npsd_Gain_MIN = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloor_Offset_MAX = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Lo_prioriSNR_for_NoiseFloor_dB = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_THD_Hi_prioriSNR_for_NoiseFloor_dB = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_slope_prioriSNR_for_NoiseFloor = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_0_250Hz_low = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_0_250Hz_high = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_250_4000Hz_low = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_250_4000Hz_high = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_4000_8000Hz_low = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_4000_8000Hz_high = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_8000_NyquistHz_low = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_NoiseFloorOffset_8000_NyquistHz_high = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_fDRC_on = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_fDRC_THD_Lo_EEBin = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_fDRC_THD_Hi_EEBin = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_fDRC_gain = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_fDRC_Q_format = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_FixedXi_0k_1k = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_FixedXi_1k_2k = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_FixedXi_2k_4k = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_FixedXi_4k_8k = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.PARA_FixedXi_8k_Nyquistk = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.RSV_2 = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.RSV_3 = LoadParm[tmp_ind++];
	DVTX_Config.NS_1mic_param.RSV_4 = LoadParm[tmp_ind++];

	DVTX_Config.WNR_param.ONOFF = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.WNR_MODE = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.LOWCUTFREQ = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.HANGOVER_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.HANGOVER_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.HANGOVER_2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.HANGOVER_3 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_WND_E_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_WND_E_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_WND_ZCR = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_WND_NSTM = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_WND_IMSC = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MIC0_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MIC0_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MIC1_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MIC1_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MICSWITCHING_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MICSWITCHING_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_MICSWITCHING_2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_FREQ = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_GAIN = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_MU = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_DELTA = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_SM0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_SM1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.MAINSPEECH_SM2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.PARAM_POSTSNR = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.PARAM_GMIN = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.PARAM_A = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.PARAM_C = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.WIND_PSD_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.THR_RF = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.WIND_PSD_LIMIT_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.WIND_PSD_LIMIT_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.F0_ALPHA = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.POSTNS_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.POSTNS_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.POSTNS_2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.POSTNS_3 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_3 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_4 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_5 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_6 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.NOISEFLOOR_7 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.RSV_0 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.RSV_1 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.RSV_2 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.RSV_3 = LoadParm[tmp_ind++];
	DVTX_Config.WNR_param.RSV_4 = LoadParm[tmp_ind++];
// end of set param

}


int main(int argc, char *argv[])
{
	printf("===========================================================================================\n");
	printf(" SolomonVoice Engine Simulation	\n");
	printf("===========================================================================================\n");
	if (argc != 11) { //Normal case argc is 11

		printf("argc: %d\n\n\n", argc);
		usage();

		return 0;
	}

	//argv[0]  : "D:\\VisualstudioWorkspace\\Predict_3QUEST\\SolomonVoice_Ref\\Debug\\SolomonVoice_Ref.exe"
	//argv[1]  : "tx1.pcm"
	//argv[2]  : "tx2.pcm"
	//argv[3]  : "tx3.pcm"
	//argv[4]  : "tx4.pcm"
	//argv[5]  : "rx1.pcm"
	//argv[6]  : "rx2.pcm"
	//argv[7]  : "solomon_out.pcm"
	//argv[8]  : "1"
	//argv[9]  : "0"
	//argv[10] : "solomon_param.txt"

	printf(" [1] Input Tx[#1] pcm path : %s \n", argv[1]);
	printf(" [2] Input Tx[#2] pcm path : %s \n", argv[2]);
	printf(" [3] Input Tx[#3] pcm path : %s \n", argv[3]);
	printf(" [4] Input Tx[#4] pcm path : %s \n", argv[4]);
	printf(" [5] Input Rx[#1] pcm path : %s \n", argv[5]);
	printf(" [6] Input Rx[#2] pcm path : %s \n", argv[6]);
	printf(" [7] Output pcm path : %s \n", argv[7]);
	printf(" [8] Band Type { NB(0), WB(1), SWB(2) } : %s \n", argv[8]);
	printf(" [9] Call Mode { HS(0), HF(1), EAR(2), BT(3), DEX_1MIC(4) } : %s \n", argv[9]);
	printf(" [10] Tuning file path : %s \n", argv[10]);
	

	BAND_TYPE band_type;
	CALL_MODE call_mode;

	
	band_type = atoi(argv[8]);
	call_mode = atoi(argv[9]);
	
	

	FILE *ifptx[NUM_MIC_TX_MAX], *ifprx[NUM_MIC_RX_MAX], *ofp;
	//FILE *ifp_DNN_network_coef;
	Word16 i;
	Word16 **Speech_buf_TX, **Speech_buf_RX, *Output_buf_TX;
	Word16 num_mic = 2;
	Word16 num_spk;
	
	Word16 SOLOMONVOICE_FRAME_TX;
	Word32 FrmCnt = 0;
	static Word32 chnFlag = 0;
	Word16 isEnd = 0;
	Word16 arg_out_file;

	Word64 start_time, end_time, total_cycles, current_cycles, max_cycles;
	int tunning_param[500], read_config = 0;
	int mymode = 0;

	chnFlag = 0;
	FrmCnt = 0;
	isEnd = 0;


	//printf("call mode: %d\n\n\n", call_mode);

	if (band_type == NB)
		SOLOMONVOICE_FRAME_TX = SAMSUNGSOLOMONVOICENARROWBAND_TX;
	else if (band_type == WB)
		SOLOMONVOICE_FRAME_TX = SAMSUNGSOLOMONVOICEWIDEBAND_TX;
	else if (band_type == SWB)
		SOLOMONVOICE_FRAME_TX = SAMSUNGSOLOMONVOICESUPERWIDEBAND_TX;

	SamsungSolomonVoiceTxEngineInit(&DVTX_vars, NUM_MIC_TX_MAX, NUM_MIC_RX_MAX, SOLOMONVOICE_FRAME_TX);

	//printf("SamsungSolomonVoiceTxEngineInit() \n");

	ParseTuningFile(argv[10]);

	SamsungSolomonVoiceTxEngineConfig(&DVTX_vars, &DVTX_Config);

	//printf("SamsungSolomonVoiceTxEngineConfig() \n");

	num_mic = DVTX_vars.DVTX_ECNS_vars->NumMics;
	num_spk = DVTX_vars.DVTX_ECNS_vars->NumSPKs;


	if ((ifptx[0] = fopen(argv[1], "rb")) == NULL) {
		fprintf(stderr, "TX (main mic) input file error..\n");
		exit(1);
	}

	if (num_mic > 1) {
		if ((ifptx[1] = fopen(argv[2], "rb")) == NULL) {
			fprintf(stderr, "TX (2nd mic) input file error..\n");
			exit(2);
		}
	}

	if (num_mic > 2) {
		if ((ifptx[2] = fopen(argv[3], "rb")) == NULL) {
			fprintf(stderr, "TX (3rd mic) input file error..\n");
			exit(3);
		}
	}

	if (num_mic > 3) {
		if ((ifptx[3] = fopen(argv[4], "rb")) == NULL) {
			fprintf(stderr, "TX (4th mic) input file error..\n");
			exit(4);
		}
	}

	if ((ifprx[0] = fopen(argv[5], "rb")) == NULL) {
		fprintf(stderr, "RX (1st) input file error..\n");
		exit(5);
	}

	if (num_spk == 2)
	{
		if ((ifprx[1] = fopen(argv[6], "rb")) == NULL) {
			fprintf(stderr, "RX (2nd) input file error..\n");
			exit(6);
		}
	}

	if ((ofp = fopen(argv[7], "wb")) == NULL) {
		fprintf(stderr, "output file error..\n");
		exit(7);
	}

	if (num_mic > NUM_MIC_TX_MAX) num_mic = NUM_MIC_TX_MAX;
	if (num_mic < NUM_MIC_TX_MIN) num_mic = NUM_MIC_TX_MIN;

	if (num_spk > NUM_MIC_RX_MAX) num_spk = NUM_MIC_RX_MAX;
	if (num_spk < NUM_MIC_RX_MIN) num_spk = NUM_MIC_RX_MIN;

	Speech_buf_TX = (Word16 **)malloc(sizeof(Word16 *) * num_mic);
	for (i = 0; i < num_mic; i++) {
		Speech_buf_TX[i] = (Word16 *)malloc(sizeof(Word16) * SOLOMONVOICE_FRAME_TX);
	}
	Speech_buf_RX = (Word16 **)malloc(sizeof(Word16 *) * num_spk);
	for (i = 0; i < num_spk; i++) {
		Speech_buf_RX[i] = (Word16 *)malloc(sizeof(Word16) * SOLOMONVOICE_FRAME_TX);
	}
	Output_buf_TX = (Word16 *)malloc(sizeof(Word16) * SOLOMONVOICE_FRAME_TX);

	//get total frame size
	FILE *fp = fopen(argv[1], "rb");
	fseek(fp, 0, SEEK_END);			
	int TotalFrameSize = ftell(fp);	
	TotalFrameSize = (TotalFrameSize / SOLOMONVOICE_FRAME_TX)>>1;
	fclose(fp);

	printf("\n == Start Simulation ==\n\n");

	while (isEnd == 0)
	{

		for (i = 0; i < num_mic; i++)
		{
			if (fread(Speech_buf_TX[i], sizeof(Word16), SOLOMONVOICE_FRAME_TX, ifptx[i]) != (unsigned)SOLOMONVOICE_FRAME_TX) {
				isEnd = 1;
				break;
			}
				
		}

		for (i = 0; i < num_spk; i++)
		{
			if (fread(Speech_buf_RX[i], sizeof(Word16), SOLOMONVOICE_FRAME_TX, ifprx[i]) != (unsigned)SOLOMONVOICE_FRAME_TX) {
				isEnd = 1;
				break;
			}
				
		}

		SamsungSolomonVoiceTxEngineExe(&DVTX_vars, &DVTX_Config, Speech_buf_TX, Speech_buf_RX, Output_buf_TX);

		fwrite(Output_buf_TX, sizeof(Word16), SOLOMONVOICE_FRAME_TX, ofp);

		fflush(stdout);

		printf("\rFrmCnt: %d / %d", FrmCnt, TotalFrameSize);

		FrmCnt++;
	}
	printf("\n\n == Finished Simulation == \n\n");

	for (i = 0; i < num_mic; i++) {
		free(Speech_buf_TX[i]);
		fclose(ifptx[i]);
	}
	free(Speech_buf_TX);
	for (i = 0; i < num_spk; i++) {
		free(Speech_buf_RX[i]);
		fclose(ifprx[i]);
	}
	free(Speech_buf_RX);
	free(Output_buf_TX);

	fclose(ofp);
	

	return 0;
}





