Commit fd08fe11 authored by Florian Kaltenberger's avatar Florian Kaltenberger

re-introducing the multi-segment version (for up to 8 segments for now)

parent 02589197
...@@ -76,26 +76,30 @@ int test_ldpc(short No_iteration, ...@@ -76,26 +76,30 @@ int test_ldpc(short No_iteration,
opp_enabled=1; opp_enabled=1;
cpu_freq_GHz = get_cpu_freq_GHz(); cpu_freq_GHz = get_cpu_freq_GHz();
//short test_input[block_length]; //short test_input[block_length];
unsigned char *test_input; unsigned char *test_input[MAX_NUM_DLSCH_SEGMENTS];
//short *c; //padded codeword //short *c; //padded codeword
short *esimated_output; short *esimated_output;
unsigned char *channel_input; unsigned char *channel_input[MAX_NUM_DLSCH_SEGMENTS];
unsigned char *channel_input_optim; unsigned char *channel_input_optim[MAX_NUM_DLSCH_SEGMENTS];
double *channel_output; double *channel_output;
double *modulated_input; double *modulated_input;
short *channel_output_fixed; short *channel_output_fixed;
unsigned int i,trial=0; unsigned int i,j,trial=0;
short BG,Zc,Kb,nrows,ncols; short BG,Zc,Kb,nrows,ncols;
int no_punctured_columns,removed_bit; int no_punctured_columns,removed_bit;
int i1; int i1;
//Table of possible lifting sizes //Table of possible lifting sizes
short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
int n_segments=8;
*errors=0; *errors=0;
*crc_misses=0; *crc_misses=0;
// generate input block // generate input block
test_input=(unsigned char *)malloc(sizeof(unsigned char) * block_length/8); for(j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
channel_input = (unsigned char *)malloc(sizeof(unsigned char) * 68*384); test_input[j]=(unsigned char *)malloc(sizeof(unsigned char) * block_length/8);
channel_input_optim = (unsigned char *)malloc(sizeof(unsigned char) * 68*384); channel_input[j] = (unsigned char *)malloc(sizeof(unsigned char) * 68*384);
channel_input_optim[j] = (unsigned char *)malloc(sizeof(unsigned char) * 68*384);
}
modulated_input = (double *)malloc(sizeof(double) * 68*384); modulated_input = (double *)malloc(sizeof(double) * 68*384);
channel_output = (double *)malloc(sizeof(double) * 68*384); channel_output = (double *)malloc(sizeof(double) * 68*384);
reset_meas(&time); reset_meas(&time);
...@@ -104,10 +108,12 @@ int test_ldpc(short No_iteration, ...@@ -104,10 +108,12 @@ int test_ldpc(short No_iteration,
reset_meas(&tprep); reset_meas(&tprep);
reset_meas(&tparity); reset_meas(&tparity);
reset_meas(&toutput); reset_meas(&toutput);
for (i=0; i<block_length/8; i++)
{ for (j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
//test_input[i]=(unsigned char) rand(); for (i=0; i<block_length/8; i++) {
test_input[i]=217; test_input[j][i]=(unsigned char) rand();
//test_input[j][i]=j%256;
}
} }
//determine number of bits in codeword //determine number of bits in codeword
...@@ -152,7 +158,7 @@ int test_ldpc(short No_iteration, ...@@ -152,7 +158,7 @@ int test_ldpc(short No_iteration,
// printf("puncture:%d\n",no_punctured_columns); // printf("puncture:%d\n",no_punctured_columns);
removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length/((float)nom_rate/(float)denom_rate)); removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length/((float)nom_rate/(float)denom_rate));
if (ntrials==0) if (ntrials==0)
ldpc_encoder_orig(test_input,channel_input, block_length, nom_rate, denom_rate, 1); ldpc_encoder_orig(test_input[0],channel_input[0], block_length, nom_rate, denom_rate, 1);
for (trial=0; trial < ntrials; trial++) for (trial=0; trial < ntrials; trial++)
{ {
...@@ -160,21 +166,24 @@ int test_ldpc(short No_iteration, ...@@ -160,21 +166,24 @@ int test_ldpc(short No_iteration,
//// encoder //// encoder
start_meas(&time); start_meas(&time);
//if (BG==1) for(j=0;j<n_segments;j++) {
//ldpc_encoder(test_input, channel_input,block_length,nom_rate,denom_rate); //if (BG==1)
//else //ldpc_encoder(test_input, channel_input,block_length,nom_rate,denom_rate);
ldpc_encoder_orig(test_input, channel_input,block_length,nom_rate,denom_rate,0); //else
ldpc_encoder_orig(test_input[j], channel_input[j],block_length,nom_rate,denom_rate,0);
}
stop_meas(&time); stop_meas(&time);
start_meas(&time_optim); start_meas(&time_optim);
ldpc_encoder_optim(test_input,channel_input_optim,block_length,nom_rate,denom_rate,&tinput,&tprep,&tparity,&toutput); ldpc_encoder_optim(test_input,channel_input_optim,block_length,nom_rate,denom_rate,n_segments,&tinput,&tprep,&tparity,&toutput);
stop_meas(&time_optim); stop_meas(&time_optim);
if (ntrials==1) if (ntrials==1)
for (i = 0; i < block_length+(nrows-no_punctured_columns) * Zc - removed_bit; i++) for (j=0;j<n_segments;j++)
if (channel_input[i]!=channel_input_optim[i]) printf("differ in pos %d (%d,%d)\n",i, for (i = 0; i < block_length+(nrows-no_punctured_columns) * Zc - removed_bit; i++)
channel_input[i], if (channel_input[j][i]!=channel_input_optim[j][i])
channel_input_optim[i]); printf("differ in seg %d pos %d (%d,%d)\n",j,i,channel_input[j][i],channel_input_optim[j][i]);
//print_meas_now(&time, "", stdout); //print_meas_now(&time, "", stdout);
// for (i=0;i<6400;i++) // for (i=0;i<6400;i++)
...@@ -197,7 +206,7 @@ int test_ldpc(short No_iteration, ...@@ -197,7 +206,7 @@ int test_ldpc(short No_iteration,
#endif #endif
if (channel_input[i-2*Zc]==0) if (channel_input[0][i-2*Zc]==0)
modulated_input[i]=1/sqrt(2); //QPSK modulated_input[i]=1/sqrt(2); //QPSK
else else
modulated_input[i]=-1/sqrt(2); modulated_input[i]=-1/sqrt(2);
...@@ -225,7 +234,7 @@ int test_ldpc(short No_iteration, ...@@ -225,7 +234,7 @@ int test_ldpc(short No_iteration,
//count errors //count errors
for (i=2*Zc; i<(Kb+nrows-no_punctured_columns) * Zc-removed_bit; i++) for (i=2*Zc; i<(Kb+nrows-no_punctured_columns) * Zc-removed_bit; i++)
{ {
if (esimated_output[i] != channel_input[i-2*Zc]) if (esimated_output[i] != channel_input[0][i-2*Zc])
{ {
*errors = (*errors) + 1; *errors = (*errors) + 1;
break; break;
......
...@@ -577,6 +577,6 @@ int encode_parity_check_part_orig(unsigned char *c,unsigned char *d, short BG,sh ...@@ -577,6 +577,6 @@ int encode_parity_check_part_orig(unsigned char *c,unsigned char *d, short BG,sh
int ldpc_encoder(unsigned char *test_input,unsigned char *channel_input,short block_length, double rate); int ldpc_encoder(unsigned char *test_input,unsigned char *channel_input,short block_length, double rate);
int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,unsigned char gen_code); int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,unsigned char gen_code);
int ldpc_encoder_multi_segment(unsigned char **test_input,unsigned char **channel_input,short block_length,double rate,uint8_t n_segments); int ldpc_encoder_multi_segment(unsigned char **test_input,unsigned char **channel_input,short block_length,double rate,uint8_t n_segments);
int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput); int ldpc_encoder_optim(unsigned char **test_input,unsigned char **channel_input,short block_length,int nom_rate,int denom_rate,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
#endif #endif
...@@ -164,16 +164,19 @@ void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,sho ...@@ -164,16 +164,19 @@ void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,sho
} }
int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) int ldpc_encoder_optim(unsigned char **test_input,unsigned char **channel_input,short block_length,int nom_rate,int denom_rate,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
{ {
short BG,Zc,Kb,nrows,ncols; short BG,Zc,Kb,nrows,ncols;
int i,i1; int i,i1,j;
int no_punctured_columns,removed_bit; int no_punctured_columns,removed_bit;
//Table of possible lifting sizes //Table of possible lifting sizes
short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
int simd_size; int simd_size;
char temp;
AssertFatal(n_segments>0&&n_segments<=8,"0 < n_segments %d <= 8\n",n_segments);
//determine number of bits in codeword //determine number of bits in codeword
if (block_length>3840) if (block_length>3840)
...@@ -230,11 +233,13 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh ...@@ -230,11 +233,13 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
memset(d,0,sizeof(unsigned char) * nrows * Zc); memset(d,0,sizeof(unsigned char) * nrows * Zc);
start_meas(tinput); start_meas(tinput);
for (i=0; i<block_length; i++) for (i=0; i<block_length; i++) {
{ for (j=0; j<n_segments; j++) {
//c[i] = test_input[i/8]<<(i%8); temp = (test_input[j][i/8]&(1<<(i&7)))>>(i&7);
//c[i]=c[i]>>7&1; //printf("c(%d,%d)=%d\n",j,i,temp);
c[i]=(test_input[i/8]&(1<<(i&7)))>>(i&7); c[i] |= (temp << j);
}
//printf("c[%d]=%d\n",i,c[i]);
} }
stop_meas(tinput); stop_meas(tinput);
...@@ -269,8 +274,17 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh ...@@ -269,8 +274,17 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
} }
start_meas(toutput); start_meas(toutput);
// information part and puncture columns // information part and puncture columns
/*
memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char)); memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char));
*/
for (i=0;i<(block_length-2*Zc);i++)
for (j=0; j<n_segments; j++)
channel_input[j][i] = (c[2*Zc+i]>>j)&1;
for (i=0;i<((nrows-no_punctured_columns) * Zc-removed_bit);i++)
for (j=0; j<n_segments; j++)
channel_input[j][block_length-2*Zc+i] = (d[i]>>j)&1;
stop_meas(toutput); stop_meas(toutput);
return 0; return 0;
} }
...@@ -767,6 +767,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -767,6 +767,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs; // unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
uint8_t beamforming_mode=0; uint8_t beamforming_mode=0;
//double rate = 0.33; //double rate = 0.33;
uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
...@@ -830,9 +831,9 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -830,9 +831,9 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
&dlsch->harq_processes[harq_pid]->F); &dlsch->harq_processes[harq_pid]->F);
#endif #endif
#ifdef TD_DECODING
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
#ifdef TD_DECODING
if (r<dlsch->harq_processes[harq_pid]->Cminus) if (r<dlsch->harq_processes[harq_pid]->Cminus)
Kr = dlsch->harq_processes[harq_pid]->Kminus; Kr = dlsch->harq_processes[harq_pid]->Kminus;
else else
...@@ -887,6 +888,14 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -887,6 +888,14 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14) f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14)
); );
stop_meas(te_stats); stop_meas(te_stats);
start_meas(i_stats);
dlsch->harq_processes[harq_pid]->RTC[r] =
sub_block_interleaving_turbo(4+(Kr_bytes*8),
&dlsch->harq_processes[harq_pid]->d[r][96],
dlsch->harq_processes[harq_pid]->w[r]);
stop_meas(i_stats);
}
#else #else
Kr = dlsch->harq_processes[harq_pid]->Kplus; Kr = dlsch->harq_processes[harq_pid]->Kplus;
...@@ -898,18 +907,20 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -898,18 +907,20 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
else else
Kr_int = Kr; Kr_int = Kr;
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
memset(dlsch->harq_processes[harq_pid]->d[r],0,(96+12+3+3*8448)*sizeof(uint8_t));
d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][96];
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("start ldpc encoder B %d\n",dlsch->harq_processes[harq_pid]->B); printf("start ldpc encoder B %d\n",dlsch->harq_processes[harq_pid]->B);
printf("input %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->c[r][0], dlsch->harq_processes[harq_pid]->c[r][1], dlsch->harq_processes[harq_pid]->c[r][2],dlsch->harq_processes[harq_pid]->c[r][3], dlsch->harq_processes[harq_pid]->c[r][4]); printf("input %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->c[r][0], dlsch->harq_processes[harq_pid]->c[r][1], dlsch->harq_processes[harq_pid]->c[r][2],dlsch->harq_processes[harq_pid]->c[r][3], dlsch->harq_processes[harq_pid]->c[r][4]);
#endif #endif
}
start_meas(te_stats); start_meas(te_stats);
memset(dlsch->harq_processes[harq_pid]->d[r],0,(96+12+3+3*8448)*sizeof(uint8_t));
//ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1.0/3.0); //ldpc_encoder((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1.0/3.0);
ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][96],Kr,1,3,NULL,NULL,NULL,NULL); ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,1,3,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
stop_meas(te_stats); stop_meas(te_stats);
#endif
#if 0 #if 0
printf("end ldpc encoder -- output\n"); printf("end ldpc encoder -- output\n");
...@@ -930,21 +941,14 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -930,21 +941,14 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
#endif #endif
start_meas(i_stats); start_meas(i_stats);
#ifdef TD_DECODING
dlsch->harq_processes[harq_pid]->RTC[r] =
sub_block_interleaving_turbo(4+(Kr_bytes*8),
&dlsch->harq_processes[harq_pid]->d[r][96],
dlsch->harq_processes[harq_pid]->w[r]);
#else
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
dlsch->harq_processes[harq_pid]->RTC[r] = dlsch->harq_processes[harq_pid]->RTC[r] =
sub_block_interleaving_turbo((Kr_int), sub_block_interleaving_turbo((Kr_int),
&dlsch->harq_processes[harq_pid]->d[r][96], &dlsch->harq_processes[harq_pid]->d[r][96],
dlsch->harq_processes[harq_pid]->w[r]); dlsch->harq_processes[harq_pid]->w[r]);
} }
#endif
stop_meas(i_stats); stop_meas(i_stats);
} #endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment