polartest.c 14.2 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
21
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;
	opp_enabled=1;
22
	int decoder_int16=0;
Guy De Souza's avatar
Guy De Souza committed
23
24
25
26
	cpu_freq_GHz = get_cpu_freq_GHz();
	reset_meas(&timeEncoder);
	reset_meas(&timeDecoder);
	randominit(0);
yilmazt's avatar
yilmazt committed
27
	crcTableInit();
28

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

	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
36
	uint16_t testLength = 0, coderLength = 0, blockErrorCumulative=0, bitErrorCumulative=0;
Guy De Souza's avatar
Guy De Souza committed
37
	double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
yilmazt's avatar
yilmazt committed
38
	uint8_t aggregation_level = 8, decoderListSize = 8, pathMetricAppr = 0;
Guy De Souza's avatar
Guy De Souza committed
39

knopp's avatar
knopp committed
40
	while ((arguments = getopt (argc, argv, "s:d:f:m:i:l:a:h:qg")) != -1)
Guy De Souza's avatar
Guy De Souza committed
41
42
43
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
	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;

yilmazt's avatar
yilmazt committed
71
72
73
74
75
76
77
78
79
80
81
82
83
84
		case 'q':
			decoder_int16 = 1;
			break;

		case 'g':
			iterations = 1;
			SNRstart = -6.0;
			SNRstop = -6.0;
			decoder_int16 = 1;
			break;

		case 'h':
			printf("./polartest -s SNRstart -d SNRinc -f SNRstop -m [0=PBCH|1=DCI|2=UCI] -i iterations -l decoderListSize -a pathMetricAppr\n");
			exit(-1);
85

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

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

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

yilmazt's avatar
yilmazt committed
110
111
	folderName=getenv("HOME");
	strcat(folderName,"/Desktop/polartestResults");
yilmazt's avatar
yilmazt committed
112
113
114
115

	#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
116
	sprintf(fileName,"%s/_ListSize_%d_pmAppr_%d_Payload_%d_Itr_%d",folderName,decoderListSize,pathMetricAppr,testLength,iterations);
yilmazt's avatar
yilmazt committed
117
	#endif
Guy De Souza's avatar
Guy De Souza committed
118
119
120
	strftime(currentTimeInfo, 25, "_%Y-%m-%d-%H-%M-%S.csv", localtime(&currentTime));
	strcat(fileName,currentTimeInfo);

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

yilmazt's avatar
yilmazt committed
125
	FILE* logFile;
Guy De Souza's avatar
Guy De Souza committed
126
127
128
129
130
    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
131
132
133
134

#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
135
    fprintf(logFile,",SNR,nBitError,blockErrorState,t_encoder[us],t_decoder[us]\n");
yilmazt's avatar
yilmazt committed
136
#endif
Guy De Souza's avatar
Guy De Souza committed
137

yilmazt's avatar
yilmazt committed
138
139
    uint8_t testArrayLength = ceil(testLength / 32.0);
    uint8_t coderArrayLength = ceil(coderLength / 32.0);
yilmazt's avatar
yilmazt committed
140

yilmazt's avatar
yilmazt committed
141
142
143
	uint32_t testInput[testArrayLength]; //generate randomly
	uint32_t encoderOutput[coderArrayLength];
	uint32_t estimatedOutput[testArrayLength]; //decoder output
yilmazt's avatar
yilmazt committed
144
145
146
	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
147

yilmazt's avatar
yilmazt committed
148
149
150
151
152
	uint8_t encoderOutputByte[coderLength];
	double modulatedInput[coderLength]; //channel input
	double channelOutput[coderLength];  //add noise

	int16_t channelOutput_int16[coderLength];
knopp's avatar
knopp committed
153
 
yilmazt's avatar
yilmazt committed
154
	t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL;
yilmazt's avatar
yilmazt committed
155
	nr_polar_init(&nrPolar_params, polarMessageType, testLength, aggregation_level);
yilmazt's avatar
yilmazt committed
156
157
	currentPtr = nr_polar_params(nrPolar_params, polarMessageType, testLength, aggregation_level);

