Commit b44e15fd authored by yilmazt's avatar yilmazt

More warning removals but nr_dlschsim still not working

parent 86531d2e
Branches unavailable
2023.w22 2023.w21 2023.w20 2023.w19 2023.w18 2023.w18b 2023.w16 2023.w15 2023.w14 2023.w13 2023.w12 2023.w11 2023.w11b 2023.w10 2023.w10b 2023.w09 2023.w08 2023.w08b 2023.w07 2023.w06 2023.w05 2023.w03 2023.w02 2022.42 2022.41 2022.w51 2022.w50 2022.w49 2022.w48 2022.w47 2022.w46 2022.w45 2022.w43 2022.w42 2022.w42b 2022.w41 2022.w40 2022.w39 2022.w38 2022.w37 2022.w37b 2022.w36 2022.w35 2022.w33 2022.w32 2022.w31 2022.w31b 2022.w30 2022.w29 2022.w26 2022.w25 2022.w24 2022.w24b 2022.w23 2022.w22 2022.w21 2022.w20 2022.w19 2022.w18 2022.w17 2022.w15 2022.w15b 2022.w14a 2022.w13 2022.w13b 2022.w13a 2022.w12 2022.w10 2022.w09 2022.w09b 2022.w08 2022.w08b 2022.w07 2022.w07b 2022.w06 2022.w06a 2022.w05 2022.w05b 2022.w03_hotfix 2022.w03_b 2022.w02 2022.w01 2021.wk46 2021.wk14_a 2021.wk13_d 2021.wk13_c 2021.w51_c 2021.w51_a 2021.w50_a 2021.w49_b 2021.w49_a 2021.w48 2021.w47 2021.w46 2021.w46-powder 2021.w45 2021.w45_b 2021.w44 2021.w43 2021.w42 2021.w37 2021.w36 2021.w35 2021.w34 2021.w33 2021.w32 2021.w31 2021.w30 2021.w29 2021.w28 2021.w27 2021.w26 2021.w25 2021.w24 2021.w23 2021.w22 2021.w20 2021.w19 2021.w18_b 2021.w18_a 2021.w17_b 2021.w16 2021.w15 2021.w14 2021.w13_a 2021.w12 2021.w11 2021.w10 2021.w09 2021.w08 2021.w06 2021.w05 2021.w04 2021.w02 2020.w51_2 2020.w51 2020.w50 2020.w49 2020.w48_2 2020.w48 2020.w47 2020.w46_2 2020.w46 2020.w45_2 2020.w45 2020.w44 2020.w42_2 2020.w42 2020.w41 2020.w39 2020.w38 2020.w37 2020.w36 2020.w34 2020.w33 2020.w31 2020.w30 2020.w29 2020.w28 2020.w26 2020.w25 2020.w24 2020.w23 2020.w22 2020.w19 2020.w17 2020.w16 2020.w15 2020.w11 2020.w09 2020.w06 2020.w05 2020.w04 2020.w03 setparam nr-ip-over-lte nr-ip-over-lte-v.1.5 nr-ip-over-lte-v.1.4 nr-ip-over-lte-v.1.3 nr-ip-over-lte-v.1.2 nr-ip-over-lte-v.1.1 nr-ip-over-lte-v.1.0 flexran-eol develop-nr-pdcch develop-nr-2020w03 develop-nr-2020w02 develop-nr-2019w51 develop-nr-2019w50 develop-nr-2019w48 develop-nr-2019w47 develop-nr-2019w45 develop-nr-2019w43 develop-nr-2019w42 develop-nr-2019w40 develop-nr-2019w28 develop-nr-2019w23 benetel_phase_rotation benetel_gnb_rel_2.0 benetel_gnb_rel_1.0 benetel_enb_rel_2.0 benetel_enb_rel_1.0
No related merge requests found
...@@ -387,6 +387,8 @@ unsigned int crc12 (unsigned char * inptr, int bitlen); ...@@ -387,6 +387,8 @@ unsigned int crc12 (unsigned char * inptr, int bitlen);
@param inPtr Pointer to input byte stream @param inPtr Pointer to input byte stream
@param bitlen length of inputs in bits*/ @param bitlen length of inputs in bits*/
unsigned int crc8 (unsigned char * inptr, int bitlen); unsigned int crc8 (unsigned char * inptr, int bitlen);
int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type);
/*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback) /*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback)
\brief This routine performs a SIMD optmized Viterbi decoder for the 802.11 64-state convolutional code. It can be \brief This routine performs a SIMD optmized Viterbi decoder for the 802.11 64-state convolutional code. It can be
...@@ -441,8 +443,6 @@ int32_t rate_matching_lte(uint32_t N_coded, ...@@ -441,8 +443,6 @@ int32_t rate_matching_lte(uint32_t N_coded,
uint8_t *inPtr, uint8_t *inPtr,
uint32_t off); uint32_t off);
void crcTableInit (void);
unsigned int crcbit (unsigned char * inputptr, int octetlen, unsigned int poly); unsigned int crcbit (unsigned char * inputptr, int octetlen, unsigned int poly);
int16_t reverseBits(int32_t ,int32_t); int16_t reverseBits(int32_t ,int32_t);
......
...@@ -201,7 +201,7 @@ void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,sho ...@@ -201,7 +201,7 @@ 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,short BG,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,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
{ {
short Zc,Kb,nrows,ncols; short Zc,Kb=0,nrows=0,ncols=0;
int i,i1; int i,i1;
int no_punctured_columns,removed_bit; int no_punctured_columns,removed_bit;
...@@ -320,7 +320,7 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh ...@@ -320,7 +320,7 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
{ {
short Zc,Kb,nrows,ncols; short Zc,Kb=0,nrows=0,ncols=0;
int i,i1,j; 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
...@@ -520,7 +520,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i ...@@ -520,7 +520,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **channel_input,short block_length, short BG, int n_segments,unsigned int macro_num, time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput) int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **channel_input,short block_length, short BG, int n_segments,unsigned int macro_num, time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
{ {
short Zc,Kb,nrows,ncols; short Zc,Kb=0,nrows=0,ncols=0;
int i,i1,j; 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
......
...@@ -444,6 +444,9 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho ...@@ -444,6 +444,9 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho
no_shift_values=(short *) no_shift_values_BG2; no_shift_values=(short *) no_shift_values_BG2;
pointer_shift_values=(short *) pointer_shift_values_BG2; pointer_shift_values=(short *) pointer_shift_values_BG2;
} }
else {
AssertFatal(0,"BG %d is not supported yet\n",BG);
}
no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*3)/Zc; no_punctured_columns=(int)((nrows-2)*Zc+block_length-block_length*3)/Zc;
removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(block_length*3); removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(block_length*3);
......
...@@ -1119,7 +1119,7 @@ uint32_t polar_decoder_int16(int16_t *input, ...@@ -1119,7 +1119,7 @@ uint32_t polar_decoder_int16(int16_t *input,
int len=polarParams->payloadBits; int len=polarParams->payloadBits;
int len_mod64=len&63; //int len_mod64=len&63;
int crclen = polarParams->crcParityBits; int crclen = polarParams->crcParityBits;
uint64_t rxcrc=B[0]&((1<<crclen)-1); uint64_t rxcrc=B[0]&((1<<crclen)-1);
uint32_t crc; uint32_t crc;
......
...@@ -402,7 +402,7 @@ void polar_encoder_fast(uint64_t *A, ...@@ -402,7 +402,7 @@ void polar_encoder_fast(uint64_t *A,
AssertFatal(bitlen<129,"support for payloads <= 128 bits\n"); AssertFatal(bitlen<129,"support for payloads <= 128 bits\n");
AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n"); AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n");
int bitlen0=bitlen; //int bitlen0=bitlen;
uint64_t tcrc=0; uint64_t tcrc=0;
......
...@@ -78,7 +78,7 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, ...@@ -78,7 +78,7 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
{ {
uint8_t Cprime; uint8_t Cprime;
uint32_t Ncb,E,ind,k,Nref,N; uint32_t Ncb,E,ind,k,Nref,N;
uint8_t *e2; //uint8_t *e2;
AssertFatal(Nl>0,"Nl is 0\n"); AssertFatal(Nl>0,"Nl is 0\n");
AssertFatal(Qm>0,"Qm is 0\n"); AssertFatal(Qm>0,"Qm is 0\n");
...@@ -110,7 +110,7 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, ...@@ -110,7 +110,7 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
printf("nr_rate_matching: E %d, k0 %d Cprime %d modcprime %d\n",E,ind, Cprime,((G/(Nl*Qm))%Cprime)); printf("nr_rate_matching: E %d, k0 %d Cprime %d modcprime %d\n",E,ind, Cprime,((G/(Nl*Qm))%Cprime));
#endif #endif
e2 = e; //e2 = e;
k=0; k=0;
...@@ -120,7 +120,8 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, ...@@ -120,7 +120,8 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]); printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]);
#endif #endif
if (w[ind] != NR_NULL) e2[k++]=w[ind]; //if (w[ind] != NR_NULL) e2[k++]=w[ind];
if (w[ind] != NR_NULL) e[k++]=w[ind];
} }
while(k<E) { while(k<E) {
...@@ -130,7 +131,8 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm, ...@@ -130,7 +131,8 @@ uint32_t nr_rate_matching_ldpc(uint8_t Ilbrm,
printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]); printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]);
#endif #endif
if (w[ind] != NR_NULL) e2[k++]=w[ind]; //if (w[ind] != NR_NULL) e2[k++]=w[ind];
if (w[ind] != NR_NULL) e[k++]=w[ind];
} }
} }
......
...@@ -314,8 +314,8 @@ void phy_config_request(PHY_Config_t *phy_config) { ...@@ -314,8 +314,8 @@ void phy_config_request(PHY_Config_t *phy_config) {
void phy_free_nr_gNB(PHY_VARS_gNB *gNB) void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
{ {
// NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms; //NR_DL_FRAME_PARMS* const fp = &gNB->frame_parms;
nfapi_nr_config_request_t *cfg = &gNB->gNB_config; //nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
NR_gNB_COMMON* const common_vars = &gNB->common_vars; NR_gNB_COMMON* const common_vars = &gNB->common_vars;
LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars; LTE_eNB_PUSCH** const pusch_vars = gNB->pusch_vars;
LTE_eNB_SRS* const srs_vars = gNB->srs_vars; LTE_eNB_SRS* const srs_vars = gNB->srs_vars;
......
...@@ -170,7 +170,7 @@ uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars, ...@@ -170,7 +170,7 @@ uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars,
int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1]; // 3 for the max coreset duration int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1]; // 3 for the max coreset duration
uint8_t idx=0; uint8_t idx=0;
uint16_t a; //uint16_t a;
int k,l,k_prime,dci_idx, dmrs_idx; int k,l,k_prime,dci_idx, dmrs_idx;
nr_cce_t cce; nr_cce_t cce;
nr_reg_t reg; nr_reg_t reg;
......
...@@ -379,7 +379,8 @@ int nr_dlsch_encoding(unsigned char *a, ...@@ -379,7 +379,8 @@ int nr_dlsch_encoding(unsigned char *a,
} }
printf("\n");*/ printf("\n");*/
ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
//stop_meas(te_stats); //stop_meas(te_stats);
//printf("end ldpc encoder -- output\n"); //printf("end ldpc encoder -- output\n");
......
...@@ -53,7 +53,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, ...@@ -53,7 +53,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
NR_DL_FRAME_PARMS *frame_parms) NR_DL_FRAME_PARMS *frame_parms)
{ {
int k,l; int k,l;
int16_t a; //int16_t a;
int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1]; int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1];
uint8_t idx=0; uint8_t idx=0;
uint8_t nushift = config->sch_config.physical_cell_id.value &3; uint8_t nushift = config->sch_config.physical_cell_id.value &3;
...@@ -240,7 +240,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, ...@@ -240,7 +240,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
{ {
int k,l,m; int k,l,m;
int16_t a; //int16_t a;
int16_t mod_pbch_e[NR_POLAR_PBCH_E]; int16_t mod_pbch_e[NR_POLAR_PBCH_E];
uint8_t idx=0; uint8_t idx=0;
uint16_t M; uint16_t M;
......
...@@ -33,7 +33,7 @@ int nr_generate_sss( int16_t *d_sss, ...@@ -33,7 +33,7 @@ int nr_generate_sss( int16_t *d_sss,
int i,k,l; int i,k,l;
int m0, m1; int m0, m1;
int Nid, Nid1, Nid2; int Nid, Nid1, Nid2;
int16_t a; //int16_t a;
int16_t x0[NR_SSS_LENGTH], x1[NR_SSS_LENGTH]; int16_t x0[NR_SSS_LENGTH], x1[NR_SSS_LENGTH];
const int x0_initial[7] = { 1, 0, 0, 0, 0, 0, 0 }; const int x0_initial[7] = { 1, 0, 0, 0, 0, 0, 0 };
const int x1_initial[7] = { 1, 0, 0, 0, 0, 0, 0 }; const int x1_initial[7] = { 1, 0, 0, 0, 0, 0, 0 };
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "PHY/CODING/coding_extern.h" #include "PHY/CODING/coding_extern.h"
#include "PHY/CODING/coding_defs.h" #include "PHY/CODING/coding_defs.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h"
#include "SCHED_NR_UE/defs.h" #include "SCHED_NR_UE/defs.h"
#include "SIMULATION/TOOLS/sim.h" #include "SIMULATION/TOOLS/sim.h"
...@@ -190,7 +191,7 @@ void nr_dlsch_unscrambling(int16_t* llr, ...@@ -190,7 +191,7 @@ void nr_dlsch_unscrambling(int16_t* llr,
} }
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
short *dlsch_llr, short *dlsch_llr,
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t *dlsch, NR_UE_DLSCH_t *dlsch,
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
//#include "PHY/defs_nr_common.h" //#include "PHY/defs_nr_common.h"
#include "PHY/defs_nr_UE.h" #include "PHY/defs_nr_UE.h"
#include "PHY/NR_UE_TRANSPORT/nr_prach.h" #include "PHY/NR_UE_TRANSPORT/nr_prach.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
//#include "PHY/extern.h" //#include "PHY/extern.h"
//#include "LAYER2/MAC/extern.h" //#include "LAYER2/MAC/extern.h"
//#include "PHY/NR_UE_TRANSPORT/pucch_nr.h" //#include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
...@@ -582,7 +583,7 @@ int32_t generate_nr_prach( PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t subframe, ...@@ -582,7 +583,7 @@ int32_t generate_nr_prach( PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t subframe,
int16_t amp = ue->prach_vars[eNB_id]->amp; int16_t amp = ue->prach_vars[eNB_id]->amp;
int16_t Ncp; int16_t Ncp;
uint8_t n_ra_prb; uint8_t n_ra_prb;
uint16_t NCS; uint16_t NCS=0;
uint16_t *prach_root_sequence_map; uint16_t *prach_root_sequence_map;
uint16_t preamble_offset,preamble_shift; uint16_t preamble_offset,preamble_shift;
uint16_t preamble_index0,n_shift_ra,n_shift_ra_bar; uint16_t preamble_index0,n_shift_ra,n_shift_ra_bar;
...@@ -599,7 +600,7 @@ int32_t generate_nr_prach( PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t subframe, ...@@ -599,7 +600,7 @@ int32_t generate_nr_prach( PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t subframe,
int32_t Xu_re,Xu_im; int32_t Xu_re,Xu_im;
uint16_t offset,offset2; uint16_t offset,offset2;
int prach_start; int prach_start;
int i, prach_len; int i, prach_len=0;
uint16_t first_nonzero_root_idx=0; uint16_t first_nonzero_root_idx=0;
#if defined(EXMIMO) || defined(OAI_USRP) #if defined(EXMIMO) || defined(OAI_USRP)
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
//#include "PHY/extern.h" //#include "PHY/extern.h"
//#include "LAYER2/MAC/extern.h" //#include "LAYER2/MAC/extern.h"
#include "PHY/NR_UE_TRANSPORT/pucch_nr.h" #include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "common/utils/LOG/log.h" #include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h" #include "common/utils/LOG/vcd_signal_dumper.h"
...@@ -129,7 +130,7 @@ double nr_cyclic_shift_hopping(PHY_VARS_NR_UE *ue, ...@@ -129,7 +130,7 @@ double nr_cyclic_shift_hopping(PHY_VARS_NR_UE *ue,
*/ */
// alpha_init initialized to 2*PI/12=0.5235987756 // alpha_init initialized to 2*PI/12=0.5235987756
double alpha = 0.5235987756; double alpha = 0.5235987756;
uint16_t c_init = ue->pucch_config_common_nr->hoppingId; // we initialize c_init again to calculate n_cs uint32_t c_init = ue->pucch_config_common_nr->hoppingId; // we initialize c_init again to calculate n_cs
#ifdef DEBUG_NR_PUCCH_TX #ifdef DEBUG_NR_PUCCH_TX
// initialization to be removed // initialization to be removed
...@@ -236,8 +237,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue, ...@@ -236,8 +237,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
/* /*
* Implementing TS 38.211 Subclause 6.3.2.3.2 Mapping to physical resources FIXME! * Implementing TS 38.211 Subclause 6.3.2.3.2 Mapping to physical resources FIXME!
*/ */
int32_t *txptr; //int32_t *txptr;
uint32_t re_offset; uint32_t re_offset=0;
for (int l=0; l<nrofSymbols; l++) { for (int l=0; l<nrofSymbols; l++) {
if ((startingPRB < (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 0)) { // if number RBs in bandwidth is even and current PRB is lower band if ((startingPRB < (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 0)) { // if number RBs in bandwidth is even and current PRB is lower band
re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*startingPRB) + frame_parms->first_carrier_offset; re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*startingPRB) + frame_parms->first_carrier_offset;
...@@ -254,7 +255,7 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue, ...@@ -254,7 +255,7 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
if ((startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { // if number RBs in bandwidth is odd and current PRB contains DC if ((startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { // if number RBs in bandwidth is odd and current PRB contains DC
re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*startingPRB) + frame_parms->first_carrier_offset; re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*startingPRB) + frame_parms->first_carrier_offset;
} }
txptr = &txdataF[0][re_offset]; //txptr = &txdataF[0][re_offset];
for (int n=0; n<12; n++){ for (int n=0; n<12; n++){
if ((n==6) && (startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { if ((n==6) && (startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) {
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB) // if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
...@@ -299,7 +300,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue, ...@@ -299,7 +300,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
* *
*/ */
// complex-valued symbol d_re, d_im containing complex-valued symbol d(0): // complex-valued symbol d_re, d_im containing complex-valued symbol d(0):
int16_t d_re, d_im; int16_t d_re=0, d_im=0;
if (nr_bit == 1) { // using BPSK if M_bit=1 according to TC 38.211 Subclause 5.1.2 if (nr_bit == 1) { // using BPSK if M_bit=1 according to TC 38.211 Subclause 5.1.2
d_re = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15); d_re = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15);
d_im = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15); d_im = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15);
...@@ -371,8 +372,8 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue, ...@@ -371,8 +372,8 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
/* /*
* Implementing TS 38.211 Subclause 6.3.2.4.2 Mapping to physical resources * Implementing TS 38.211 Subclause 6.3.2.4.2 Mapping to physical resources
*/ */
int32_t *txptr; //int32_t *txptr;
uint32_t re_offset; uint32_t re_offset=0;
int i=0; int i=0;
#define MAX_SIZE_Z 168 // this value has to be calculated from mprime*12*table_6_3_2_4_1_1_N_SF_mprime_PUCCH_1_noHop[pucch_symbol_length]+m*12+n #define MAX_SIZE_Z 168 // this value has to be calculated from mprime*12*table_6_3_2_4_1_1_N_SF_mprime_PUCCH_1_noHop[pucch_symbol_length]+m*12+n
int16_t z_re[MAX_SIZE_Z],z_im[MAX_SIZE_Z]; int16_t z_re[MAX_SIZE_Z],z_im[MAX_SIZE_Z];
...@@ -552,7 +553,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue, ...@@ -552,7 +553,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
} }
txptr = &txdataF[0][re_offset]; //txptr = &txdataF[0][re_offset];
for (int n=0; n<12; n++){ for (int n=0; n<12; n++){
if ((n==6) && (startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { if ((n==6) && (startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) {
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB) // if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
...@@ -904,7 +905,7 @@ void nr_uci_encoding(uint64_t payload, ...@@ -904,7 +905,7 @@ void nr_uci_encoding(uint64_t payload,
// L is the CRC size // L is the CRC size
uint8_t L; uint8_t L;
// E is the rate matching output sequence length as given in TS 38.212 subclause 6.3.1.4.1 // E is the rate matching output sequence length as given in TS 38.212 subclause 6.3.1.4.1
uint16_t E,E_init; uint16_t E=0,E_init;
if (fmt == pucch_format2_nr) E = 16*nrofSymbols*nrofPRB; if (fmt == pucch_format2_nr) E = 16*nrofSymbols*nrofPRB;
if (fmt == pucch_format3_nr){ if (fmt == pucch_format3_nr){
E_init = (is_pi_over_2_bpsk_enabled == 0) ? 24:12; E_init = (is_pi_over_2_bpsk_enabled == 0) ? 24:12;
...@@ -1061,8 +1062,8 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue, ...@@ -1061,8 +1062,8 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
/* /*
* Implementing TS 38.211 Subclause 6.3.2.5.3 Mapping to physical resources * Implementing TS 38.211 Subclause 6.3.2.5.3 Mapping to physical resources
*/ */
int32_t *txptr; //int32_t *txptr;
uint32_t re_offset; uint32_t re_offset=0;
uint32_t x1, x2, s=0; uint32_t x1, x2, s=0;
int i=0; int i=0;
int m=0; int m=0;
...@@ -1086,7 +1087,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue, ...@@ -1086,7 +1087,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
if (((rb+startingPRB) == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { // if number RBs in bandwidth is odd and current PRB contains DC if (((rb+startingPRB) == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { // if number RBs in bandwidth is odd and current PRB contains DC
re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*(rb+startingPRB)) + frame_parms->first_carrier_offset; re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*(rb+startingPRB)) + frame_parms->first_carrier_offset;
} }
txptr = &txdataF[0][re_offset]; //txptr = &txdataF[0][re_offset];
int k=0; int k=0;
int kk=0; int kk=0;
for (int n=0; n<12; n++){ for (int n=0; n<12; n++){
...@@ -1408,8 +1409,8 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue, ...@@ -1408,8 +1409,8 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
//int16_t *r_u_v_alpha_delta_im = malloc(sizeof(int16_t)*12*nrofPRB); //int16_t *r_u_v_alpha_delta_im = malloc(sizeof(int16_t)*12*nrofPRB);
// Next we proceed to mapping to physical resources according to TS 38.211, subclause 6.3.2.6.5 dor PUCCH formats 3 and 4 and subclause 6.4.1.3.3.2 for DM-RS // Next we proceed to mapping to physical resources according to TS 38.211, subclause 6.3.2.6.5 dor PUCCH formats 3 and 4 and subclause 6.4.1.3.3.2 for DM-RS
int32_t *txptr; //int32_t *txptr;
uint32_t re_offset; uint32_t re_offset=0;
//uint32_t x1, x2, s=0; //uint32_t x1, x2, s=0;
// intraSlotFrequencyHopping // intraSlotFrequencyHopping
// uint8_t intraSlotFrequencyHopping = 0; // uint8_t intraSlotFrequencyHopping = 0;
...@@ -1513,7 +1514,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue, ...@@ -1513,7 +1514,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
#ifdef DEBUG_NR_PUCCH_TX #ifdef DEBUG_NR_PUCCH_TX
printf("re_offset=%d,(rb+startingPRB)=%d\n",re_offset,(rb+startingPRB)); printf("re_offset=%d,(rb+startingPRB)=%d\n",re_offset,(rb+startingPRB));
#endif #endif
txptr = &txdataF[0][re_offset]; //txptr = &txdataF[0][re_offset];
for (int n=0; n<12; n++){ for (int n=0; n<12; n++){
if ((n==6) && ((rb+startingPRB) == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) { if ((n==6) && ((rb+startingPRB) == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) {
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB) // if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
......
...@@ -36,14 +36,14 @@ ...@@ -36,14 +36,14 @@
#include "PHY/defs_nr_common.h" #include "PHY/defs_nr_common.h"
#include "PHY/defs_nr_UE.h" #include "PHY/defs_nr_UE.h"
#include "PHY/defs_gNB.h" #include "PHY/defs_gNB.h"
#include "PHY/INIT/phy_init.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h"
#include "PHY/NR_REFSIG/nr_mod_table.h" #include "PHY/NR_REFSIG/nr_mod_table.h"
#include "PHY/MODULATION/modulation_eNB.h" #include "PHY/MODULATION/modulation_eNB.h"
#include "PHY/MODULATION/modulation_UE.h" #include "PHY/MODULATION/modulation_UE.h"
#include "PHY/INIT/phy_init.h"
#include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_transport.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
#include "SCHED_NR/sched_nr.h" #include "SCHED_NR/sched_nr.h"
...@@ -52,627 +52,617 @@ ...@@ -52,627 +52,617 @@
//#include "UTIL/LISTS/list.h" //#include "UTIL/LISTS/list.h"
//#include "common/ran_context.h" //#include "common/ran_context.h"
//#define DEBUG_DLSCHSIM
PHY_VARS_gNB *gNB; PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE; PHY_VARS_NR_UE *UE;
RAN_CONTEXT_t RC; RAN_CONTEXT_t RC;
double cpuf; double cpuf;
// dummy functions // dummy functions
int nfapi_mode=0; int nfapi_mode = 0;
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
return(0); return (0);
} }
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) {
return(0); return (0);
} }
int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
return(0); return (0);
} }
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
return(0); return (0);
} }
int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) { int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) {
return(0); return (0);
} }
uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_earfcn) { uint32_t from_nrarfcn(int nr_bandP, uint32_t dl_earfcn) {
return(0); return (0);
} }
int32_t get_uldl_offset(int eutra_bandP) { int32_t get_uldl_offset(int eutra_bandP) {
return(0); return (0);
} }
NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { NR_IF_Module_t *
return(NULL); NR_IF_Module_init(int Mod_id) {
return (NULL);
} }
void exit_function(const char *file, const char *function, const int line,const char *s) { void exit_function(const char *file, const char *function, const int line,
const char *msg= s==NULL ? "no comment": s; const char *s) {
printf("Exiting at: %s:%d %s(), %s\n", file, line, function, msg); const char *msg = s == NULL ? "no comment" : s;
exit(-1); printf("Exiting at: %s:%d %s(), %s\n", file, line, function, msg);
exit(-1);
} }
// needed for some functions // needed for some functions
PHY_VARS_NR_UE *PHY_vars_UE_g[1][1]= {{NULL}}; PHY_VARS_NR_UE *PHY_vars_UE_g[1][1] = { { NULL } };
uint16_t n_rnti=0x1234; uint16_t n_rnti = 0x1234;
char quantize(double D,double x,unsigned char B) { char quantize(double D, double x, unsigned char B) {
double qxd; double qxd;
short maxlev; short maxlev;
qxd = floor(x/D); qxd = floor(x / D);
maxlev = 1<<(B-1);//(char)(pow(2,B-1)); maxlev = 1 << (B - 1); //(char)(pow(2,B-1));
//printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev); //printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev);
if (qxd <= -maxlev) if (qxd <= -maxlev)
qxd = -maxlev; qxd = -maxlev;
else if (qxd >= maxlev) else if (qxd >= maxlev)
qxd = maxlev-1; qxd = maxlev - 1;
return((char)qxd); return ((char) qxd);
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
char c; char c;
int i; //,j,l,aa; int i; //,j,l,aa;
double SNR,SNR_lin,snr0=-2.0,snr1=2.0; double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0;
double snr_step = 0.1; double snr_step = 0.1;
uint8_t snr1set=0; uint8_t snr1set = 0;
int **txdata; int **txdata;
double **s_re,**s_im,**r_re,**r_im; double **s_re, **s_im, **r_re, **r_im;
// int sync_pos, sync_pos_slot; // int sync_pos, sync_pos_slot;
// FILE *rx_frame_file; // FILE *rx_frame_file;
FILE *output_fd = NULL; FILE *output_fd = NULL;
uint8_t write_output_file=0; uint8_t write_output_file = 0;
// int subframe_offset; // int subframe_offset;
// char fname[40], vname[40]; // char fname[40], vname[40];
int trial,n_trials=1,n_errors=0,n_false_positive=0; int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1, n_tx = 1, n_rx = 1;
uint16_t Nid_cell=0; uint16_t Nid_cell = 0;
channel_desc_t *gNB2UE; channel_desc_t *gNB2UE;
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag = 0;
int8_t interf1=-21,interf2=-21; int8_t interf1 = -21, interf2 = -21;
FILE *input_fd=NULL,*pbch_file_fd=NULL; FILE *input_fd = NULL, *pbch_file_fd = NULL;
//char input_val_str[50],input_val_str2[50]; //char input_val_str[50],input_val_str2[50];
//uint16_t NB_RB=25; //uint16_t NB_RB=25;
SCM_t channel_model=AWGN;//Rayleigh1_anticorr; SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
uint8_t N_RB_DL=106,mu=1; uint8_t N_RB_DL = 106, mu = 1;
unsigned char frame_type = 0; unsigned char frame_type = 0;
unsigned char pbch_phase = 0; unsigned char pbch_phase = 0;
int frame=0,subframe=0; int frame = 0, subframe = 0;
int frame_length_complex_samples; int frame_length_complex_samples;
//int frame_length_complex_samples_no_prefix; //int frame_length_complex_samples_no_prefix;
NR_DL_FRAME_PARMS *frame_parms; NR_DL_FRAME_PARMS *frame_parms;
//nfapi_nr_config_request_t *gNB_config; //nfapi_nr_config_request_t *gNB_config;
uint8_t Kmimo=0; uint8_t Kmimo = 0;
uint32_t Nsoft=0; uint32_t Nsoft = 0;
double sigma; double sigma;
unsigned char qbits=8; unsigned char qbits = 8;
int ret; int ret;
//int run_initial_sync=0; //int run_initial_sync=0;
int loglvl=OAILOG_WARNING; int loglvl = OAILOG_WARNING;
float target_error_rate = 0.01; float target_error_rate = 0.01;
uint16_t nb_symb_sch =12; uint16_t nb_symb_sch = 12;
uint16_t nb_rb = 50; uint16_t nb_rb = 50;
uint8_t Imcs=9; uint8_t Imcs = 9;
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
if ( load_configmodule(argc,argv) == 0) { if (load_configmodule(argc, argv) == 0) {
exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
} }
//logInit(); //logInit();
randominit(0); randominit(0);
while ((c = getopt (argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:N:F:R:P:")) != -1) { while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:N:F:R:P:")) != -1) {
switch (c) { switch (c) {
case 'f': case 'f':
write_output_file=1; write_output_file = 1;
output_fd = fopen(optarg,"w"); output_fd = fopen(optarg, "w");
if (output_fd==NULL) { if (output_fd == NULL) {
printf("Error opening %s\n",optarg); printf("Error opening %s\n", optarg);
exit(-1); exit(-1);
} }
break; break;
case 'd': case 'd':
frame_type = 1; frame_type = 1;
break; break;
case 'g': case 'g':
switch((char)*optarg) { switch ((char) *optarg) {
case 'A': case 'A':
channel_model=SCM_A; channel_model = SCM_A;
break; break;
case 'B': case 'B':
channel_model=SCM_B; channel_model = SCM_B;
break; break;
case 'C': case 'C':
channel_model=SCM_C; channel_model = SCM_C;
break; break;
case 'D': case 'D':
channel_model=SCM_D; channel_model = SCM_D;
break; break;
case 'E': case 'E':
channel_model=EPA; channel_model = EPA;
break; break;
case 'F': case 'F':
channel_model=EVA; channel_model = EVA;
break; break;
case 'G': case 'G':
channel_model=ETU; channel_model = ETU;
break; break;
default: default:
msg("Unsupported channel model!\n"); msg("Unsupported channel model!\n");
exit(-1); exit(-1);
} }
break; break;
case 'i': case 'i':
interf1=atoi(optarg); interf1 = atoi(optarg);
break; break;
case 'j': case 'j':
interf2=atoi(optarg); interf2 = atoi(optarg);
break; break;
case 'n': case 'n':
n_trials = atoi(optarg); n_trials = atoi(optarg);
break; break;
case 's': case 's':
snr0 = atof(optarg); snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0); msg("Setting SNR0 to %f\n", snr0);
break; break;
case 'S': case 'S':
snr1 = atof(optarg); snr1 = atof(optarg);
snr1set=1; snr1set = 1;
msg("Setting SNR1 to %f\n",snr1); msg("Setting SNR1 to %f\n", snr1);
break; break;
case 'p': case 'p':
extended_prefix_flag=1; extended_prefix_flag = 1;
break; break;
/* /*
case 'r': case 'r':
ricean_factor = pow(10,-.1*atof(optarg)); ricean_factor = pow(10,-.1*atof(optarg));
if (ricean_factor>1) { if (ricean_factor>1) {
printf("Ricean factor must be between 0 and 1\n"); printf("Ricean factor must be between 0 and 1\n");
exit(-1); exit(-1);
} }
break; break;
*/ */
case 'y': case 'y':
n_tx=atoi(optarg); n_tx = atoi(optarg);
if ((n_tx==0) || (n_tx>2)) { if ((n_tx == 0) || (n_tx > 2)) {
msg("Unsupported number of tx antennas %d\n",n_tx); msg("Unsupported number of tx antennas %d\n", n_tx);
exit(-1); exit(-1);
} }
break; break;
case 'z': case 'z':
n_rx=atoi(optarg); n_rx = atoi(optarg);
if ((n_rx==0) || (n_rx>2)) { if ((n_rx == 0) || (n_rx > 2)) {
msg("Unsupported number of rx antennas %d\n",n_rx); msg("Unsupported number of rx antennas %d\n", n_rx);
exit(-1); exit(-1);
} }
break; break;
case 'N': case 'N':
Nid_cell = atoi(optarg); Nid_cell = atoi(optarg);
break; break;
case 'R': case 'R':
N_RB_DL = atoi(optarg); N_RB_DL = atoi(optarg);
break; break;
case 'F': case 'F':
input_fd = fopen(optarg,"r"); input_fd = fopen(optarg, "r");
if (input_fd==NULL) { if (input_fd == NULL) {
printf("Problem with filename %s\n",optarg); printf("Problem with filename %s\n", optarg);
exit(-1); exit(-1);
} }
break; break;
case 'P': case 'P':
pbch_phase = atoi(optarg); pbch_phase = atoi(optarg);
if (pbch_phase>3) if (pbch_phase > 3)
printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); printf("Illegal PBCH phase (0-3) got %d\n", pbch_phase);
break; break;
case 'm': case 'm':
Imcs = atoi(optarg); Imcs = atoi(optarg);
break; break;
case 'l': case 'l':
nb_symb_sch = atoi(optarg); nb_symb_sch = atoi(optarg);
break; break;
case 'r': case 'r':
nb_rb = atoi(optarg); nb_rb = atoi(optarg);
break; break;
case 'x': case 'x':
transmission_mode = atoi(optarg); transmission_mode = atoi(optarg);
break; break;
default: default:
case 'h': case 'h':
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
argv[0]); printf("-h This message\n");
printf("-h This message\n"); printf("-p Use extended prefix mode\n");
printf("-p Use extended prefix mode\n"); printf("-d Use TDD\n");
printf("-d Use TDD\n"); printf("-n Number of frames to simulate\n");
printf("-n Number of frames to simulate\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-t Delay spread for multipath channel\n");
printf("-t Delay spread for multipath channel\n"); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-y Number of TX antennas used in eNB\n");
printf("-y Number of TX antennas used in eNB\n"); printf("-z Number of RX antennas used in UE\n");
printf("-z Number of RX antennas used in UE\n"); printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-N Nid_cell\n");
printf("-N Nid_cell\n"); printf("-R N_RB_DL\n");
printf("-R N_RB_DL\n"); printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
// printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-f Output filename (.txt format) for Pe/SNR results\n"); printf("-F Input filename (.txt format) for RX conformance testing\n");
printf("-F Input filename (.txt format) for RX conformance testing\n"); exit(-1);
exit (-1); break;
break; }
} }
}
logInit();
logInit(); set_glog(loglvl);
set_glog(loglvl); T_stdout = 1;
T_stdout = 1;
if (snr1set == 0)
if (snr1set==0) snr1 = snr0 + 10;
snr1 = snr0+10;
gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model, 61.44e6, //N_RB2sampling_rate(N_RB_DL),
gNB2UE = new_channel_desc_scm(n_tx, 40e6, //N_RB2channel_bandwidth(N_RB_DL),
n_rx, 0, 0, 0);
channel_model,
61.44e6, //N_RB2sampling_rate(N_RB_DL), if (gNB2UE == NULL) {
40e6, //N_RB2channel_bandwidth(N_RB_DL), msg("Problem generating channel model. Exiting.\n");
0, exit(-1);
0, }
0);
RC.gNB = (PHY_VARS_gNB ** *) malloc(sizeof(PHY_VARS_gNB **));
if (gNB2UE==NULL) { RC.gNB[0] = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *));
msg("Problem generating channel model. Exiting.\n"); RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB));
exit(-1); gNB = RC.gNB[0][0];
} //gNB_config = &gNB->gNB_config;
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
RC.gNB = (PHY_VARS_gNB ** *) malloc(sizeof(PHY_VARS_gNB **)); frame_parms->nb_antennas_tx = n_tx;
RC.gNB[0] = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *)); frame_parms->nb_antennas_rx = n_rx;
RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB)); frame_parms->N_RB_DL = N_RB_DL;
gNB = RC.gNB[0][0]; crcTableInit();
//gNB_config = &gNB->gNB_config; nr_phy_config_request_sim(gNB, N_RB_DL, N_RB_DL, mu);
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) phy_init_nr_gNB(gNB, 0, 0);
frame_parms->nb_antennas_tx = n_tx; //init_eNB_afterRU();
frame_parms->nb_antennas_rx = n_rx; frame_length_complex_samples = frame_parms->samples_per_subframe;
frame_parms->N_RB_DL = N_RB_DL; //frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
crcTableInit(); s_re = malloc(2 * sizeof(double *));
nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu); s_im = malloc(2 * sizeof(double *));
phy_init_nr_gNB(gNB,0,0); r_re = malloc(2 * sizeof(double *));
//init_eNB_afterRU(); r_im = malloc(2 * sizeof(double *));
frame_length_complex_samples = frame_parms->samples_per_subframe; txdata = malloc(2 * sizeof(int *));
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
s_re = malloc(2*sizeof(double *)); for (i = 0; i < 2; i++) {
s_im = malloc(2*sizeof(double *)); s_re[i] = malloc(frame_length_complex_samples * sizeof(double));
r_re = malloc(2*sizeof(double *)); bzero(s_re[i], frame_length_complex_samples * sizeof(double));
r_im = malloc(2*sizeof(double *)); s_im[i] = malloc(frame_length_complex_samples * sizeof(double));
txdata = malloc(2*sizeof(int *)); bzero(s_im[i], frame_length_complex_samples * sizeof(double));
r_re[i] = malloc(frame_length_complex_samples * sizeof(double));
for (i=0; i<2; i++) { bzero(r_re[i], frame_length_complex_samples * sizeof(double));
s_re[i] = malloc(frame_length_complex_samples*sizeof(double)); r_im[i] = malloc(frame_length_complex_samples * sizeof(double));
bzero(s_re[i],frame_length_complex_samples*sizeof(double)); bzero(r_im[i], frame_length_complex_samples * sizeof(double));
s_im[i] = malloc(frame_length_complex_samples*sizeof(double)); txdata[i] = malloc(frame_length_complex_samples * sizeof(int));
bzero(s_im[i],frame_length_complex_samples*sizeof(double)); bzero(r_re[i], frame_length_complex_samples * sizeof(int));
r_re[i] = malloc(frame_length_complex_samples*sizeof(double)); }
bzero(r_re[i],frame_length_complex_samples*sizeof(double));
r_im[i] = malloc(frame_length_complex_samples*sizeof(double)); if (pbch_file_fd != NULL) {
bzero(r_im[i],frame_length_complex_samples*sizeof(double)); load_pbch_desc(pbch_file_fd);
txdata[i] = malloc(frame_length_complex_samples*sizeof(int)); }
bzero(r_re[i],frame_length_complex_samples*sizeof(int));
} /* for (int k=0; k<2; k++) {
// Create transport channel structures for 2 transport blocks (MIMO)
if (pbch_file_fd!=NULL) { for (i=0; i<2; i++) {
load_pbch_desc(pbch_file_fd); gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config);
}
if (!gNB->dlsch[k][i]) {
/* for (int k=0; k<2; k++) { printf("Can't get eNB dlsch structures\n");
// Create transport channel structures for 2 transport blocks (MIMO) exit(-1);
for (i=0; i<2; i++) { }
gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); gNB->dlsch[k][i]->Nsoft = 10;
gNB->dlsch[k][i]->rnti = n_rnti+k;
if (!gNB->dlsch[k][i]) { }
printf("Can't get eNB dlsch structures\n"); }*/
exit(-1); //configure UE
} UE = malloc(sizeof(PHY_VARS_NR_UE));
gNB->dlsch[k][i]->Nsoft = 10; memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS));
gNB->dlsch[k][i]->rnti = n_rnti+k;
} //phy_init_nr_top(frame_parms);
}*/ if (init_nr_ue_signal(UE, 1, 0) != 0) {
//configure UE printf("Error at UE NR initialisation\n");
UE = malloc(sizeof(PHY_VARS_NR_UE)); exit(-1);
memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); }
//phy_init_nr_top(frame_parms); //nr_init_frame_parms_ue(&UE->frame_parms);
if (init_nr_ue_signal(UE, 1, 0) != 0) { //init_nr_ue_transport(UE, 0);
printf("Error at UE NR initialisation\n"); for (int sf = 0; sf < 2; sf++) {
exit(-1); for (i = 0; i < 2; i++) {
} UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo, 8, Nsoft, 5, N_RB_DL,
0);
//nr_init_frame_parms_ue(&UE->frame_parms);
//init_nr_ue_transport(UE, 0); if (!UE->dlsch[sf][0][i]) {
for (int sf = 0; sf < 2; sf++) { printf("Can't get ue dlsch structures\n");
for (i=0; i<2; i++) { exit(-1);
UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo,8,Nsoft,5,N_RB_DL,0); }
if (!UE->dlsch[sf][0][i]) { UE->dlsch[sf][0][i]->rnti = n_rnti;
printf("Can't get ue dlsch structures\n"); }
exit(-1); }
}
UE->dlsch_SI[0] = new_nr_ue_dlsch(1, 1, Nsoft, 5, N_RB_DL, 0);
UE->dlsch[sf][0][i]->rnti = n_rnti; UE->dlsch_ra[0] = new_nr_ue_dlsch(1, 1, Nsoft, 5, N_RB_DL, 0);
} unsigned char harq_pid = 0; //dlsch->harq_ids[subframe];
} NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0];
nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15;
UE->dlsch_SI[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); //time_stats_t *rm_stats, *te_stats, *i_stats;
UE->dlsch_ra[0] = new_nr_ue_dlsch(1,1,Nsoft,5,N_RB_DL,0); uint8_t is_crnti = 0, llr8_flag = 0;
unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; unsigned int TBS = 8424;
NR_gNB_DLSCH_t *dlsch = gNB->dlsch[0][0]; unsigned int available_bits;
nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15; uint8_t nb_re_dmrs = 6;
//time_stats_t *rm_stats, *te_stats, *i_stats; uint16_t length_dmrs = 1;
uint8_t is_crnti=0, llr8_flag=0; unsigned char mod_order;
unsigned int TBS = 8424; uint8_t Nl = 1;
unsigned int available_bits; uint8_t rvidx = 0;
uint8_t nb_re_dmrs = 6; dlsch->rnti = 1;
uint16_t length_dmrs = 1; /*dlsch->harq_processes[0]->mcs = Imcs;
unsigned char mod_order; dlsch->harq_processes[0]->rvidx = rvidx;*/
uint8_t Nl=1; //printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe],
uint8_t rvidx = 0; // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl);
dlsch->rnti =1; mod_order = nr_get_Qm(Imcs, 1);
/*dlsch->harq_processes[0]->mcs = Imcs; available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
dlsch->harq_processes[0]->rvidx = rvidx;*/ TBS = nr_compute_tbs(Imcs, nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, Nl);
//printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], printf("available bits %d TBS %d mod_order %d\n", available_bits, TBS, mod_order);
// dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); //dlsch->harq_ids[subframe]= 0;
mod_order = nr_get_Qm(Imcs,1); rel15->n_prb = nb_rb;
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,1); rel15->nb_symbols = nb_symb_sch;
TBS= nr_compute_tbs(Imcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,Nl); rel15->modulation_order = mod_order;
printf("available bits %d TBS %d mod_order %d\n",available_bits, TBS, mod_order); rel15->nb_layers = Nl;
//dlsch->harq_ids[subframe]= 0; rel15->nb_re_dmrs = nb_re_dmrs;
rel15->n_prb = nb_rb; rel15->transport_block_size = TBS;
rel15->nb_symbols = nb_symb_sch; double *modulated_input = malloc16(sizeof(double) * 16 * 68 * 384);
rel15->modulation_order = mod_order; short *channel_output_fixed = malloc16(sizeof(short) * 16 * 68 * 384);
rel15->nb_layers = Nl; short *channel_output_uncoded = malloc16(sizeof(unsigned short) * 16 * 68 * 384);
rel15->nb_re_dmrs = nb_re_dmrs; double errors_bit_uncoded = 0;
rel15->transport_block_size = TBS; unsigned char *estimated_output;
double *modulated_input = malloc16(sizeof(double) * 16*68*384); unsigned char *estimated_output_bit;
short *channel_output_fixed = malloc16(sizeof( short) *16* 68*384); unsigned char *test_input_bit;
short *channel_output_uncoded = malloc16(sizeof(unsigned short) *16* 68*384); unsigned int errors_bit = 0;
double errors_bit_uncoded=0; test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
unsigned char *estimated_output; estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
unsigned char *estimated_output_bit; estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384);
unsigned char *test_input_bit; NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[UE->current_thread_id[subframe]][0][0];
unsigned int errors_bit =0; NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid];
test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); harq_process->mcs = Imcs;
estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); harq_process->Nl = Nl;
estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16*68*384); harq_process->nb_rb = nb_rb;
NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[UE->current_thread_id[subframe]][0][0]; harq_process->Qm = mod_order;
NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid]; harq_process->rvidx = rvidx;
harq_process->mcs = Imcs; printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm, nb_symb_sch);
harq_process->Nl = Nl; unsigned char *test_input;
harq_process->nb_rb = nb_rb; test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8);
harq_process->Qm = mod_order;
harq_process->rvidx = rvidx; for (i = 0; i < TBS / 8; i++)
printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm,nb_symb_sch); test_input[i] = (unsigned char) rand();
unsigned char *test_input;
test_input=(unsigned char *)malloc16(sizeof(unsigned char) * TBS/8); estimated_output = harq_process->b;
for (i=0; i<TBS/8; i++) #ifdef DEBUG_DLSCHSIM
test_input[i]=(unsigned char) rand(); for (i = 0; i < TBS / 8; i++) printf("test_input[i]=%d \n",test_input[i]);
#endif
estimated_output = harq_process->b;
/*for (int i=0; i<TBS/8; i++)
/*for (int i=0; i<TBS/8; i++) printf("test input[%d]=%d \n",i,test_input[i]);*/
printf("test input[%d]=%d \n",i,test_input[i]);*/
//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32));
//printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32)); // generate signal
if (input_fd == NULL) {
// generate signal nr_dlsch_encoding(test_input, subframe, dlsch, frame_parms);
if (input_fd==NULL) { }
nr_dlsch_encoding(test_input,
subframe,
dlsch,
frame_parms);
}
for (SNR=snr0; SNR<snr1; SNR+=snr_step) {
n_errors = 0;
n_false_positive = 0;
for (trial=0; trial < n_trials; trial++) {
errors_bit_uncoded = 0;
for (i = 0; i < available_bits; i++) {
#ifdef DEBUG_CODER
if ((i&0xf)==0) for (SNR = snr0; SNR < snr1; SNR += snr_step) {
printf("\ne %d..%d: ",i,i+15); n_errors = 0;
n_false_positive = 0;
for (trial = 0; trial < n_trials; trial++) {
errors_bit_uncoded = 0;
for (i = 0; i < available_bits; i++) {
#ifdef DEBUG_CODER
if ((i&0xf)==0)
printf("\ne %d..%d: ",i,i+15);
#endif #endif
//if (i<16) //if (i<16)
// printf("encoder output f[%d] = %d\n",i,dlsch->harq_processes[0]->f[i]); // printf("encoder output f[%d] = %d\n",i,dlsch->harq_processes[0]->f[i]);
if (dlsch->harq_processes[0]->f[i]==0) if (dlsch->harq_processes[0]->f[i] == 0)
modulated_input[i]=1.0;///sqrt(2); //QPSK modulated_input[i] = 1.0; ///sqrt(2); //QPSK
else else
modulated_input[i]=-1.0;///sqrt(2); modulated_input[i] = -1.0; ///sqrt(2);
//if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]); //if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]);
//SNR =10; //SNR =10;
SNR_lin = pow(10,SNR/10.0); SNR_lin = pow(10, SNR / 10.0);
sigma = 1.0/sqrt(2*SNR_lin); sigma = 1.0 / sqrt(2 * SNR_lin);
channel_output_fixed[i] = (short)quantize(sigma/4.0/4.0,modulated_input[i] + sigma*gaussdouble(0.0,1.0),qbits); channel_output_fixed[i] = (short) quantize(sigma / 4.0 / 4.0,
//channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); modulated_input[i] + sigma * gaussdouble(0.0, 1.0),
//printf("llr[%d]=%d\n",i,channel_output_fixed[i]); qbits);
//printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]); //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0));
//printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
//channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits); //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]);
//if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]); //channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits);
//Uncoded BER //if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]);
if (channel_output_fixed[i]<0)
channel_output_uncoded[i]=1; //QPSK demod //Uncoded BER
else if (channel_output_fixed[i] < 0)
channel_output_uncoded[i]=0; channel_output_uncoded[i] = 1; //QPSK demod
else
if (channel_output_uncoded[i] != dlsch->harq_processes[harq_pid]->f[i]) channel_output_uncoded[i] = 0;
errors_bit_uncoded = errors_bit_uncoded + 1;
} if (channel_output_uncoded[i] != dlsch->harq_processes[harq_pid]->f[i])
errors_bit_uncoded = errors_bit_uncoded + 1;
//if (errors_bit_uncoded>10) }
//printf("errors bits uncoded %f\n", errors_bit_uncoded);
//if (errors_bit_uncoded>10)
//printf("errors bits uncoded %f\n", errors_bit_uncoded);
#ifdef DEBUG_CODER #ifdef DEBUG_CODER
printf("\n"); printf("\n");
exit(-1); exit(-1);
#endif #endif
ret = nr_dlsch_decoding(UE, ret = nr_dlsch_decoding(UE, channel_output_fixed, &UE->frame_parms,
channel_output_fixed, dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
&UE->frame_parms, subframe, harq_pid, is_crnti, llr8_flag);
dlsch0_ue,
dlsch0_ue->harq_processes[0], if (ret > dlsch0_ue->max_ldpc_iterations)
frame, n_errors++;
nb_symb_sch,
subframe, //count errors
harq_pid, errors_bit = 0;
is_crnti,
llr8_flag); for (i = 0; i < TBS; i++) {
estimated_output_bit[i] = (dlsch0_ue->harq_processes[0]->b[i / 8] & (1 << (i & 7))) >> (i & 7);
if (ret>dlsch0_ue->max_ldpc_iterations) test_input_bit[i] = (test_input[i / 8] & (1 << (i & 7))) >> (i & 7); // Further correct for multiple segments
n_errors++;
if (estimated_output_bit[i] != test_input_bit[i]) {
//count errors errors_bit++;
errors_bit = 0; //printf("estimated bits error occurs @%d ",i);
}
for (i=0; i<TBS; i++) { }
estimated_output_bit[i] = (estimated_output[i/8]&(1<<(i&7)))>>(i&7);
test_input_bit[i] = (test_input[i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments if (errors_bit > 0) {
n_false_positive++;
if (estimated_output_bit[i] != test_input_bit[i]) { if (n_trials == 1)
errors_bit++; printf("errors_bit %d (trial %d)\n", errors_bit, trial);
//printf("estimated bits error occurs @%d ",i); }
} }
}
printf("SNR %f, BLER %f (false positive %f)\n", SNR,
if (errors_bit>0) { (float) n_errors / (float) n_trials,
n_false_positive++; (float) n_false_positive / (float) n_trials);
if (n_trials == 1)
printf("\n errors_bit %d (trial %d)\n", errors_bit,trial); if ((float) n_errors / (float) n_trials < target_error_rate)
} break;
} }
printf("SNR %f, BLER %f (false positive %f)\n",SNR,(float)n_errors/(float)n_trials,(float)n_false_positive/(float)n_trials); /*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
if (gNB->frame_parms.nb_antennas_tx>1)
if ((float)n_errors/(float)n_trials < target_error_rate) LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/
break;
} //TODO: loop over slots
/*for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
/*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) {
if (gNB->frame_parms.nb_antennas_tx>1) PHY_ofdm_mod(gNB->common_vars.txdataF[aa],
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/ txdata[aa],
frame_parms->ofdm_symbol_size,
//TODO: loop over slots 12,
/*for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) { frame_parms->nb_prefix_samples,
if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { CYCLIC_PREFIX);
PHY_ofdm_mod(gNB->common_vars.txdataF[aa], } else {
txdata[aa], nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
frame_parms->ofdm_symbol_size, txdata[aa],
12, 14,
frame_parms->nb_prefix_samples, frame_parms);
CYCLIC_PREFIX); }
} else { }
nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
txdata[aa], LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1);
14, if (gNB->frame_parms.nb_antennas_tx>1)
frame_parms); LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1);
}
}
for (i=0; i<frame_length_complex_samples; i++) {
LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1); for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (gNB->frame_parms.nb_antennas_tx>1) r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1); r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
}
}*/
for (i=0; i<frame_length_complex_samples; i++) {
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) { for (i = 0; i < 2; i++) {
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); printf("gNB %d\n", i);
r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); free_gNB_dlsch(gNB->dlsch[0][i]);
} printf("UE %d\n", i);
}*/ free_nr_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]);
}
for (i=0; i<2; i++) {
printf("gNB %d\n",i); for (i = 0; i < 2; i++) {
free_gNB_dlsch(gNB->dlsch[0][i]); free(s_re[i]);
printf("UE %d\n",i); free(s_im[i]);
free_nr_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); free(r_re[i]);
} free(r_im[i]);
free(txdata[i]);
for (i=0; i<2; i++) { }
free(s_re[i]);
free(s_im[i]); free(s_re);
free(r_re[i]); free(s_im);
free(r_im[i]); free(r_re);
free(txdata[i]); free(r_im);
} free(txdata);
free(s_re); if (output_fd)
free(s_im); fclose(output_fd);
free(r_re);
free(r_im); if (input_fd)
free(txdata); fclose(input_fd);
if (output_fd) return (n_errors);
fclose(output_fd);
if (input_fd)
fclose(input_fd);
return(n_errors);
} }
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