Some more clean up + adding second option for a precoder.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+326
-327
@@ -476,7 +476,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
case 'Q':
|
case 'Q':
|
||||||
channel_model=Rayleigh1_orth_eff_ch_TM4_prec_real; // for DUALSTREAM_UNIFORM_PRECODING1 when interf is precancelled
|
channel_model=Rayleigh1_orth_eff_ch_TM4_prec_real; // for DUALSTREAM_UNIFORM_PRECODING1 when interf is precancelled
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
channel_model=Rayleigh1_orth_eff_ch_TM4_prec_imag; // for DUALSTREAM_UNIFORM_PRECODINGj when interf is precancelled
|
channel_model=Rayleigh1_orth_eff_ch_TM4_prec_imag; // for DUALSTREAM_UNIFORM_PRECODINGj when interf is precancelled
|
||||||
break;
|
break;
|
||||||
@@ -525,49 +525,49 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'R':
|
case 'R':
|
||||||
num_rounds=atoi(optarg);
|
num_rounds=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
subframe=atoi(optarg);
|
subframe=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
n_rnti=atoi(optarg);
|
n_rnti=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
rx_type = (RX_type_t) atoi(optarg);
|
rx_type = (RX_type_t) atoi(optarg);
|
||||||
if (rx_type<rx_standard || rx_type>rx_SIC_dual_stream) {
|
if (rx_type<rx_standard || rx_type>rx_SIC_dual_stream) {
|
||||||
printf("Unsupported rx type %d\n",rx_type);
|
printf("Unsupported rx type %d\n",rx_type);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
i_mod = atoi(optarg);
|
i_mod = atoi(optarg);
|
||||||
if (i_mod!=2 && i_mod!=4 && i_mod!=6) {
|
if (i_mod!=2 && i_mod!=4 && i_mod!=6) {
|
||||||
msg("Wrong i_mod %d, should be 2,4 or 6\n",i_mod);
|
msg("Wrong i_mod %d, should be 2,4 or 6\n",i_mod);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
print_perf=1;
|
print_perf=1;
|
||||||
break;
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
xforms = 1;
|
xforms = 1;
|
||||||
break;
|
break;
|
||||||
case 'Z':
|
case 'Z':
|
||||||
dump_table=1;
|
dump_table=1;
|
||||||
break;
|
break;
|
||||||
case 'Y':
|
case 'Y':
|
||||||
perfect_ce=1;
|
perfect_ce=1;
|
||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
interf_unaw_shift0=atoi(optarg);
|
interf_unaw_shift0=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'W':
|
case 'W':
|
||||||
interf_unaw_shift1=atoi(optarg);
|
interf_unaw_shift1=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'J':
|
case 'J':
|
||||||
interf_unaw_shift=atoi(optarg);
|
interf_unaw_shift=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,3,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
|
printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,3,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
|
||||||
@@ -721,14 +721,14 @@ int main(int argc, char **argv)
|
|||||||
sprintf(bler_fname,"bler_tx%d_rec%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,rx_type,channel_model,n_rx,mcs1,mcs_i,rx_type,i_mod);
|
sprintf(bler_fname,"bler_tx%d_rec%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,rx_type,channel_model,n_rx,mcs1,mcs_i,rx_type,i_mod);
|
||||||
else if (abstx == 1)
|
else if (abstx == 1)
|
||||||
if (perfect_ce==1)
|
if (perfect_ce==1)
|
||||||
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_ab_pce_sh%d_pmnew.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx,mcs1, mcs2,interf_unaw_shift );
|
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_ab_pce_sh%d_pnort.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx,mcs1, mcs2,interf_unaw_shift );
|
||||||
else
|
else
|
||||||
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_ab_sh%d_pmnew.csv",transmission_mode,rx_type,channel_model, n_frames, n_rx,mcs1, mcs2,interf_unaw_shift );
|
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_ab_sh%d_pnort.csv",transmission_mode,rx_type,channel_model, n_frames, n_rx,mcs1, mcs2,interf_unaw_shift );
|
||||||
else //abstx=0
|
else //abstx=0
|
||||||
if (perfect_ce==1)
|
if (perfect_ce==1)
|
||||||
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_pce_sh%d_pmnew.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx,mcs1, mcs2, interf_unaw_shift);
|
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_pce_sh%d_pnort.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx,mcs1, mcs2, interf_unaw_shift);
|
||||||
else
|
else
|
||||||
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_sh%d_pmnew.csv",transmission_mode,rx_type,channel_model,n_frames,n_rx,mcs1, mcs2, interf_unaw_shift);
|
sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_mcs%d_mcsi%d_sh%d_pnort.csv",transmission_mode,rx_type,channel_model,n_frames,n_rx,mcs1, mcs2, interf_unaw_shift);
|
||||||
|
|
||||||
bler_fd = fopen(bler_fname,"w");
|
bler_fd = fopen(bler_fname,"w");
|
||||||
if (bler_fd==NULL) {
|
if (bler_fd==NULL) {
|
||||||
@@ -764,9 +764,9 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
else
|
else
|
||||||
if (perfect_ce==1)
|
if (perfect_ce==1)
|
||||||
sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_pce_sh%d_%d_pmnew.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
|
sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_pce_sh%d_%d_pnort.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
|
||||||
else
|
else
|
||||||
sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_sh%d_%d_pmnew.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
|
sprintf(csv_fname,"dout_tx%d_r%d_mcs%d_mcsi%d_ch%d_ns%d_R%d_sh%d_%d_pnort.m",transmission_mode,rx_type,mcs1,mcs2,channel_model,n_frames,num_rounds, interf_unaw_shift, n_ch_rlz);
|
||||||
|
|
||||||
csv_fd = fopen(csv_fname,"w");
|
csv_fd = fopen(csv_fname,"w");
|
||||||
fprintf(csv_fd,"data_all%d=[",mcs1);
|
fprintf(csv_fd,"data_all%d=[",mcs1);
|
||||||
@@ -3412,9 +3412,9 @@ n(tikz_fname,"w");
|
|||||||
if(abstx){
|
if(abstx){
|
||||||
if (trials==0 && round==0 && transmission_mode>=4){
|
if (trials==0 && round==0 && transmission_mode>=4){
|
||||||
for (iii=0; iii<NB_RB; iii++){
|
for (iii=0; iii<NB_RB; iii++){
|
||||||
//fprintf(csv_fd, "%d, %d", (PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii]));
|
//fprintf(csv_fd, "%d, %d", (PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii]));
|
||||||
fprintf(csv_fd,"%x,",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
|
fprintf(csv_fd,"%x,",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
|
||||||
//printf("%x ",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
|
//printf("%x ",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3430,17 +3430,17 @@ n(tikz_fname,"w");
|
|||||||
for (cw_non_sic=0; cw_non_sic<cw_to_decode_interf; cw_non_sic++){
|
for (cw_non_sic=0; cw_non_sic<cw_to_decode_interf; cw_non_sic++){
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
||||||
coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
|
coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->nb_rb,
|
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->nb_rb,
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->rb_alloc,
|
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->rb_alloc,
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs),
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs),
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->Nl,
|
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->Nl,
|
||||||
num_pdcch_symbols,
|
num_pdcch_symbols,
|
||||||
0,subframe);
|
0,subframe);
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->G = coded_bits_per_codeword;
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->G = coded_bits_per_codeword;
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs);
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs);
|
||||||
if (n_frames==2) {
|
if (n_frames==2) {
|
||||||
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_non_sic,coded_bits_per_codeword,
|
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_non_sic,coded_bits_per_codeword,
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->TBS);
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->TBS);
|
||||||
|
|
||||||
// calculate uncoded BER
|
// calculate uncoded BER
|
||||||
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword);
|
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword);
|
||||||
@@ -3454,12 +3454,12 @@ n(tikz_fname,"w");
|
|||||||
uncoded_ber=0;
|
uncoded_ber=0;
|
||||||
printf("trials=%d\n", trials);
|
printf("trials=%d\n", trials);
|
||||||
for (i=0;i<coded_bits_per_codeword;i++)
|
for (i=0;i<coded_bits_per_codeword;i++)
|
||||||
if (PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_non_sic][i]<0)) {
|
if (PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_non_sic][i]<0)) {
|
||||||
uncoded_ber_bit[i] = 1;
|
uncoded_ber_bit[i] = 1;
|
||||||
uncoded_ber++;
|
uncoded_ber++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
uncoded_ber_bit[i] = 0;
|
uncoded_ber_bit[i] = 0;
|
||||||
|
|
||||||
uncoded_ber/=coded_bits_per_codeword;
|
uncoded_ber/=coded_bits_per_codeword;
|
||||||
avg_ber += uncoded_ber;
|
avg_ber += uncoded_ber;
|
||||||
@@ -3476,50 +3476,49 @@ n(tikz_fname,"w");
|
|||||||
|
|
||||||
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
||||||
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
|
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
|
||||||
0,
|
0,
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic],
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic],
|
||||||
coded_bits_per_codeword,
|
coded_bits_per_codeword,
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic],
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic],
|
||||||
cw_non_sic,
|
cw_non_sic,
|
||||||
subframe<<1);
|
subframe<<1);
|
||||||
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
||||||
|
|
||||||
start_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
start_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
||||||
ret[cw_non_sic] = dlsch_decoding(PHY_vars_UE,
|
ret[cw_non_sic] = dlsch_decoding(PHY_vars_UE,
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic],
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic],
|
||||||
&PHY_vars_UE->lte_frame_parms,
|
&PHY_vars_UE->lte_frame_parms,
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic],
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic],
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid],
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid],
|
||||||
subframe,
|
subframe,
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid,
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid,
|
||||||
1,llr8_flag);
|
1,llr8_flag);
|
||||||
stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
||||||
|
|
||||||
|
|
||||||
if (ret[cw_non_sic] <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations ) {
|
if (ret[cw_non_sic] <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations ) {
|
||||||
|
|
||||||
if (cw_non_sic==0) {
|
if (cw_non_sic==0) {
|
||||||
avg_iter[0] += ret[0];
|
avg_iter[0] += ret[0];
|
||||||
iter_trials[0]++;
|
iter_trials[0]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_frames==2) {
|
if (n_frames==2) {
|
||||||
printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_non_sic,round,uncoded_ber);
|
printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_non_sic,round,uncoded_ber);
|
||||||
#ifdef PRINT_BYTES
|
#ifdef PRINT_BYTES
|
||||||
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->C;s++) {
|
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->C;s++) {
|
||||||
if (s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Cminus)
|
if (s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Cminus)
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kminus;
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kminus;
|
||||||
else
|
else
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kplus;
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kplus;
|
||||||
|
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
|
|
||||||
printf("Decoded_output (Segment %d):\n",s);
|
printf("Decoded_output (Segment %d):\n",s);
|
||||||
for (i=0;i<Kr_bytes;i++)
|
for (i=0;i<Kr_bytes;i++)
|
||||||
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i],
|
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i],
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->c[s][i]);
|
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->c[s][i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->current_harq_pid]->TBS;
|
PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->current_harq_pid]->TBS;
|
||||||
@@ -3622,250 +3621,250 @@ n(tikz_fname,"w");
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
if ((PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
|
||||||
(PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) &&
|
(PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) &&
|
||||||
rx_type==rx_SIC_dual_stream) {
|
rx_type==rx_SIC_dual_stream) {
|
||||||
remove("rho_rho_in_llr.m");
|
remove("rho_rho_in_llr.m");
|
||||||
|
|
||||||
// for (round = 0 ; round < 1 ; round++) {
|
// for (round = 0 ; round < 1 ; round++) {
|
||||||
dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
|
dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
|
||||||
dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
|
dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
|
||||||
|
|
||||||
dlsch0_eNB_harq->mimo_mode = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode;
|
dlsch0_eNB_harq->mimo_mode = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode;
|
||||||
dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
|
dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0];
|
||||||
dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
|
dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb;
|
||||||
dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
|
dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs;
|
||||||
dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx;
|
dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx;
|
||||||
dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl;
|
dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl;
|
||||||
dlsch0_eNB_harq->round = dlsch0_ue_harq->round;
|
dlsch0_eNB_harq->round = dlsch0_ue_harq->round;
|
||||||
dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS;
|
dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS;
|
||||||
dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
|
dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
|
||||||
dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
|
dlsch0_eNB_harq->status = dlsch0_ue_harq->status;
|
||||||
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->active = PHY_vars_UE->dlsch_ue[eNB_id][0]->active;
|
PHY_vars_UE->dlsch_eNB[eNB_id]->active = PHY_vars_UE->dlsch_ue[eNB_id][0]->active;
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->rnti = PHY_vars_UE->dlsch_ue[eNB_id][0]->rnti;
|
PHY_vars_UE->dlsch_eNB[eNB_id]->rnti = PHY_vars_UE->dlsch_ue[eNB_id][0]->rnti;
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid = PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid;
|
PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid = PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid;
|
||||||
|
|
||||||
dlsch_encoding(input_buffer0[0], //PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
|
|
||||||
&PHY_vars_UE->lte_frame_parms,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id],
|
|
||||||
0,
|
|
||||||
subframe,
|
|
||||||
&PHY_vars_UE->dlsch_rate_matching_stats,
|
|
||||||
&PHY_vars_UE->dlsch_turbo_encoding_stats,
|
|
||||||
&PHY_vars_UE->dlsch_interleaving_stats);
|
|
||||||
|
|
||||||
|
|
||||||
coded_bits_per_codeword = get_G(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb,
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc,
|
|
||||||
get_Qm(PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs),
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->Nl,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
0,
|
|
||||||
subframe);
|
|
||||||
|
|
||||||
dlsch_scrambling(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
0,
|
|
||||||
PHY_vars_UE->dlsch_eNB[eNB_id],
|
|
||||||
coded_bits_per_codeword,
|
|
||||||
0,
|
|
||||||
subframe<<1);
|
|
||||||
|
|
||||||
re_allocated = dlsch_modulation_SIC(sic_buffer,
|
|
||||||
subframe,
|
|
||||||
&PHY_vars_UE->lte_frame_parms,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
&PHY_vars_UE->dlsch_eNB[0][0],
|
|
||||||
NULL,
|
|
||||||
coded_bits_per_codeword);
|
|
||||||
|
|
||||||
// write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1);
|
|
||||||
// write_output("rxdataF_comp1.m","rxF_comp1", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
|
|
||||||
// write_output("rxdataF_rho.m","rho", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
|
|
||||||
|
|
||||||
switch (get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)){
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
|
|
||||||
dlsch_qpsk_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
sic_buffer,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
|
||||||
num_pdcch_symbols,
|
|
||||||
dlsch0_eNB_harq->nb_rb,
|
|
||||||
subframe,
|
|
||||||
dlsch0_eNB_harq->rb_alloc[0],
|
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
|
||||||
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
|
|
||||||
dlsch_16qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
sic_buffer,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
|
||||||
num_pdcch_symbols,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
|
|
||||||
dlsch0_eNB_harq->nb_rb,
|
|
||||||
subframe,
|
|
||||||
dlsch0_eNB_harq->rb_alloc[0],
|
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
|
||||||
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
dlsch_64qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
sic_buffer,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
|
||||||
num_pdcch_symbols,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1,
|
|
||||||
dlsch0_eNB_harq->nb_rb,
|
|
||||||
subframe,
|
|
||||||
dlsch0_eNB_harq->rb_alloc[0],
|
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
|
||||||
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
|
||||||
break;
|
|
||||||
}// round
|
|
||||||
|
|
||||||
// write_output("rxdata_llr1.m","llr1", PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0);
|
|
||||||
|
|
||||||
for (cw_sic=cw_to_decode_interf_free; cw_sic<cw_to_decode_interf_free+1;cw_sic++){
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
|
||||||
coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
|
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->nb_rb,
|
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->rb_alloc,
|
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs),
|
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->Nl,
|
|
||||||
num_pdcch_symbols,
|
|
||||||
0,
|
|
||||||
subframe);
|
|
||||||
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->G = coded_bits_per_codeword;
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs);
|
|
||||||
|
|
||||||
if (n_frames==2) {
|
|
||||||
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_sic,coded_bits_per_codeword,
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->TBS);
|
|
||||||
|
|
||||||
// calculate uncoded BER
|
|
||||||
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword);
|
|
||||||
AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
|
|
||||||
sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, cw_sic);
|
|
||||||
sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, cw_sic);
|
|
||||||
write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic],coded_bits_per_codeword,1,0);
|
|
||||||
sprintf(fname,"dlsch_cw%d_e.m", cw_sic);
|
|
||||||
sprintf(vname,"dlschcw%d_e", cw_sic);
|
|
||||||
write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
|
|
||||||
uncoded_ber=0;
|
|
||||||
printf("trials=%d\n", trials);
|
|
||||||
for (i=0;i<coded_bits_per_codeword;i++)
|
|
||||||
if (PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic][i]<0)) {
|
|
||||||
uncoded_ber_bit[i] = 1;
|
|
||||||
uncoded_ber++;
|
|
||||||
} else
|
|
||||||
uncoded_ber_bit[i] = 0;
|
|
||||||
|
|
||||||
uncoded_ber/=coded_bits_per_codeword;
|
|
||||||
avg_ber += uncoded_ber;
|
|
||||||
sprintf(fname,"cw%d_uncoded_ber_bit.m", cw_sic);
|
|
||||||
sprintf(vname,"uncoded_ber_bit_cw%d", cw_sic);
|
|
||||||
write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword,1,0);
|
|
||||||
printf("cw %d, uncoded ber %f\n",cw_sic,uncoded_ber);
|
|
||||||
free(uncoded_ber_bit);
|
|
||||||
uncoded_ber_bit = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
|
||||||
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
|
|
||||||
0,
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic],
|
|
||||||
coded_bits_per_codeword,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic],
|
|
||||||
cw_sic,
|
|
||||||
subframe<<1);
|
|
||||||
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
|
||||||
|
|
||||||
start_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
|
||||||
ret[1] = dlsch_decoding(PHY_vars_UE,
|
|
||||||
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic],
|
|
||||||
&PHY_vars_UE->lte_frame_parms,
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic],
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid],
|
|
||||||
subframe,
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid,
|
|
||||||
1,llr8_flag);
|
|
||||||
stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
|
||||||
|
|
||||||
|
|
||||||
if (ret[1] <= PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations ) { //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations )
|
|
||||||
|
|
||||||
avg_iter[1] += ret[1];
|
|
||||||
iter_trials[1]++;
|
|
||||||
|
|
||||||
|
|
||||||
if (n_frames==2) {
|
|
||||||
printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber);
|
|
||||||
#ifdef PRINT_BYTES
|
|
||||||
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) {
|
|
||||||
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus)
|
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus;
|
|
||||||
else
|
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus;
|
|
||||||
|
|
||||||
Kr_bytes = Kr>>3;
|
|
||||||
|
|
||||||
printf("Decoded_output (Segment %d):\n",s);
|
|
||||||
for (i=0;i<Kr_bytes;i++)
|
|
||||||
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i],
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else {
|
|
||||||
errs[cw_sic][round]++;
|
|
||||||
// exit(0);
|
|
||||||
|
|
||||||
if (cw_sic==1) {
|
|
||||||
avg_iter[1] += ret[1]-1;
|
|
||||||
iter_trials[1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n_frames==2) {
|
|
||||||
//if ((n_frames==1) || (SNR>=30)) {
|
|
||||||
printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber);
|
|
||||||
#ifdef PRINT_BYTES
|
|
||||||
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) {
|
|
||||||
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus)
|
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus;
|
|
||||||
else
|
|
||||||
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus;
|
|
||||||
|
|
||||||
Kr_bytes = Kr>>3;
|
|
||||||
|
|
||||||
printf("Decoded_output (Segment %d):\n",s);
|
|
||||||
for (i=0;i<Kr_bytes;i++)
|
|
||||||
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i],
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} //n_frames==1
|
|
||||||
// exit(0);
|
|
||||||
} //if (ret > PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations )
|
|
||||||
} //for (int cw_1=cw_to_decode_interf_free; cw_1<cw_to_decode_interf_free+1;cw_1++)
|
|
||||||
|
|
||||||
|
dlsch_encoding(input_buffer0[0], //PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
|
||||||
|
&PHY_vars_UE->lte_frame_parms,
|
||||||
|
num_pdcch_symbols,
|
||||||
|
PHY_vars_UE->dlsch_eNB[eNB_id],
|
||||||
|
0,
|
||||||
|
subframe,
|
||||||
|
&PHY_vars_UE->dlsch_rate_matching_stats,
|
||||||
|
&PHY_vars_UE->dlsch_turbo_encoding_stats,
|
||||||
|
&PHY_vars_UE->dlsch_interleaving_stats);
|
||||||
|
|
||||||
|
|
||||||
|
coded_bits_per_codeword = get_G(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb,
|
||||||
|
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc,
|
||||||
|
get_Qm(PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs),
|
||||||
|
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->Nl,
|
||||||
|
num_pdcch_symbols,
|
||||||
|
0,
|
||||||
|
subframe);
|
||||||
|
|
||||||
|
dlsch_scrambling(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
0,
|
||||||
|
PHY_vars_UE->dlsch_eNB[eNB_id],
|
||||||
|
coded_bits_per_codeword,
|
||||||
|
0,
|
||||||
|
subframe<<1);
|
||||||
|
|
||||||
|
re_allocated = dlsch_modulation_SIC(sic_buffer,
|
||||||
|
subframe,
|
||||||
|
&PHY_vars_UE->lte_frame_parms,
|
||||||
|
num_pdcch_symbols,
|
||||||
|
&PHY_vars_UE->dlsch_eNB[0][0],
|
||||||
|
NULL,
|
||||||
|
coded_bits_per_codeword);
|
||||||
|
|
||||||
|
// write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1);
|
||||||
|
// write_output("rxdataF_comp1.m","rxF_comp1", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
|
||||||
|
// write_output("rxdataF_rho.m","rho", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
|
||||||
|
|
||||||
|
switch (get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)){
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
|
||||||
|
dlsch_qpsk_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
sic_buffer,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
||||||
|
num_pdcch_symbols,
|
||||||
|
dlsch0_eNB_harq->nb_rb,
|
||||||
|
subframe,
|
||||||
|
dlsch0_eNB_harq->rb_alloc[0],
|
||||||
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
||||||
|
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
|
||||||
|
dlsch_16qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
sic_buffer,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
||||||
|
num_pdcch_symbols,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
|
||||||
|
dlsch0_eNB_harq->nb_rb,
|
||||||
|
subframe,
|
||||||
|
dlsch0_eNB_harq->rb_alloc[0],
|
||||||
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
||||||
|
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
dlsch_64qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
sic_buffer,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],
|
||||||
|
num_pdcch_symbols,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1,
|
||||||
|
dlsch0_eNB_harq->nb_rb,
|
||||||
|
subframe,
|
||||||
|
dlsch0_eNB_harq->rb_alloc[0],
|
||||||
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
|
||||||
|
PHY_vars_UE->dlsch_ue[eNB_id][0]);
|
||||||
|
break;
|
||||||
|
}// round
|
||||||
|
|
||||||
} //if SIC
|
// write_output("rxdata_llr1.m","llr1", PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0);
|
||||||
|
|
||||||
|
for (cw_sic=cw_to_decode_interf_free; cw_sic<cw_to_decode_interf_free+1;cw_sic++){
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
||||||
|
coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
|
||||||
|
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->nb_rb,
|
||||||
|
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->rb_alloc,
|
||||||
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs),
|
||||||
|
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->Nl,
|
||||||
|
num_pdcch_symbols,
|
||||||
|
0,
|
||||||
|
subframe);
|
||||||
|
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->G = coded_bits_per_codeword;
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs);
|
||||||
|
|
||||||
|
if (n_frames==2) {
|
||||||
|
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_sic,coded_bits_per_codeword,
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->TBS);
|
||||||
|
|
||||||
|
// calculate uncoded BER
|
||||||
|
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword);
|
||||||
|
AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
|
||||||
|
sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, cw_sic);
|
||||||
|
sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, cw_sic);
|
||||||
|
write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic],coded_bits_per_codeword,1,0);
|
||||||
|
sprintf(fname,"dlsch_cw%d_e.m", cw_sic);
|
||||||
|
sprintf(vname,"dlschcw%d_e", cw_sic);
|
||||||
|
write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
|
||||||
|
uncoded_ber=0;
|
||||||
|
printf("trials=%d\n", trials);
|
||||||
|
for (i=0;i<coded_bits_per_codeword;i++)
|
||||||
|
if (PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic][i]<0)) {
|
||||||
|
uncoded_ber_bit[i] = 1;
|
||||||
|
uncoded_ber++;
|
||||||
|
} else
|
||||||
|
uncoded_ber_bit[i] = 0;
|
||||||
|
|
||||||
|
uncoded_ber/=coded_bits_per_codeword;
|
||||||
|
avg_ber += uncoded_ber;
|
||||||
|
sprintf(fname,"cw%d_uncoded_ber_bit.m", cw_sic);
|
||||||
|
sprintf(vname,"uncoded_ber_bit_cw%d", cw_sic);
|
||||||
|
write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword,1,0);
|
||||||
|
printf("cw %d, uncoded ber %f\n",cw_sic,uncoded_ber);
|
||||||
|
free(uncoded_ber_bit);
|
||||||
|
uncoded_ber_bit = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
||||||
|
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
|
||||||
|
0,
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic],
|
||||||
|
coded_bits_per_codeword,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic],
|
||||||
|
cw_sic,
|
||||||
|
subframe<<1);
|
||||||
|
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
|
||||||
|
|
||||||
|
start_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
||||||
|
ret[1] = dlsch_decoding(PHY_vars_UE,
|
||||||
|
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic],
|
||||||
|
&PHY_vars_UE->lte_frame_parms,
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic],
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid],
|
||||||
|
subframe,
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid,
|
||||||
|
1,llr8_flag);
|
||||||
|
stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
|
||||||
|
|
||||||
|
|
||||||
|
if (ret[1] <= PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations ) { //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations )
|
||||||
|
|
||||||
|
avg_iter[1] += ret[1];
|
||||||
|
iter_trials[1]++;
|
||||||
|
|
||||||
|
|
||||||
|
if (n_frames==2) {
|
||||||
|
printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber);
|
||||||
|
#ifdef PRINT_BYTES
|
||||||
|
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) {
|
||||||
|
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus)
|
||||||
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus;
|
||||||
|
else
|
||||||
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus;
|
||||||
|
|
||||||
|
Kr_bytes = Kr>>3;
|
||||||
|
|
||||||
|
printf("Decoded_output (Segment %d):\n",s);
|
||||||
|
for (i=0;i<Kr_bytes;i++)
|
||||||
|
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i],
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
else {
|
||||||
|
errs[cw_sic][round]++;
|
||||||
|
// exit(0);
|
||||||
|
|
||||||
|
if (cw_sic==1) {
|
||||||
|
avg_iter[1] += ret[1]-1;
|
||||||
|
iter_trials[1]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_frames==2) {
|
||||||
|
//if ((n_frames==1) || (SNR>=30)) {
|
||||||
|
printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber);
|
||||||
|
#ifdef PRINT_BYTES
|
||||||
|
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) {
|
||||||
|
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus)
|
||||||
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus;
|
||||||
|
else
|
||||||
|
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus;
|
||||||
|
|
||||||
|
Kr_bytes = Kr>>3;
|
||||||
|
|
||||||
|
printf("Decoded_output (Segment %d):\n",s);
|
||||||
|
for (i=0;i<Kr_bytes;i++)
|
||||||
|
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i],
|
||||||
|
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} //n_frames==1
|
||||||
|
// exit(0);
|
||||||
|
} //if (ret > PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations )
|
||||||
|
} //for (int cw_1=cw_to_decode_interf_free; cw_1<cw_to_decode_interf_free+1;cw_1++)
|
||||||
|
|
||||||
|
|
||||||
|
} //if SIC
|
||||||
|
|
||||||
|
|
||||||
} //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations )
|
} //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations )
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
struct complex** R_sqrt,
|
struct complex** R_sqrt,
|
||||||
double Td,
|
double Td,
|
||||||
double sampling_rate,
|
double sampling_rate,
|
||||||
double channel_bandwidth,
|
double channel_bandwidth,
|
||||||
double ricean_factor,
|
double ricean_factor,
|
||||||
double aoa,
|
double aoa,
|
||||||
double forgetting_factor,
|
double forgetting_factor,
|
||||||
@@ -81,7 +81,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
|
|||||||
chan_desc->delays[i] = ((double)i)*delta_tau;
|
chan_desc->delays[i] = ((double)i)*delta_tau;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
chan_desc->delays = delays;
|
chan_desc->delays = delays;
|
||||||
chan_desc->Td = Td;
|
chan_desc->Td = Td;
|
||||||
chan_desc->sampling_rate = sampling_rate;
|
chan_desc->sampling_rate = sampling_rate;
|
||||||
chan_desc->channel_bandwidth = channel_bandwidth;
|
chan_desc->channel_bandwidth = channel_bandwidth;
|
||||||
|
|||||||
Reference in New Issue
Block a user