yilmazt's avatar
yilmazt committed
158
#ifdef DEBUG_DCI_POLAR_PARAMS
159
160
161
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
	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);
		}
	}
knopp's avatar
knopp committed
194

195
196
197
198
199
200
201
202
	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]);
yilmazt's avatar
yilmazt committed
203
204
	free(encoder_outputByte);
	free(channel_output);
205
206
207
208
	return 0;
#endif

#ifdef DEBUG_CRC
yilmazt's avatar
yilmazt committed
209
	uint32_t crc;
yilmazt's avatar
yilmazt committed
210
	unsigned int poly24c = 0xb2b11700;
211
212
213
214
215
216
217
218
219
220
221
222
223
	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
224
		   "            [4]->%x \t [5]->%x \t [6]->%x \t [7]->%x\n",
225
226
227
228
229
230
231
232
				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
233
234
    for (int i=0;i<24;i++) printf("[i]=%d\n",(crc>>i)&1);
    printf("crc: [0]->0x%08x\n",crc);
235
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
    //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);
yilmazt's avatar
yilmazt committed
264
	nr_matrix_multiplication_uint8_1D_uint8_2D(nr_polar_A,
265
266
267
268
269
270
271
272
273
												   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
274
#endif
Guy De Souza's avatar
Guy De Souza committed
275

yilmazt's avatar
yilmazt committed
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#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
298
299

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

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

yilmazt's avatar
yilmazt committed
308
309
310
311
312
313
314
			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
315

yilmazt's avatar
yilmazt committed
316
317
318
			/*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
319

yilmazt's avatar
yilmazt committed
320
			start_meas(&timeEncoder);
321
322
323
			if (decoder_int16==0)
			  polar_encoder(testInput, encoderOutput, currentPtr);
			else
yilmazt's avatar
yilmazt committed
324
325
				polar_encoder_fast((uint64_t*)testInput, encoderOutput,0, currentPtr);
			  //polar_encoder_fast((uint64_t*)testInput, (uint64_t*)encoderOutput,0, currentPtr);
yilmazt's avatar
yilmazt committed
326
327
			stop_meas(&timeEncoder);
			/*printf("encoderOutput: [0]->0x%08x\n", encoderOutput[0]);
328
			printf("encoderOutput: [1]->0x%08x\n", encoderOutput[1]);*/
knopp's avatar
knopp committed
329

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

yilmazt's avatar
yilmazt committed
333
334
335
336
337
338
			//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
339

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

				
				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
350
			}
Guy De Souza's avatar
Guy De Souza committed
351

yilmazt's avatar
yilmazt committed
352
353
354
355
356
357
358
			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
359
360
361
362
363
364
365
366
367
			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,
368
							     (uint64_t*)estimatedOutput,
knopp's avatar
knopp committed
369
370
371
							     currentPtr);

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

yilmazt's avatar
yilmazt committed
376
377
378
379
380
381

			//calculate errors
			if (decoderState==-1) {
				blockErrorState=-1;
				nBitError=-1;
			} else {
382
383
384
385
386
387
388
389
			  for (int j = 0; j < currentPtr->payloadBits; j++) {
			    if (((estimatedOutput[0]>>j) & 1) != ((testInput[0]>>j) & 1)) nBitError++;
			    
			  }
			

			  if (nBitError>0) { 
			    blockErrorState=1; 
390
			    //			    printf("Error: Input %x, Output %x\n",testInput[0],estimatedOutput[0]);
391
			  }
Guy De Souza's avatar
Guy De Souza committed
392
393
			}

yilmazt's avatar
yilmazt committed
394
395
396
397
398
399
400
401
402
403
404
405
406
			//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
407

yilmazt's avatar
yilmazt committed
408
409
410
			decoderState=0;
			nBitError=0;
			blockErrorState=0;
Guy De Souza's avatar
Guy De Souza committed
411
412
413
414
415
416
417

		}
		//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);
418

Guy De Souza's avatar
Guy De Souza committed
419
420
421
422
423
424
425
426
427
428
		blockErrorCumulative = 0; bitErrorCumulative = 0;
		timeEncoderCumulative = 0; timeDecoderCumulative = 0;
	}

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

	fclose(logFile);
	return (0);
}