polartest.c 14.5 KB
Newer Older
Guy De Souza's avatar
Guy De Souza committed
1 2 3 4 5 6 7 8 9
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>

#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
yilmazt's avatar
yilmazt committed
10
#include "PHY/CODING/coding_defs.h"
yilmazt's avatar
yilmazt committed
11
#include "SIMULATION/TOOLS/sim.h"
Guy De Souza's avatar
Guy De Souza committed
12

Florian Kaltenberger's avatar
Florian Kaltenberger committed
13
//#define DEBUG_DCI_POLAR_PARAMS
yilmazt's avatar
yilmazt committed
14
//#define DEBUG_POLAR_TIMING
15
//#define DEBUG_CRC
yilmazt's avatar
yilmazt committed
16

Guy De Souza's avatar
Guy De Souza committed
17 18 19 20
int main(int argc, char *argv[]) {

	//Initiate timing. (Results depend on CPU Frequency. Therefore, might change due to performance variances during simulation.)
	time_stats_t timeEncoder,timeDecoder;
21 22
	time_stats_t polar_decoder_init,polar_rate_matching,decoding,bit_extraction,deinterleaving;
	time_stats_t path_metric,sorting,update_LLR;
Guy De Souza's avatar
Guy De Souza committed
23
	opp_enabled=1;
24 25
	int decoder_int16=0;
	int generate_optim_code=0;
Guy De Souza's avatar
Guy De Souza committed
26 27 28 29
	cpu_freq_GHz = get_cpu_freq_GHz();
	reset_meas(&timeEncoder);
	reset_meas(&timeDecoder);
	randominit(0);
yilmazt's avatar
yilmazt committed
30
	crcTableInit();
31

Guy De Souza's avatar
Guy De Souza committed
32
	//Default simulation values (Aim for iterations = 1000000.)
yilmazt's avatar
yilmazt committed
33
	int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
yilmazt's avatar
yilmazt committed
34
	double SNRstart = -20.0, SNRstop = 0.0, SNRinc= 0.5; //dB
Guy De Souza's avatar
Guy De Souza committed
35 36 37 38

	double SNR, SNR_lin;
	int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
	int8_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
yilmazt's avatar
yilmazt committed
39
	uint16_t testLength = 0, coderLength = 0, blockErrorCumulative=0, bitErrorCumulative=0;
Guy De Souza's avatar
Guy De Souza committed
40
	double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
yilmazt's avatar
yilmazt committed
41
	uint8_t aggregation_level = 8, decoderListSize = 8, pathMetricAppr = 0;
Guy De Souza's avatar
Guy De Souza committed
42

43
	while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:h:qg")) != -1)
Guy De Souza's avatar
Guy De Souza committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
	switch (arguments)
	{
		case 's':
			SNRstart = atof(optarg);
			break;

		case 'd':
			SNRinc = atof(optarg);
			break;

		case 'f':
			SNRstop = atof(optarg);
			break;

		case 'm':
			polarMessageType = atoi(optarg);
			break;

		case 'i':
			iterations = atoi(optarg);
			break;

		case 'l':
			decoderListSize = (uint8_t) atoi(optarg);
			break;

		case 'a':
			pathMetricAppr = (uint8_t) atoi(optarg);
			break;

74
  	        case 'q':
75
		        decoder_int16=1;
76 77
		        break;

78 79 80 81 82
    	        case 'g':
		  generate_optim_code=1;
                  iterations=1;
		  SNRstart=-6.0;
		  SNRstop =-6.0;
83
		  decoder_int16=1;
84
                  break;
85
	        case 'h':
Florian Kaltenberger's avatar
Florian Kaltenberger committed
86
		  printf("./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=PBCH|1=DCI|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr\n");
87 88
		  exit(-1);

Guy De Souza's avatar
Guy De Souza committed
89 90
		default:
			perror("[polartest.c] Problem at argument parsing with getopt");
91
			exit(-1);
Guy De Souza's avatar
Guy De Souza committed
92 93
	}

yilmazt's avatar
yilmazt committed
94
	if (polarMessageType == 0) { //PBCH
Guy De Souza's avatar
Guy De Souza committed
95 96
		testLength = NR_POLAR_PBCH_PAYLOAD_BITS;
		coderLength = NR_POLAR_PBCH_E;
97
		aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
yilmazt's avatar
yilmazt committed
98
	} else if (polarMessageType == 1) { //DCI
99 100 101
		//testLength = nr_get_dci_size(params_rel15->dci_format, params_rel15->rnti_type, &fp->initial_bwp_dl, cfg);
		testLength = 20;
		coderLength = 108; //to be changed by aggregate level function.
yilmazt's avatar
yilmazt committed
102
	} else if (polarMessageType == -1) { //UCI
Guy De Souza's avatar
Guy De Souza committed
103 104 105
		//testLength = ;
		//coderLength = ;
	}
Florian Kaltenberger's avatar
WIP  
Florian Kaltenberger committed
106
	
Guy De Souza's avatar
Guy De Souza committed
107 108 109 110

	//Logging
	time_t currentTime;
	time (&currentTime);
yilmazt's avatar
yilmazt committed
111
	char *folderName, fileName[512], currentTimeInfo[25];
Guy De Souza's avatar
Guy De Souza committed
112

yilmazt's avatar
yilmazt committed
113 114
	folderName=getenv("HOME");
	strcat(folderName,"/Desktop/polartestResults");
yilmazt's avatar
yilmazt committed
115 116 117 118

	#ifdef DEBUG_POLAR_TIMING
	sprintf(fileName,"%s/TIMING_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
	#else
yilmazt's avatar
yilmazt committed
119
	sprintf(fileName,"%s/_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
yilmazt's avatar
yilmazt committed
120
	#endif
Guy De Souza's avatar
Guy De Souza committed
121 122 123
	strftime(currentTimeInfo, 25, "_%Y-%m-%d-%H-%M-%S.csv", localtime(&currentTime));
	strcat(fileName,currentTimeInfo);

yilmazt's avatar
yilmazt committed
124
	//Create "~/Desktop/polartestResults" folder if it doesn't already exist.
Guy De Souza's avatar
Guy De Souza committed
125
	struct stat folder = {0};
yilmazt's avatar
yilmazt committed
126
	if (stat(folderName, &folder) == -1) mkdir(folderName, S_IRWXU | S_IRWXG | S_IRWXO);
Guy De Souza's avatar
Guy De Souza committed
127

yilmazt's avatar
yilmazt committed
128
	FILE* logFile;
Guy De Souza's avatar
Guy De Souza committed
129 130 131 132 133
    logFile = fopen(fileName, "w");
    if (logFile==NULL) {
        fprintf(stderr,"[polartest.c] Problem creating file %s with fopen\n",fileName);
        exit(-1);
      }
yilmazt's avatar
yilmazt committed
134 135 136 137

#ifdef DEBUG_POLAR_TIMING
    fprintf(logFile,",timeEncoderCRCByte[us],timeEncoderCRCBit[us],timeEncoderInterleaver[us],timeEncoderBitInsertion[us],timeEncoder1[us],timeEncoder2[us],timeEncoderRateMatching[us],timeEncoderByte2Bit[us]\n");
#else
Guy De Souza's avatar
Guy De Souza committed
138
    fprintf(logFile,",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]\n");
yilmazt's avatar
yilmazt committed
139
#endif
Guy De Souza's avatar
Guy De Souza committed
140

yilmazt's avatar
yilmazt committed
141 142
    uint8_t testArrayLength = ceil(testLength / 32.0);
    uint8_t coderArrayLength = ceil(coderLength / 32.0);
yilmazt's avatar
yilmazt committed
143

yilmazt's avatar
yilmazt committed
144 145 146 147 148 149
	uint32_t *testInput = malloc(sizeof(uint32_t) * testArrayLength); //generate randomly
	uint32_t *encoderOutput = malloc(sizeof(uint32_t) * coderArrayLength);
	uint32_t *estimatedOutput = malloc(sizeof(uint32_t) * testArrayLength); //decoder output
	memset(testInput,0,sizeof(uint32_t) * testArrayLength);
	memset(encoderOutput,0,sizeof(uint32_t) * coderArrayLength);
	memset(estimatedOutput,0,sizeof(uint32_t) * testArrayLength);
Guy De Souza's avatar
Guy De Souza committed
150

yilmazt's avatar
yilmazt committed
151
	uint8_t *encoderOutputByte = malloc(sizeof(uint8_t) * coderLength);
Guy De Souza's avatar
Guy De Souza committed
152 153
	double *modulatedInput = malloc (sizeof(double) * coderLength); //channel input
	double *channelOutput  = malloc (sizeof(double) * coderLength); //add noise
knopp's avatar
knopp committed
154 155 156
	int16_t *channelOutput_int16;
	if (decoder_int16 == 1) channelOutput_int16 = (int16_t*)malloc (sizeof(int16_t) * coderLength);
 
yilmazt's avatar
yilmazt committed
157
	t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL;
yilmazt's avatar
yilmazt committed
158
	nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
yilmazt's avatar
yilmazt committed
159 160
	currentPtr = nr_polar_params(nrPolar_params, polarMessageType, testLength, aggregation_level);

yilmazt's avatar
yilmazt committed
161
#ifdef DEBUG_DCI_POLAR_PARAMS
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
	uint32_t dci_pdu[4];
	memset(dci_pdu,0,sizeof(uint32_t)*4);
	dci_pdu[0]=0x01189400;
	printf("dci_pdu: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
			dci_pdu[0], dci_pdu[1], dci_pdu[2], dci_pdu[3]);
	uint32_t encoder_output[54];
	memset(encoder_output,0,sizeof(uint32_t)*54);
	uint16_t size=41;
	uint16_t rnti=3;
	aggregation_level=8;
	nr_polar_init(&nrPolar_params, 1, size, aggregation_level);
	t_nrPolar_paramsPtr currentPtrDCI=nr_polar_params(nrPolar_params, 1, size, aggregation_level);

	polar_encoder_dci(dci_pdu, encoder_output, currentPtrDCI, rnti);
	for (int i=0;i<54;i++)
		printf("encoder_output: [%2d]->0x%08x \n",i, encoder_output[i]);

	uint8_t *encoder_outputByte = malloc(sizeof(uint8_t) * currentPtrDCI->encoderLength);
	double *channel_output  = malloc (sizeof(double) * currentPtrDCI->encoderLength);
	uint32_t dci_estimation[4];
	memset(dci_estimation,0,sizeof(uint32_t)*4);
	printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
			dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
	nr_bit2byte_uint32_8_t(encoder_output, currentPtrDCI->encoderLength, encoder_outputByte);
	printf("[polartest] encoder_outputByte: ");
	for (int i = 0; i < currentPtrDCI->encoderLength; i++) printf("%d-", encoder_outputByte[i]);
	printf("\n");
	for(int i=0; i<currentPtrDCI->encoderLength; i++) {
		if (encoder_outputByte[i] == 0) {
			channel_output[i]=1/sqrt(2);
		}
		else {
			channel_output[i]=(-1)/sqrt(2);
		}
	}
197

198 199 200 201 202 203 204 205 206 207 208 209
	decoderState = polar_decoder_dci(channel_output,
									 dci_estimation,
									 currentPtrDCI,
									 NR_POLAR_DECODER_LISTSIZE,
									 NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
									 rnti);
	printf("dci_estimation: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
			dci_estimation[0], dci_estimation[1], dci_estimation[2], dci_estimation[3]);
	return 0;
#endif

#ifdef DEBUG_CRC
yilmazt's avatar
yilmazt committed
210
	uint32_t crc;
yilmazt's avatar
yilmazt committed
211
	unsigned int poly24c = 0xb2b11700;
212 213 214 215 216 217 218 219 220 221 222 223 224
	uint32_t testInputCRC[4];
	testInputCRC[0]=0x00291880;
	//testInputCRC[0]=0x01189400;
	testInputCRC[1]=0x00000000;
	testInputCRC[2]=0x00000000;
	testInputCRC[3]=0x00000000;

	uint32_t testInputcrc=0x01189400;
	uint32_t testInputcrc2=0x00291880;

	uint8_t testInputCRC2[8];
	nr_crc_bit2bit_uint32_8_t(testInputCRC, 32, testInputCRC2);
	printf("testInputCRC2: [0]->%x \t [1]->%x \t [2]->%x \t [3]->%x\n"
yilmazt's avatar
yilmazt committed
225
		   "            [4]->%x \t [5]->%x \t [6]->%x \t [7]->%x\n",
226 227 228 229 230 231 232 233
				testInputCRC2[0], testInputCRC2[1], testInputCRC2[2], testInputCRC2[3],
				testInputCRC2[4], testInputCRC2[5], testInputCRC2[6], testInputCRC2[7]);
	unsigned int crc41 = crc24c(testInputCRC, 32);
	unsigned int crc65 = crc24c(testInputCRC, 56);
	printf("crc41: [0]->0x%08x\tcrc65: [0]->0x%08x\n",crc41, crc65);
	for (int i=0;i<32;i++) printf("crc41[%d]=%d\tcrc65[%d]=%d\n",i,(crc41>>i)&1,i,(crc65>>i)&1);

    crc = crc24c(testInputCRC, testLength)>>8;
yilmazt's avatar
yilmazt committed
234 235
    for (int i=0;i<24;i++) printf("[i]=%d\n",(crc>>i)&1);
    printf("crc: [0]->0x%08x\n",crc);
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
    //crcbit(testInputCRC, sizeof(test) - 1, poly24c));

    testInputCRC[testLength>>3] = ((uint8_t*)&crc)[2];
    testInputCRC[1+(testLength>>3)] = ((uint8_t*)&crc)[1];
    testInputCRC[2+(testLength>>3)] = ((uint8_t*)&crc)[0];
    printf("testInputCRC: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%08x\n",
    			testInputCRC[0], testInputCRC[1], testInputCRC[2], testInputCRC[3]);


    //uint32_t trial32 = 0xffffffff;
    uint32_t trial32 = 0xf10fffff;
    uint8_t a[4];
	//memcpy(a, &trial32, sizeof(trial32));
	*(uint32_t *)a = trial32;
    unsigned char trial[4];
    trial[0]=0xff; trial[1]=0xff;  trial[2]=0x0f; trial[3]=0xf1;
    uint32_t trialcrc = crc24c(trial, 32);
    uint32_t trialcrc32 = crc24c((uint8_t *)&trial32, 32);
    //uint32_t trialcrc32 = crc24c(a, 32);
    printf("crcbit(trial = %x\n", crcbit(trial, 4, poly24c));
    printf("trialcrc = %x\n", trialcrc);
    printf("trialcrc32 = %x\n", trialcrc32);
    for (int i=0;i<32;i++) printf("trialcrc[%2d]=%d\ttrialcrc32[%2d]=%d\n",i,(trialcrc>>i)&1,i,(trialcrc32>>i)&1);


    //uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
    uint8_t nr_polar_A[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1};
    uint8_t nr_polar_crc[24];
    uint8_t **crc_generator_matrix = crc24c_generator_matrix(32);
	nr_matrix_multiplication_uint8_t_1D_uint8_t_2D(nr_polar_A,
												   crc_generator_matrix,
												   nr_polar_crc,
												   32,
												   24);
	for (uint8_t i = 0; i < 24; i++){
		nr_polar_crc[i] = (nr_polar_crc[i] % 2);
		printf("nr_polar_crc[%d]=%d\n",i,nr_polar_crc[i]);
	}
    return 0;
yilmazt's avatar
yilmazt committed
275
#endif
Guy De Souza's avatar
Guy De Souza committed
276

yilmazt's avatar
yilmazt committed
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
#ifdef DEBUG_POLAR_TIMING
	for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
		SNR_lin = pow(10, SNR / 10);
		for (itr = 1; itr <= iterations; itr++) {
			for (int j=0; j<ceil(testLength / 32.0); j++) {
				for(int i=0; i<32; i++) {
					testInput[j] |= ( ((uint32_t) (rand()%2)) &1);
					testInput[j]<<=1;
				}
			}
			printf("testInput: [0]->0x%08x \n", testInput[0]);
			polar_encoder_timing(testInput, encoderOutput, currentPtr, cpu_freq_GHz, logFile);
		}
	}
	fclose(logFile);
	free(testInput);
	free(encoderOutput);
	free(modulatedInput);
	free(channelOutput);
	free(estimatedOutput);
	return (0);
#endif
Guy De Souza's avatar
Guy De Souza committed
299 300

	// We assume no a priori knowledge available about the payload.
yilmazt's avatar
yilmazt committed
301 302
	double aPrioriArray[currentPtr->payloadBits];
	for (int i=0; i<currentPtr->payloadBits; i++) aPrioriArray[i] = NAN;
303

Guy De Souza's avatar
Guy De Souza committed
304
	for (SNR = SNRstart; SNR <= SNRstop; SNR += SNRinc) {
305
	  printf("SNR %f\n",SNR);
Guy De Souza's avatar
Guy De Souza committed
306 307 308
		SNR_lin = pow(10, SNR/10);
		for (itr = 1; itr <= iterations; itr++) {

yilmazt's avatar
yilmazt committed
309 310 311 312 313 314 315
			for (int i = 0; i < testArrayLength; i++) {
				for (int j = 0; j < (sizeof(testInput[0])*8)-1; j++) {
					testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
					testInput[i]<<=1;
				}
				testInput[i] |= ( ((uint32_t) (rand()%2)) &1);
			}
Guy De Souza's avatar
Guy De Souza committed
316

yilmazt's avatar
yilmazt committed
317 318 319
			/*printf("testInput: [0]->0x%08x\n", testInput[0]);
			for (int i=0; i<32; i++)
				printf("%d\n",(testInput[0]>>i)&1);*/
Guy De Souza's avatar
Guy De Souza committed
320

yilmazt's avatar
yilmazt committed
321 322 323
			start_meas(&timeEncoder);
			polar_encoder(testInput, encoderOutput, currentPtr);
			stop_meas(&timeEncoder);
Guy De Souza's avatar
Guy De Souza committed
324

yilmazt's avatar
yilmazt committed
325
			/*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
326
			printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
327

yilmazt's avatar
yilmazt committed
328 329
			//Bit-to-byte:
			nr_bit2byte_uint32_8_t(encoderOutput, coderLength, encoderOutputByte);
Guy De Souza's avatar
Guy De Souza committed
330

yilmazt's avatar
yilmazt committed
331 332 333 334 335 336
			//BPSK modulation
			for(int i=0; i<coderLength; i++) {
				if (encoderOutputByte[i] == 0)
					modulatedInput[i]=1/sqrt(2);
				else
					modulatedInput[i]=(-1)/sqrt(2);
Guy De Souza's avatar
Guy De Souza committed
337

yilmazt's avatar
yilmazt committed
338
				channelOutput[i] = modulatedInput[i] + (gaussdouble(0.0,1.0) * (1/sqrt(2*SNR_lin)));
knopp's avatar
knopp committed
339 340 341 342 343 344 345 346 347

				
				if (decoder_int16==1) {
				  if (channelOutput[i] > 15) channelOutput_int16[i] = 127;
				  else if (channelOutput[i] < -16) channelOutput_int16[i] = -128;
				  else channelOutput_int16[i] = (int16_t) (8*channelOutput[i]);
				}


yilmazt's avatar
yilmazt committed
348
			}
Guy De Souza's avatar
Guy De Souza committed
349

yilmazt's avatar
yilmazt committed
350 351 352 353 354 355 356
			start_meas(&timeDecoder);
			/*decoderState = polar_decoder(channelOutput,
									 	 estimatedOutput,
									 	 currentPtr,
									 	 NR_POLAR_DECODER_LISTSIZE,
									 	 aPrioriArray,
									 	 NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION);*/
knopp's avatar
knopp committed
357 358 359 360 361 362 363 364 365 366 367 368 369
			if (decoder_int16==0)
			  decoderState = polar_decoder_aPriori(channelOutput,
							       estimatedOutput,
							       currentPtr,
							       NR_POLAR_DECODER_LISTSIZE,
							       NR_POLAR_DECODER_PATH_METRIC_APPROXIMATION,
							       aPrioriArray);
			else 
			  decoderState = polar_decoder_int16(channelOutput_int16,
							     estimatedOutput,
							     currentPtr);

			  
yilmazt's avatar
yilmazt committed
370 371
			stop_meas(&timeDecoder);
			/*printf("testInput: [0]->0x%08x\n", testInput[0]);
372 373
			printf("estimatedOutput: [0]->0x%08x\n", estimatedOutput[0]);*/

yilmazt's avatar
yilmazt committed
374 375 376 377 378 379 380 381 382 383 384 385 386

			//calculate errors
			if (decoderState==-1) {
				blockErrorState=-1;
				nBitError=-1;
			} else {
				for (int i = 0; i < testArrayLength; i++) {
					for (int j = 0; j < (sizeof(testInput[0])*8); j++) {
						if (((estimatedOutput[i]>>j) & 1) != ((testInput[i]>>j) & 1)) nBitError++;
					}
				}

				if (nBitError>0) blockErrorState=1;
Guy De Souza's avatar
Guy De Souza committed
387 388
			}

yilmazt's avatar
yilmazt committed
389 390 391 392 393 394 395 396 397 398 399 400 401
			//Iteration times are in microseconds.
			timeEncoderCumulative+=(timeEncoder.diff_now/(cpu_freq_GHz*1000.0));
			timeDecoderCumulative+=(timeDecoder.diff_now/(cpu_freq_GHz*1000.0));
			fprintf(logFile,",%f,%d,%d,%f,%f\n", SNR, nBitError, blockErrorState,
					(timeEncoder.diff_now/(cpu_freq_GHz*1000.0)), (timeDecoder.diff_now/(cpu_freq_GHz*1000.0)));

			if (nBitError<0) {
				blockErrorCumulative++;
				bitErrorCumulative+=testLength;
			} else {
				blockErrorCumulative+=blockErrorState;
				bitErrorCumulative+=nBitError;
			}
Guy De Souza's avatar
Guy De Souza committed
402

yilmazt's avatar
yilmazt committed
403 404 405
			decoderState=0;
			nBitError=0;
			blockErrorState=0;
Guy De Souza's avatar
Guy De Souza committed
406 407 408 409 410 411 412

		}
		//Calculate error statistics for the SNR.
		printf("[ListSize=%d, Appr=%d] SNR=%+8.3f, BLER=%9.6f, BER=%12.9f, t_Encoder=%9.3fus, t_Decoder=%9.3fus\n",
				decoderListSize, pathMetricAppr, SNR, ((double)blockErrorCumulative/iterations),
				((double)bitErrorCumulative / (iterations*testLength)),
				(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
413

Guy De Souza's avatar
Guy De Souza committed
414 415 416 417 418 419 420 421
		blockErrorCumulative = 0; bitErrorCumulative = 0;
		timeEncoderCumulative = 0; timeDecoderCumulative = 0;
	}

	print_meas(&timeEncoder,"polar_encoder",NULL,NULL);
	print_meas(&timeDecoder,"polar_decoder",NULL,NULL);

	fclose(logFile);
yilmazt's avatar
yilmazt committed
422
	//Bit
Guy De Souza's avatar
Guy De Souza committed
423 424
	free(testInput);
	free(encoderOutput);
yilmazt's avatar
yilmazt committed
425 426 427
	free(estimatedOutput);
	//Byte
	free(encoderOutputByte);
Guy De Souza's avatar
Guy De Souza committed
428 429 430 431 432
	free(modulatedInput);
	free(channelOutput);

	return (0);
}