Commit 47658e56 authored by Raymond Knopp's avatar Raymond Knopp

addition of SLDCH transmission, SPSS table

parent 219ddeed
...@@ -935,45 +935,55 @@ int init_lte_ue_signal(PHY_VARS_UE *ue, ...@@ -935,45 +935,55 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
init_prach_tables(839); init_prach_tables(839);
ue->pusch_slsch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_slcch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_slcch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_slcch->rxdataF_ext = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->drs_ch_estimates = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->rxdataF_comp = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->ul_ch_mag = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slsch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_slsch->rxdataF_ext = (int32_t **)malloc(2*sizeof(int32_t*)); ue->pusch_slsch->rxdataF_ext = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slsch->drs_ch_estimates = (int32_t **)malloc(2*sizeof(int32_t*)); ue->pusch_slsch->drs_ch_estimates = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slsch->rxdataF_comp = (int32_t **)malloc(2*sizeof(int32_t*)); ue->pusch_slsch->rxdataF_comp = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slsch->ul_ch_mag = (int32_t **)malloc(2*sizeof(int32_t*)); ue->pusch_slsch->ul_ch_mag = (int32_t **)malloc(2*sizeof(int32_t*));
ue->slsch_rxdata_7_5kHz = (int16_t **)malloc(2*sizeof(int32_t*));
ue->slsch_rxdataF = (int16_t **)malloc(2*sizeof(int32_t*)); ue->pusch_sldch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_sldch->rxdataF_ext = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_sldch->drs_ch_estimates = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_sldch->rxdataF_comp = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_sldch->ul_ch_mag = (int32_t **)malloc(2*sizeof(int32_t*));
ue->sl_rxdata_7_5kHz = (int16_t **)malloc(2*sizeof(int32_t*));
ue->sl_rxdataF = (int16_t **)malloc(2*sizeof(int32_t*));
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) { for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
ue->sl_rxdataF[aa] = (int16_t*)malloc16_clear(ue->frame_parms.ofdm_symbol_size*14*sizeof(int32_t));
ue->sl_rxdata_7_5kHz[aa] = (int16_t*)malloc16_clear(ue->frame_parms.samples_per_tti*sizeof(int32_t));
ue->pusch_slcch->rxdataF_ext[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->drs_ch_estimates[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->rxdataF_comp[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->ul_ch_mag[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slsch->rxdataF_ext[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t)); ue->pusch_slsch->rxdataF_ext[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slsch->drs_ch_estimates[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t)); ue->pusch_slsch->drs_ch_estimates[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slsch->rxdataF_comp[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t)); ue->pusch_slsch->rxdataF_comp[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slsch->ul_ch_mag[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t)); ue->pusch_slsch->ul_ch_mag[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->slsch_rxdataF[aa] = (int16_t*)malloc16_clear(ue->frame_parms.ofdm_symbol_size*14*sizeof(int32_t)); ue->pusch_sldch->rxdataF_ext[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->slsch_rxdata_7_5kHz[aa] = (int16_t*)malloc16_clear(ue->frame_parms.samples_per_tti*sizeof(int32_t)); ue->pusch_sldch->drs_ch_estimates[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_sldch->rxdataF_comp[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_sldch->ul_ch_mag[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
} }
ue->slsch_dlsch_llr = (int16_t **)malloc(2*6*12*1200*sizeof(int16_t*)); ue->slsch_dlsch_llr = (int16_t **)malloc(2*6*12*1200*sizeof(int16_t*));
ue->slsch_ulsch_llr = (int16_t **)malloc(2*6*12*1200*sizeof(int16_t*)); ue->slsch_ulsch_llr = (int16_t **)malloc(2*6*12*1200*sizeof(int16_t*));
ue->sldch_dlsch_llr = (int16_t **)malloc(2*2*12*1200*sizeof(int16_t*));
ue->sldch_ulsch_llr = (int16_t **)malloc(2*2*12*1200*sizeof(int16_t*));
ue->pusch_slcch = (LTE_eNB_PUSCH*)malloc(sizeof(LTE_eNB_PUSCH));
ue->pusch_slcch->rxdataF_ext = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->drs_ch_estimates = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->rxdataF_comp = (int32_t **)malloc(2*sizeof(int32_t*));
ue->pusch_slcch->ul_ch_mag = (int32_t **)malloc(2*sizeof(int32_t*));
ue->slcch_rxdata_7_5kHz = (int16_t **)malloc(2*sizeof(int32_t*));
ue->slcch_rxdataF = (int16_t **)malloc(2*sizeof(int32_t*));
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
ue->pusch_slcch->rxdataF_ext[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->drs_ch_estimates[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->rxdataF_comp[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->pusch_slcch->ul_ch_mag[aa] = (int32_t*)malloc16_clear(ue->frame_parms.N_RB_DL*12*14*sizeof(int32_t));
ue->slcch_rxdataF[aa] = (int16_t*)malloc16_clear(ue->frame_parms.ofdm_symbol_size*14*sizeof(int32_t));
ue->slcch_rxdata_7_5kHz[aa] = (int16_t*)malloc16_clear(ue->frame_parms.samples_per_tti*sizeof(int32_t));
}
return 0; return 0;
} }
...@@ -999,6 +1009,7 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) { ...@@ -999,6 +1009,7 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
} }
ue->dlsch_rx_slsch = new_ue_dlsch(1,4,NSOFT,1,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); ue->dlsch_rx_slsch = new_ue_dlsch(1,4,NSOFT,1,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
for (int i=0;i<MAX_SLDCH;i++) ue->dlsch_rx_sldch[i] = new_ue_dlsch(1,4,NSOFT,1,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag);
ue->dlsch_slsch = new_eNB_dlsch(1,1,NSOFT,ue->frame_parms.N_RB_DL, abstraction_flag,&ue->frame_parms); ue->dlsch_slsch = new_eNB_dlsch(1,1,NSOFT,ue->frame_parms.N_RB_DL, abstraction_flag,&ue->frame_parms);
ue->ulsch_slsch = new_ue_ulsch(ue->frame_parms.N_RB_DL, abstraction_flag); ue->ulsch_slsch = new_ue_ulsch(ue->frame_parms.N_RB_DL, abstraction_flag);
for (i=0;i<10;i++) ue->dlsch_slsch->harq_ids[i] = 0; for (i=0;i<10;i++) ue->dlsch_slsch->harq_ids[i] = 0;
...@@ -1015,34 +1026,37 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) { ...@@ -1015,34 +1026,37 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
void free_ue_resources(PHY_VARS_UE *ue) { void free_ue_resources(PHY_VARS_UE *ue) {
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) { for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
free(ue->sl_rxdataF[aa]);
free(ue->sl_rxdata_7_5kHz[aa]);
free(ue->pusch_slcch->rxdataF_ext[aa]); free(ue->pusch_slcch->rxdataF_ext[aa]);
free(ue->pusch_slcch->drs_ch_estimates[aa]); free(ue->pusch_slcch->drs_ch_estimates[aa]);
free(ue->pusch_slcch->rxdataF_comp[aa]); free(ue->pusch_slcch->rxdataF_comp[aa]);
free(ue->pusch_slcch->ul_ch_mag[aa]); free(ue->pusch_slcch->ul_ch_mag[aa]);
free(ue->slcch_rxdataF[aa]);
free(ue->slcch_rxdata_7_5kHz[aa]);
}
free(ue->pusch_slcch->rxdataF_ext);
free(ue->pusch_slcch->drs_ch_estimates);
free(ue->pusch_slcch->rxdataF_comp);
free(ue->pusch_slcch->ul_ch_mag);
free(ue->slcch_rxdataF);
free(ue->slcch_rxdata_7_5kHz);
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
free(ue->pusch_slsch->rxdataF_ext[aa]); free(ue->pusch_slsch->rxdataF_ext[aa]);
free(ue->pusch_slsch->drs_ch_estimates[aa]); free(ue->pusch_slsch->drs_ch_estimates[aa]);
free(ue->pusch_slsch->rxdataF_comp[aa]); free(ue->pusch_slsch->rxdataF_comp[aa]);
free(ue->pusch_slsch->ul_ch_mag[aa]); free(ue->pusch_slsch->ul_ch_mag[aa]);
free(ue->slsch_rxdataF[aa]); free(ue->pusch_sldch->rxdataF_ext[aa]);
free(ue->slsch_rxdata_7_5kHz[aa]); free(ue->pusch_sldch->drs_ch_estimates[aa]);
} free(ue->pusch_sldch->rxdataF_comp[aa]);
free(ue->pusch_sldch->ul_ch_mag[aa]);
}
free(ue->sl_rxdataF);
free(ue->sl_rxdata_7_5kHz);
free(ue->pusch_slcch->rxdataF_ext);
free(ue->pusch_slcch->drs_ch_estimates);
free(ue->pusch_slcch->rxdataF_comp);
free(ue->pusch_slcch->ul_ch_mag);
free(ue->pusch_slsch->rxdataF_ext); free(ue->pusch_slsch->rxdataF_ext);
free(ue->pusch_slsch->drs_ch_estimates); free(ue->pusch_slsch->drs_ch_estimates);
free(ue->pusch_slsch->rxdataF_comp); free(ue->pusch_slsch->rxdataF_comp);
free(ue->pusch_slsch->ul_ch_mag); free(ue->pusch_slsch->ul_ch_mag);
free(ue->slsch_rxdataF); free(ue->pusch_sldch->rxdataF_ext);
free(ue->slsch_rxdata_7_5kHz); free(ue->pusch_sldch->drs_ch_estimates);
free(ue->pusch_sldch->rxdataF_comp);
free(ue->pusch_sldch->ul_ch_mag);
free(ue->slsch_dlsch_llr); free(ue->slsch_dlsch_llr);
free(ue->slsch_ulsch_llr); free(ue->slsch_ulsch_llr);
free(ue->sldch_dlsch_llr);
free(ue->sldch_ulsch_llr);
} }
...@@ -2,6 +2,7 @@ primary_synch0 = [zeros(1,5) exp(-1j*pi*25*(0:30).*(1:31)/63) exp(-1j*pi*25*(32: ...@@ -2,6 +2,7 @@ primary_synch0 = [zeros(1,5) exp(-1j*pi*25*(0:30).*(1:31)/63) exp(-1j*pi*25*(32:
primary_synch1 = [zeros(1,5) exp(-1j*pi*29*(0:30).*(1:31)/63) exp(-1j*pi*29*(32:62).*(33:63)/63) zeros(1,5)]; primary_synch1 = [zeros(1,5) exp(-1j*pi*29*(0:30).*(1:31)/63) exp(-1j*pi*29*(32:62).*(33:63)/63) zeros(1,5)];
primary_synch2 = [zeros(1,5) exp(-1j*pi*34*(0:30).*(1:31)/63) exp(-1j*pi*34*(32:62).*(33:63)/63) zeros(1,5)]; primary_synch2 = [zeros(1,5) exp(-1j*pi*34*(0:30).*(1:31)/63) exp(-1j*pi*34*(32:62).*(33:63)/63) zeros(1,5)];
%psync_table = [0 exp(-j*2*pi*(0:62)/63)]; %psync_table = [0 exp(-j*2*pi*(0:62)/63)];
%psync_table_mod = zeros(1,63*2); %psync_table_mod = zeros(1,63*2);
%psync_table_mod(1:2:end) = floor(32767/sqrt(2)*real(psync_table)); %psync_table_mod(1:2:end) = floor(32767/sqrt(2)*real(psync_table));
...@@ -23,6 +24,14 @@ primary_synch2_mod = zeros(1,72*2); ...@@ -23,6 +24,14 @@ primary_synch2_mod = zeros(1,72*2);
primary_synch2_mod(1:2:end) = floor(32767*real(primary_synch2)); primary_synch2_mod(1:2:end) = floor(32767*real(primary_synch2));
primary_synch2_mod(2:2:end) = floor(32767*imag(primary_synch2)); primary_synch2_mod(2:2:end) = floor(32767*imag(primary_synch2));
primary_synch0SL_mod = zeros(1,72*2);
primary_synch0SL_mod(1:2:end) = floor(32767*real(primary_synch0_SL));
primary_synch0SL_mod(2:2:end) = floor(32767*imag(primary_synch0_SL));
primary_synch1SL_mod = zeros(1,72*2);
primary_synch1SL_mod(1:2:end) = floor(32767*real(primary_synch1_SL));
primary_synch1SL_mod(2:2:end) = floor(32767*imag(primary_synch1_SL));
primary_synch0_mod2 = zeros(1,128); primary_synch0_mod2 = zeros(1,128);
primary_synch0_mod2((128-35):128)=primary_synch0(1:36); primary_synch0_mod2((128-35):128)=primary_synch0(1:36);
primary_synch0_mod2(2:37)=primary_synch0(37:end); primary_synch0_mod2(2:37)=primary_synch0(37:end);
...@@ -59,24 +68,22 @@ fprintf(fd,'%d,',primary_synch2_tab(1:end-1)); ...@@ -59,24 +68,22 @@ fprintf(fd,'%d,',primary_synch2_tab(1:end-1));
fprintf(fd,'%d};\n',primary_synch2_tab(end)); fprintf(fd,'%d};\n',primary_synch2_tab(end));
fclose(fd); fclose(fd);
% for LEON we need to invert the endianess primary_synch0_SL = [zeros(1,5) exp(-1j*pi*26*(0:30).*(1:31)/63) exp(-1j*pi*26*(32:62).*(33:63)/63) zeros(1,5)];
fd = fopen('primary_synch_leon.h','w'); primary_synch1_SL = [zeros(1,5) exp(-1j*pi*37*(0:30).*(1:31)/63) exp(-1j*pi*37*(32:62).*(33:63)/63) zeros(1,5)];
primary_synch0_tab = reshape(primary_synch0_tab,4,[]);
primary_synch0_tab = primary_synch0_tab([4 3 2 1],:); primary_synch0SL_mod = zeros(1,72*2);
primary_synch0_tab = primary_synch0_tab(:); primary_synch0SL_mod(1:2:end) = floor(32767*real(primary_synch0_SL));
primary_synch1_tab = reshape(primary_synch0_tab,4,[]); primary_synch0SL_mod(2:2:end) = floor(32767*imag(primary_synch0_SL));
primary_synch1_tab = primary_synch1_tab([4 3 2 1],:);
primary_synch1_tab = primary_synch1_tab(:); primary_synch1SL_mod = zeros(1,72*2);
primary_synch2_tab = reshape(primary_synch0_tab,4,[]); primary_synch1SL_mod(1:2:end) = floor(32767*real(primary_synch1_SL));
primary_synch2_tab = primary_synch2_tab([4 3 2 1],:); primary_synch1SL_mod(2:2:end) = floor(32767*imag(primary_synch1_SL));
primary_synch2_tab = primary_synch2_tab(:);
fprintf(fd,'unsigned char primary_synch0_tab[72] = {'); fd = fopen('primary_synch_SL.h','w');
fprintf(fd,'%d,',primary_synch0_tab(1:end-1)); fprintf(fd,'short primary_synch0SL[144] = {');
fprintf(fd,'%d};\n',primary_synch0_tab(end)); fprintf(fd,'%d,',primary_synch0SL_mod(1:end-1));
fprintf(fd,'unsigned char primary_synch1_tab[72] = {'); fprintf(fd,'%d};\n',primary_synch0SL_mod(end));
fprintf(fd,'%d,',primary_synch1_tab(1:end-1)); fprintf(fd,'short primary_synch1SL[144] = {');
fprintf(fd,'%d};\n',primary_synch1_tab(end)); fprintf(fd,'%d,',primary_synch1SL_mod(1:end-1));
fprintf(fd,'unsigned char primary_synch2_tab[72] = {'); fprintf(fd,'%d};\n',primary_synch1SL_mod(end));
fprintf(fd,'%d,',primary_synch2_tab(1:end-1));
fprintf(fd,'%d};\n',primary_synch2_tab(end));
fclose(fd); fclose(fd);
short primary_synch0SL[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-27960,-17086,2448,-32676,-32402,-4884,22879,-23457,11971,-30502,-16384,28377,-30791,11206,20429,25618,-29523,14217,-10436,31060,2448,-32676,11971,-30502,-30791,11206,-16384,-28378,-32402,4883,22879,-23457,20429,-25619,-29523,14217,-27960,-17086,-16384,28377,-16384,-28378,-27960,-17086,27073,18458,11971,30501,22879,-23457,20429,25618,32767,-1,-30791,11206,-32402,4883,27073,18458,27073,18458,-32402,4883,-30791,11206,32767,0,20429,25618,22879,-23457,11971,30501,27073,18458,-27960,-17086,-16384,-28378,-16384,28377,-27960,-17086,-29523,14217,20429,-25619,22879,-23457,-32402,4883,-16384,-28378,-30791,11206,11971,-30502,2448,-32676,-10436,31060,-29523,14217,20429,25618,-30791,11206,-16384,28377,11971,-30502,22879,-23457,-32402,-4884,2448,-32676,-27960,-17086,32767,-1,0,0,0,0,0,0,0,0,0,0};
short primary_synch1SL[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-27960,17085,2448,32675,-32402,4883,22879,23456,11971,30501,-16384,-28378,-30791,-11207,20429,-25619,-29523,-14218,-10436,-31061,2448,32675,11971,30501,-30791,-11207,-16384,28377,-32402,-4884,22879,23456,20429,25618,-29523,-14218,-27960,17085,-16384,-28378,-16384,28377,-27960,17085,27073,-18459,11971,-30502,22879,23456,20429,-25619,32767,0,-30791,-11207,-32402,-4884,27073,-18459,27073,-18459,-32402,-4884,-30791,-11207,32767,0,20429,-25619,22879,23456,11971,-30502,27073,-18459,-27960,17085,-16384,28377,-16384,-28378,-27960,17085,-29523,-14218,20429,25618,22879,23456,-32402,-4884,-16384,28377,-30791,-11207,11971,30501,2448,32675,-10436,-31061,-29523,-14218,20429,-25619,-30791,-11207,-16384,-28378,11971,30501,22879,23456,-32402,4883,2448,32675,-27960,17085,32767,-1,0,0,0,0,0,0,0,0,0,0};
...@@ -941,8 +941,15 @@ typedef struct { ...@@ -941,8 +941,15 @@ typedef struct {
uint8_t ljmod10; uint8_t ljmod10;
} SLSCH_t; } SLSCH_t;
typedef enum {
disc_type1=0,
disc_type2B=1
} SLD_t;
typedef struct { typedef struct {
// SL Configuration // SL Discovery Configuration
/// Discovery Type
SLD_t type;
/// Number of SL resource blocks (1-100) /// Number of SL resource blocks (1-100)
uint32_t N_SL_RB; uint32_t N_SL_RB;
/// prb-start (0-99) /// prb-start (0-99)
...@@ -955,12 +962,26 @@ typedef struct { ...@@ -955,12 +962,26 @@ typedef struct {
uint32_t discPeriod; uint32_t discPeriod;
/// Number of Repetitions (N_R) /// Number of Repetitions (N_R)
uint32_t numRepetitions; uint32_t numRepetitions;
/// Number of retransmissions (numRetx-r12)
uint32_t numRetx;
/// PSDCH subframe bitmap (up to 100 bits, first 64)6 /// PSDCH subframe bitmap (up to 100 bits, first 64)6
uint64_t bitmap1; uint64_t bitmap1;
/// PSDCH subframe bitmap (up to 100 bits, second 36) /// PSDCH subframe bitmap (up to 100 bits, second 36)
uint64_t bitmap2; uint64_t bitmap2;
/// Bitmap length (N_B) (valid values (4,8,12,16,30,40,42) Rel12, (16,20,100) Rel14 /// Bitmap length (N_B) (valid values (4,8,12,16,30,40,42) Rel12, (16,20,100) Rel14
uint32_t bitmap_length; uint32_t bitmap_length;
/// N1_PSDCH (a-r12)
uint32_t N1;
/// N1_PSDCH (b-r12)
uint32_t N2;
/// N1_PSDCH (c-r12)
uint32_t N3;
/// a10 (discPRB-Index)
uint32_t a10;
/// b10 (discSF-Index)
uint32_t b10;
/// transmission index (j)
uint32_t j;
// Discovery resource // Discovery resource
uint32_t n_psdch; uint32_t n_psdch;
/// payload length /// payload length
......
...@@ -109,9 +109,15 @@ int generate_drs_pusch(PHY_VARS_UE *ue, ...@@ -109,9 +109,15 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
case PSSCH_34: case PSSCH_34:
AssertFatal(1==0,"SL Transmission type 3/4 not supported for now\n"); AssertFatal(1==0,"SL Transmission type 3/4 not supported for now\n");
break; break;
case PSDCH_ODD: case PSDCH:
case PSDCH_EVEN: u0=0;
AssertFatal(1==0,"PSDCH Transmission not supported for now\n"); u1=0;
v0=0;
v1=0;
cyclic_shift0 = 0;
cyclic_shift1 = 0;
lstart = (3 - frame_parms->Ncp);
linc = (7 - frame_parms->Ncp);
break; break;
case PSBCH: case PSBCH:
AssertFatal(1==0,"PSBCH Transmission not supported for now\n"); AssertFatal(1==0,"PSBCH Transmission not supported for now\n");
......
...@@ -34,6 +34,323 @@ ...@@ -34,6 +34,323 @@
#include "PHY/defs.h" #include "PHY/defs.h"
void sldch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subframe_rx,int npsdch,int nprb,int rvidx) {
int Nsymb = 7;
SLDCH_t *sldch = &ue->sldch;
int16_t **rxdataF_ext = ue->pusch_sldch->rxdataF_ext;
int16_t **drs_ch_estimates = ue->pusch_sldch->drs_ch_estimates;
int16_t **rxdataF_comp = ue->pusch_sldch->rxdataF_comp;
int16_t **ul_ch_mag = ue->pusch_sldch->ul_ch_mag;
int16_t **rxdata_7_5kHz = ue->sl_rxdata_7_5kHz;
int16_t **rxdataF = ue->sl_rxdataF;
int32_t avgs;
uint8_t log2_maxh=0;
int32_t avgU[2];
LOG_I(PHY,"sldch_decoding %d.%d\n",frame_rx,subframe_rx);
// slot FEP
if (ue->sl_fep_done == 0) {
ue->sl_fep_done = 1;
RU_t ru_tmp;
memset((void*)&ru_tmp,0,sizeof(RU_t));
memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdata = ue->common_vars.rxdata;
ru_tmp.common.rxdata_7_5kHz = (int32_t**)rxdata_7_5kHz;
ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1));
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1)+1);
// extract symbols from slot
for (int l=0; l<Nsymb; l++) {
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1),0);
if (l<Nsymb-1) // skip last symbol in second slot
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1)+1,0);
}
}
for (int l=0; l<Nsymb; l++) {
ulsch_extract_rbs_single((int32_t**)rxdataF,
(int32_t**)rxdataF_ext,
nprb,
2,
l,
(subframe_rx<<1),
&ue->frame_parms);
if (l<Nsymb-1) // skip last symbol in second slot
ulsch_extract_rbs_single((int32_t**)rxdataF,
(int32_t**)rxdataF_ext,
nprb,
2,
l,
(subframe_rx<<1)+1,
&ue->frame_parms);
}
#ifdef PSDCH_DEBUG
write_output("sldch_rxF.m",
"sldchrxF",
&rxdataF[0][0],
14*ue->frame_parms.ofdm_symbol_size,1,1);
write_output("sldch_rxF_ext.m","sldchrxF_ext",rxdataF_ext[0],14*12*ue->frame_parms.N_RB_DL,1,1);
#endif
lte_ul_channel_estimation(&ue->frame_parms,
(int32_t**)drs_ch_estimates,
(int32_t**)NULL,
(int32_t**)rxdataF_ext,
2,
frame_rx,
subframe_rx,
0, //u
0, //v
0, //cyclic_shift
3,
1, // interpolation
0);
lte_ul_channel_estimation(&ue->frame_parms,
(int32_t**)drs_ch_estimates,
(int32_t**)NULL,
(int32_t**)rxdataF_ext,
2,
frame_rx,
subframe_rx,
0,//u
0,//v
0,//cyclic_shift,
10,
1, // interpolation
0);
ulsch_channel_level(drs_ch_estimates,
&ue->frame_parms,
avgU,
2);
#ifdef PSDCH_DEBUG
write_output("drs_ext0.m","drsest0",drs_ch_estimates[0],ue->frame_parms.N_RB_UL*12*14,1,1);
#endif
avgs = 0;
for (int aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
avgs = cmax(avgs,avgU[aarx]);
// log2_maxh = 4+(log2_approx(avgs)/2);
log2_maxh = (log2_approx(avgs)/2)+ log2_approx(ue->frame_parms.nb_antennas_rx-1)+4;
for (int l=0; l<(Nsymb<<1)-1; l++) {
if (((ue->frame_parms.Ncp == 0) && ((l==3) || (l==10)))|| // skip pilots
((ue->frame_parms.Ncp == 1) && ((l==2) || (l==8)))) {
l++;
}
ulsch_channel_compensation(
rxdataF_ext,
drs_ch_estimates,
ul_ch_mag,
NULL,
rxdataF_comp,
&ue->frame_parms,
l,
2, //Qm
2, //nb_rb
log2_maxh); // log2_maxh+I0_shift
if (ue->frame_parms.nb_antennas_rx > 1)
ulsch_detection_mrc(&ue->frame_parms,
rxdataF_comp,
ul_ch_mag,
NULL,
l,
2 //nb_rb
);
freq_equalization(&ue->frame_parms,
rxdataF_comp,
ul_ch_mag,
NULL,
l,
24,
2);
}
lte_idft(&ue->frame_parms,
rxdataF_comp[0],
24);
#ifdef PSDCH_DEBUG
write_output("sldch_rxF_comp.m","sldchrxF_comp",rxdataF_comp[0],ue->frame_parms.N_RB_UL*12*14,1,1);
#endif
int E = 12*2*2*((Nsymb-1)<<1);
int16_t *llrp = ue->slsch_ulsch_llr;
for (int l=0; l<(Nsymb<<1)-1; l++) {
if (((ue->frame_parms.Ncp == 0) && ((l==3) || (l==10)))|| // skip pilots
((ue->frame_parms.Ncp == 1) && ((l==2) || (l==8)))) {
l++;
}
ulsch_qpsk_llr(&ue->frame_parms,
rxdataF_comp,
(int32_t *)ue->slsch_ulsch_llr,
l,
2,
(int32_t *)&llrp);
}
write_output("sldch_llr.m","sldchllr",ue->sldch_ulsch_llr[npsdch],
12*2*(ue->frame_parms.symbols_per_tti),
1,0);
// unscrambling
uint32_t x1,x2=510;
uint32_t s = lte_gold_generic(&x1, &x2, 1);
int k=0;
int16_t c;
for (int i=0; i<(1+(E>>5)); i++) {
for (int j=0; j<32; j++,k++) {
c = (int16_t)((((s>>j)&1)<<1)-1);
ue->sldch_ulsch_llr[k] = c*ue->sldch_ulsch_llr[k];
}
s = lte_gold_generic(&x1, &x2, 0);
}
// Deinterleaving
int Cmux = (Nsymb-1)*2;
for (int i=0,j=0;i<Cmux;i++) {
for (int r=0;r<24;r++) {
ue->sldch_dlsch_llr[((r*Cmux)+i)<<1] = ue->sldch_ulsch_llr[j++];
ue->sldch_dlsch_llr[(((r*Cmux)+i)<<1)+1] = ue->sldch_ulsch_llr[j++];
// printf("dlsch_llr[%d] %d(%d) dlsch_llr[%d] %d(%d)\n",
// ((r*Cmux)+i)<<1,ue->slsch_dlsch_llr[((r*Cmux)+i)<<1],j-2,(((r*Cmux)+i)<<1)+1,ue->slsch_dlsch_llr[(((r*Cmux)+i)<<1)+1],j-1);
}
}
// Decoding
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->rvidx = rvidx;
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->nb_rb = 2;
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->TBS = 256;
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->Qm = 2;
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->G = E;
ue->dlsch_rx_sldch[npsdch]->harq_processes[0]->Nl = 1;
// for (int i=0;i<E/16;i++) printf("decoding: E[%d] %d\n",i,ue->slsch_dlsch_llr[i]);
int ret = dlsch_decoding(ue,
ue->sldch_dlsch_llr,
&ue->frame_parms,
ue->dlsch_rx_sldch[npsdch],
ue->dlsch_rx_sldch[npsdch]->harq_processes[0],
frame_rx,
subframe_rx,
0,
0,
1);
// printf("slsch decoding round %d ret %d\n",ue->dlsch_rx_slsch->harq_processes[0]->round,ret);
if (ret<ue->dlsch_rx_sldch[npsdch]->max_turbo_iterations) {
LOG_D(PHY,"SLDCH received for npsdch %d (rvidx %d, iter %d)\n",
npsdch,
rvidx,ret);
}
}
void rx_sldch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, int frame_rx,int subframe_rx) {
AssertFatal(frame_rx<1024 && frame_rx>=0,"frame %d is illegal\n",frame_rx);
AssertFatal(subframe_rx<10 && subframe_rx>=0,"subframe %d is illegal\n",subframe_rx);
SLDCH_t *sldch = &ue->sldch;
AssertFatal(sldch!=NULL,"SLDCH is null\n");
uint32_t O = ue->sldch->offsetIndicator;
uint32_t P = ue->sldch->discPeriod;
uint32_t absSF = (frame_rx*10)+subframe_rx;
uint32_t absSF_offset,absSF_modP;
int rvtab[4]={0,2,3,1};
absSF_offset = absSF-O;
if (absSF_offset < O) return;
absSF_modP = absSF_offset%P;
uint64_t SFpos = ((uint64_t)1) << absSF_modP;
if ((SFpos & sldch->bitmap1) == 0) return;
// if we get here, then there is a PSDCH subframe for a potential reception
// compute parameters
AssertFatal(sldch->bitmap_length==4 || sldch->bitmap_length==8 ||
sldch->bitmap_length==12 || sldch->bitmap_length==16 ||
sldch->bitmap_length==30 || sldch->bitmap_length==40 ||
sldch->bitmap_length==42,"SLDCH Bitmap_length %x not supported\n",
sldch->bitmap_length);
int LPSDCH=0;
for (int i=0;i<sldch->bitmap_length;i++) if (((((uint64_t)1)<<i)&sldch->bitmap1) == 1) LPSDCH++;
AssertFatal(sldch->type == disc_type1 || sldch->type == disc_type2B,
"unknown Discovery type %d\n",sldch->type);
int N_TX_SLD = 1+sldch->numRepetitions;
uint32_t M_RB_PSDCH_RP = sldch->N_SL_RB;
int first_prb;
if (sldch->type == disc_type1) {
int Ni = LPSDCH/N_TX_SLD;
int Nf = M_RB_PSDCH_RP>>1;
// int a_ji = (((sldch->j-1)*(Nf/N_TX_SLD)) + (sldch->n_psdch/Ni))%Nf;
// int b_1i = sldch->n_psdch%Ni;
// repetition number
int jrx;
int npsdch;
int nprb;
// loop over all candidate PRBs
for (int i=0;i<Nf;i++){
jrx = i/(Nf/N_TX_SLD);
npsdch = (i%(Nf/N_TX_SLD))*Ni +((absSF/N_TX_SLD)%Ni);
nprb = i<<1;
if (nprb<(sldch->N_SL_RB>>1)) nprb+=sldch->prb_Start;
else nprb+=(sldch->prb_End-(sldch->N_SL_RB>>1));
// call decoding for candidate npsdch
LOG_I(PHY,"SLDCH (RX): Trying npsdch %d, j %d (nprb %d)\n",npsdch,jrx,nprb);
sldch_decoding(ue,proc,frame_rx,subframe_rx,npsdch,nprb,rvtab[jrx]);
}
}
else {
AssertFatal(1==0,"Discovery Type 2B not supported yet\n");
}
}
void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx) { void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx) {
UE_tport_t pdu; UE_tport_t pdu;
...@@ -64,13 +381,129 @@ void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx) ...@@ -64,13 +381,129 @@ void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx)
#endif #endif
void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int nprb,int rvidx) {
SLDCH_t *sldch = ue->sldch;
LTE_eNB_DLSCH_t *dlsch = ue->dlsch_sldch;
LTE_UE_ULSCH_t *ulsch = ue->ulsch_sldch;
int tx_amp;
uint32_t Nsymb = 7;
// 24 REs/PRB * 2*(Nsymb-1) symbols * 2 bits/RE
uint32_t E = 24*(Nsymb-1)*2*2;
AssertFatal(sldch!=NULL,"ue->sldch is null\n");
AssertFatal(ue->sldch_sdu_active > 0,"ue->sldch_sdu_active isn't active\n");
int mcs = 8;
LOG_I(PHY,"Generating SLDCH for rvidx %d, npsdch %d, first rb %d\n",
rvidx,sldch->n_psdch,nprb);
ue->sldch_sdu_active = 1;
dlsch->harq_processes[0]->nb_rb = 2;
dlsch->harq_processes[0]->TBS = 256;
dlsch->harq_processes[0]->Qm = 2;
dlsch->harq_processes[0]->mimo_mode = SISO;
dlsch->harq_processes[0]->rb_alloc[0] = 0; // unused for SL
dlsch->harq_processes[0]->rb_alloc[1] = 0; // unused for SL
dlsch->harq_processes[0]->rb_alloc[2] = 0; // unused for SL
dlsch->harq_processes[0]->rb_alloc[3] = 0; // unused for SL
dlsch->harq_processes[0]->Nl = 1;
dlsch->harq_processes[0]->round = sldch->j;
dlsch->harq_processes[0]->rvidx = rvidx;
dlsch_encoding0(&ue->frame_parms,
sldch->payload,
0, // means SL
dlsch,
frame_tx,
subframe_tx,
&ue->ulsch_rate_matching_stats,
&ue->ulsch_turbo_encoding_stats,
&ue->ulsch_interleaving_stats);
int Cmux = (Nsymb-1)<<1;
uint8_t *eptr;
for (int i=0,j=0; i<Cmux; i++)
// 24 = 12*(Nsymb-1)*2/(Nsymb-1)
for (int r=0; r<24; r++) {
if (dlsch->harq_processes[0]->Qm == 2) {
eptr=&dlsch->harq_processes[0]->e[((r*Cmux)+i)<<1];
ulsch->h[j++] = *eptr++;
ulsch->h[j++] = *eptr++;
}
else if (dlsch->harq_processes[0]->Qm == 4) {
eptr=&dlsch->harq_processes[0]->e[((r*Cmux)+i)<<2];
ulsch->h[j++] = *eptr++;
ulsch->h[j++] = *eptr++;
ulsch->h[j++] = *eptr++;
ulsch->h[j++] = *eptr++;
}
else {
AssertFatal(1==0,"64QAM not supported for SL\n");
}
}
// scrambling
uint32_t cinit=510;
ulsch->harq_processes[0]->nb_rb = 2;
ulsch->harq_processes[0]->first_rb = nprb;
ulsch->harq_processes[0]->mcs = 8;
ulsch->Nsymb_pusch = ((Nsymb-1)<<1);
ue->sl_chan = PSDCH;
ue->tx_power_dBm[subframe_tx] = 3;
ue->tx_total_RE[subframe_tx] = 24;
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
tx_amp = get_tx_amp(ue->tx_power_dBm[subframe_tx],
ue->tx_power_max_dBm,
ue->frame_parms.N_RB_UL,
1);
#else
tx_amp = AMP;
#endif
for (int aa=0; aa<ue->frame_parms.nb_antennas_tx; aa++) {
memset(&ue->common_vars.txdataF[aa][subframe_tx*ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti],
0,
ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti*sizeof(int32_t));
}
ulsch_modulation(ue->common_vars.txdataF,
tx_amp,
frame_tx,
subframe_tx,
&ue->frame_parms,
ulsch,
1,
cinit);
generate_drs_pusch(ue,
NULL,
0,
tx_amp,
subframe_tx,
nprb,
2,
0,
NULL,
0);
}
void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) { void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
AssertFatal(frame_tx<1024 && frame_tx>=0,"frame %d is illegal\n",frame_tx); AssertFatal(frame_tx<1024 && frame_tx>=0,"frame %d is illegal\n",frame_tx);
AssertFatal(subframe_tx<10 && subframe_tx>=0,"subframe %d is illegal\n",subframe_tx); AssertFatal(subframe_tx<10 && subframe_tx>=0,"subframe %d is illegal\n",subframe_tx);
/*
SLDCH_t *sldch = ue->sldch; SLDCH_t *sldch = ue->sldch;
AssertFatal(slsch!=NULL,"SLSCH is null\n"); AssertFatal(sldch!=NULL,"SLDCH is null\n");
uint32_t O = ue->sldch->offsetIndicator; uint32_t O = ue->sldch->offsetIndicator;
uint32_t P = ue->sldch->discPeriod; uint32_t P = ue->sldch->discPeriod;
uint32_t absSF = (frame_tx*10)+subframe_tx; uint32_t absSF = (frame_tx*10)+subframe_tx;
...@@ -80,43 +513,55 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) { ...@@ -80,43 +513,55 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
if (absSF_offset < O) return; if (absSF_offset < O) return;
absSF_modP = absSF_offset%P; if (absSF_offset == 0) sldch->j = 0;
if (absSF_mod == 0) { absSF_modP = absSF_offset%P;
ue->psdch_coded =0;
}
uint64_t SFpos = ((uint64_t)1) << absSF_modP; uint64_t SFpos = ((uint64_t)1) << absSF_modP;
if ((SFpos & slsch->bitmap1) == 0) return; if ((SFpos & sldch->bitmap1) == 0) return;
// if we get here, then this is a potential PSDCH subframe
int rvtab[4] = {0,2,3,1};
int rvidx = rvtab[sldch->j&3];
int nprb;
// compute parameters
AssertFatal(sldch->bitmap_length==4 || sldch->bitmap_length==8 ||
sldch->bitmap_length==12 || sldch->bitmap_length==16 ||
sldch->bitmap_length==30 || sldch->bitmap_length==40 ||
sldch->bitmap_length==42,"SLDCH Bitmap_length %x not supported\n",
sldch->bitmap_length);
int LPSDCH=0;
for (int i=0;i<sldch->bitmap_length;i++) if (((((uint64_t)1)<<i)&sldch->bitmap1) >0) LPSDCH++;
// if we get here, then there is a PSCCH subframe for a potential transmission AssertFatal(LPSDCH>0,"LPSDCH is 0 (bitmap1 %lx, bitmap_length %d)\n",sldch->bitmap1,sldch->bitmap_length);
uint32_t sf_index=40,LPSCCH=0; AssertFatal(sldch->type == disc_type1 || sldch->type == disc_type2B,
for (int i=0;i<40;i++) { "unknown Discovery type %d\n",sldch->type);
if (i==absSF_modP) sf_index=LPSCCH;
if (((((uint64_t)1)<<i) & slsch->bitmap1)>0) LPSCCH++; int N_TX_SLD = 1+sldch->numRepetitions;
uint32_t M_RB_PSDCH_RP = sldch->N_SL_RB;
if (sldch->type == disc_type1) {
int Ni = LPSDCH/N_TX_SLD;
int Nf = M_RB_PSDCH_RP>>1;
int a_ji = (((sldch->j-1)*(Nf/N_TX_SLD)) + (sldch->n_psdch/Ni))%Nf;
int b_1i = sldch->n_psdch%Ni;
if (absSF_modP != ((b_1i*N_TX_SLD)+sldch->j-1)) return;
nprb = 2*a_ji;
}
else {
AssertFatal(1==0,"Discovery Type 2B not supported yet\n");
} }
AssertFatal(sf_index<40,"sf_index not set, should not happen (absSF_modP %d)\n",absSF_modP);
// sf_index now contains the SF index in 0...LPSCCH-1 if (nprb < sldch->N_SL_RB) nprb+=sldch->prb_Start;
// LPSCCH has the number of PSCCH subframes else nprb+=(sldch->prb_End-(sldch->N_SL_RB>>1));
// number of resources blocks per slot times 2 slots sldch_codingmodulation(ue,frame_tx,subframe_tx,nprb,rvidx);
uint32_t M_RB_PSCCH_RP = slsch->N_SL_RB*LPSCCH<<1; ue->psdch_generated=1;
AssertFatal(slsch->n_pscch < (M_RB_PSCCH_RP>>1)*LPSCCH,"n_pscch not in 0..%d\n",
((M_RB_PSCCH_RP>>1)*LPSCCH)-1);
// hard-coded to transmission mode one for now (Section 14.2.1.1 from 36.213 Rel14.3)
uint32_t a1=slsch->n_pscch/LPSCCH;
uint32_t a2=a1+slsch->n_pscch/LPSCCH+(M_RB_PSCCH_RP>>1);
uint32_t b1=slsch->n_pscch%LPSCCH;
uint32_t b2=(slsch->n_pscch + 1 + (a1%(LPSCCH-1)))%LPSCCH;
LOG_I(PHY,"Checking pscch for absSF %d (LPSCCH %d, M_RB_PSCCH_RP %d, a1 %d, a2 %d, b1 %d, b2 %d) pscch_coded %d\n",
absSF, LPSCCH, M_RB_PSCCH_RP,a1,a2,b1,b2,ue->pscch_coded);
ue->slsch_sdu_active = 1;
if (absSF_modP == b1) pscch_codingmodulation(ue,frame_tx,subframe_tx,a1,0);
else if (absSF_modP == b2) pscch_codingmodulation(ue,frame_tx,subframe_tx,a2,1);
else return;
*/
} }
...@@ -398,7 +398,7 @@ void pscch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,uint32_ ...@@ -398,7 +398,7 @@ void pscch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,uint32_
uint32_t amod = a%(slsch->N_SL_RB); uint32_t amod = a%(slsch->N_SL_RB);
if (amod<(slsch->N_SL_RB>>1)) nprb = slsch->prb_Start + amod; if (amod<(slsch->N_SL_RB>>1)) nprb = slsch->prb_Start + amod;
else nprb = slsch->prb_End-slsch->N_SL_RB+amod; else nprb = slsch->prb_End-(slsch->N_SL_RB>>1)+amod;
// Fill in power control later // Fill in power control later
...@@ -497,7 +497,7 @@ void slsch_codingmodulation(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_tx,in ...@@ -497,7 +497,7 @@ void slsch_codingmodulation(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_tx,in
AssertFatal(slsch!=NULL,"ue->slsch is null\n"); AssertFatal(slsch!=NULL,"ue->slsch is null\n");
AssertFatal(ue->slsch_sdu_active > 0,"ue->slsch_sdu_active is G=\n"); AssertFatal(ue->slsch_sdu_active > 0,"ue->slsch_sdu_active isn't active\n");
LOG_I(PHY,"Generating SLSCH for rvidx %d, group_id %d, mcs %d, resource first rb %d, L_crbs %d\n", LOG_I(PHY,"Generating SLSCH for rvidx %d, group_id %d, mcs %d, resource first rb %d, L_crbs %d\n",
slsch->rvidx,slsch->group_destination_id,slsch->mcs,slsch->RB_start,slsch->L_CRBs); slsch->rvidx,slsch->group_destination_id,slsch->mcs,slsch->RB_start,slsch->L_CRBs);
...@@ -779,8 +779,8 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot) ...@@ -779,8 +779,8 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot)
int16_t **drs_ch_estimates = ue->pusch_slcch->drs_ch_estimates; int16_t **drs_ch_estimates = ue->pusch_slcch->drs_ch_estimates;
int16_t **rxdataF_comp = ue->pusch_slcch->rxdataF_comp; int16_t **rxdataF_comp = ue->pusch_slcch->rxdataF_comp;
int16_t **ul_ch_mag = ue->pusch_slcch->ul_ch_mag; int16_t **ul_ch_mag = ue->pusch_slcch->ul_ch_mag;
int16_t **rxdata_7_5kHz = ue->slcch_rxdata_7_5kHz; int16_t **rxdata_7_5kHz = ue->sl_rxdata_7_5kHz;
int16_t **rxdataF = ue->slcch_rxdataF; int16_t **rxdataF = ue->sl_rxdataF;
int32_t avgs; int32_t avgs;
uint8_t log2_maxh=0; uint8_t log2_maxh=0;
int32_t avgU[2]; int32_t avgU[2];
...@@ -791,29 +791,31 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot) ...@@ -791,29 +791,31 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot)
if (amod<(slsch->N_SL_RB>>1)) nprb = slsch->prb_Start + amod; if (amod<(slsch->N_SL_RB>>1)) nprb = slsch->prb_Start + amod;
else nprb = slsch->prb_End-slsch->N_SL_RB+amod; else nprb = slsch->prb_End-(slsch->N_SL_RB>>1)+amod;
// slot FEP // slot FEP
RU_t ru_tmp; if (ue->sl_fep_done == 0) {
memset((void*)&ru_tmp,0,sizeof(RU_t)); RU_t ru_tmp;
memset((void*)&ru_tmp,0,sizeof(RU_t));
memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
ru_tmp.N_TA_offset=0; memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
ru_tmp.common.rxdata = ue->common_vars.rxdata; ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdata_7_5kHz = (int32_t**)rxdata_7_5kHz; ru_tmp.common.rxdata = ue->common_vars.rxdata;
ru_tmp.common.rxdataF = (int32_t**)rxdataF; ru_tmp.common.rxdata_7_5kHz = (int32_t**)rxdata_7_5kHz;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx; ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1)+slot); remove_7_5_kHz(&ru_tmp,(subframe_rx<<1)+slot);
#ifdef PSCCH_DEBUG #ifdef PSCCH_DEBUG
write_output("rxsig0_input.m","rxs0_in",&ue->common_vars.rxdata[0][((subframe_rx<<1)+slot)*ue->frame_parms.samples_per_tti>>1],ue->frame_parms.samples_per_tti>>1,1,1); write_output("rxsig0_input.m","rxs0_in",&ue->common_vars.rxdata[0][((subframe_rx<<1)+slot)*ue->frame_parms.samples_per_tti>>1],ue->frame_parms.samples_per_tti>>1,1,1);
write_output("rxsig0_7_5kHz.m","rxs0_7_5kHz",rxdata_7_5kHz[0],ue->frame_parms.samples_per_tti,1,1); write_output("rxsig0_7_5kHz.m","rxs0_7_5kHz",rxdata_7_5kHz[0],ue->frame_parms.samples_per_tti,1,1);
#endif #endif
for (int l=0; l<Nsymb; l++) slot_fep_ul(&ru_tmp,l,(subframe_rx<<1)+slot,0);
}
// extract symbols from slot // extract symbols from slot
for (int l=0; l<Nsymb; l++) { for (int l=0; l<Nsymb; l++) {
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1)+slot,0);
ulsch_extract_rbs_single((int32_t **)rxdataF, ulsch_extract_rbs_single((int32_t **)rxdataF,
(int32_t **)rxdataF_ext, (int32_t **)rxdataF_ext,
nprb, nprb,
...@@ -1116,8 +1118,8 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1116,8 +1118,8 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
int16_t **drs_ch_estimates = ue->pusch_slsch->drs_ch_estimates; int16_t **drs_ch_estimates = ue->pusch_slsch->drs_ch_estimates;
int16_t **rxdataF_comp = ue->pusch_slsch->rxdataF_comp; int16_t **rxdataF_comp = ue->pusch_slsch->rxdataF_comp;
int16_t **ul_ch_mag = ue->pusch_slsch->ul_ch_mag; int16_t **ul_ch_mag = ue->pusch_slsch->ul_ch_mag;
int16_t **rxdata_7_5kHz = ue->slsch_rxdata_7_5kHz; int16_t **rxdata_7_5kHz = ue->sl_rxdata_7_5kHz;
int16_t **rxdataF = ue->slsch_rxdataF; int16_t **rxdataF = ue->sl_rxdataF;
int32_t avgs; int32_t avgs;
uint8_t log2_maxh=0; uint8_t log2_maxh=0;
int32_t avgU[2]; int32_t avgU[2];
...@@ -1126,23 +1128,30 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1126,23 +1128,30 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
LOG_I(PHY,"slsch_decoding %d.%d => lmod10 %d\n",frame_rx,subframe_rx,ljmod10); LOG_I(PHY,"slsch_decoding %d.%d => lmod10 %d\n",frame_rx,subframe_rx,ljmod10);
// slot FEP // slot FEP
RU_t ru_tmp; if (ue->sl_fep_done == 0) {
memset((void*)&ru_tmp,0,sizeof(RU_t)); ue->sl_fep_done = 1;
RU_t ru_tmp;
memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); memset((void*)&ru_tmp,0,sizeof(RU_t));
ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdata = ue->common_vars.rxdata; memcpy((void*)&ru_tmp.frame_parms,(void*)&ue->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
ru_tmp.common.rxdata_7_5kHz = (int32_t**)rxdata_7_5kHz; ru_tmp.N_TA_offset=0;
ru_tmp.common.rxdataF = (int32_t**)rxdataF; ru_tmp.common.rxdata = ue->common_vars.rxdata;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx; ru_tmp.common.rxdata_7_5kHz = (int32_t**)rxdata_7_5kHz;
ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1));
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1)+1);
remove_7_5_kHz(&ru_tmp,(subframe_rx<<1));
// extract symbols from slot remove_7_5_kHz(&ru_tmp,(subframe_rx<<1)+1);
for (int l=0; l<Nsymb; l++) { for (int l=0; l<Nsymb; l++) {
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1),0); slot_fep_ul(&ru_tmp,l,(subframe_rx<<1),0);
if (l<Nsymb-1) // skip last symbol in second slot
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1)+1,0);
}
LOG_I(PHY,"SLSCH Slot FEP %d.%d\n",frame_rx,subframe_rx);
}
// extract symbols from slot
for (int l=0; l<Nsymb; l++) {
ulsch_extract_rbs_single((int32_t**)rxdataF, ulsch_extract_rbs_single((int32_t**)rxdataF,
(int32_t**)rxdataF_ext, (int32_t**)rxdataF_ext,
slsch->RB_start, slsch->RB_start,
...@@ -1152,8 +1161,6 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1152,8 +1161,6 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
&ue->frame_parms); &ue->frame_parms);
if (l<Nsymb-1) { // skip last symbol in second slot if (l<Nsymb-1) { // skip last symbol in second slot
slot_fep_ul(&ru_tmp,l,(subframe_rx<<1)+1,0);
ulsch_extract_rbs_single((int32_t**)rxdataF, ulsch_extract_rbs_single((int32_t**)rxdataF,
(int32_t**)rxdataF_ext, (int32_t**)rxdataF_ext,
slsch->RB_start, slsch->RB_start,
...@@ -1263,9 +1270,9 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1263,9 +1270,9 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
rxdataF_comp[0], rxdataF_comp[0],
slsch->L_CRBs*12); slsch->L_CRBs*12);
//#ifdef PSSCH_DEBUG #ifdef PSSCH_DEBUG
write_output("slsch_rxF_comp.m","slschrxF_comp",rxdataF_comp[0],ue->frame_parms.N_RB_UL*12*14,1,1); write_output("slsch_rxF_comp.m","slschrxF_comp",rxdataF_comp[0],ue->frame_parms.N_RB_UL*12*14,1,1);
//#endif #endif
int E = 12*Qm*slsch->L_CRBs*((Nsymb-1)<<1); int E = 12*Qm*slsch->L_CRBs*((Nsymb-1)<<1);
...@@ -1316,10 +1323,11 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1316,10 +1323,11 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
} }
} }
#ifdef PSSCH_DEBUG
write_output("slsch_llr.m","slschllr",ue->slsch_ulsch_llr, write_output("slsch_llr.m","slschllr",ue->slsch_ulsch_llr,
12*Qm*(ue->frame_parms.symbols_per_tti), 12*slsch->L_CRBs*Qm*(ue->frame_parms.symbols_per_tti-2),
1,0); 1,0);
#endif
// unscrambling // unscrambling
...@@ -1414,6 +1422,7 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra ...@@ -1414,6 +1422,7 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
else LOG_I(PHY,"sLSCH received in error for rvidx %d round %d (L_CRBs %d, mcs %d)\n", else LOG_I(PHY,"sLSCH received in error for rvidx %d round %d (L_CRBs %d, mcs %d)\n",
slsch->rvidx,(ue->dlsch_rx_slsch->harq_processes[0]->round+3)&3,slsch->L_CRBs,slsch->mcs); slsch->rvidx,(ue->dlsch_rx_slsch->harq_processes[0]->round+3)&3,slsch->L_CRBs,slsch->mcs);
} }
void rx_slsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, int frame_rx,int subframe_rx) { void rx_slsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, int frame_rx,int subframe_rx) {
......
...@@ -1192,6 +1192,7 @@ typedef struct PHY_VARS_eNB_s { ...@@ -1192,6 +1192,7 @@ typedef struct PHY_VARS_eNB_s {
#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg #define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg
#define MAX_SLDCH 16
/// Top-level PHY Data Structure for UE /// Top-level PHY Data Structure for UE
typedef struct { typedef struct {
/// \brief Module ID indicator for this instance /// \brief Module ID indicator for this instance
...@@ -1265,18 +1266,23 @@ typedef struct { ...@@ -1265,18 +1266,23 @@ typedef struct {
// This is for SIC in the UE, to store the reencoded data // This is for SIC in the UE, to store the reencoded data
LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX]; LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX];
// Sidelink-specific variables // Sidelink-specific variables
int sl_fep_done;
SL_chan_t sl_chan; SL_chan_t sl_chan;
LTE_eNB_DLSCH_t *dlsch_slsch; LTE_eNB_DLSCH_t *dlsch_slsch;
LTE_UE_ULSCH_t *ulsch_slsch; LTE_UE_ULSCH_t *ulsch_slsch;
LTE_eNB_PUSCH *pusch_slsch; LTE_eNB_PUSCH *pusch_slsch;
LTE_eNB_DLSCH_t *dlsch_sldch;
LTE_UE_ULSCH_t *ulsch_sldch;
LTE_eNB_PUSCH *pusch_sldch;
LTE_eNB_PUSCH *pusch_slcch; LTE_eNB_PUSCH *pusch_slcch;
LTE_UE_DLSCH_t *dlsch_rx_slsch; LTE_UE_DLSCH_t *dlsch_rx_slsch;
int16_t **slsch_rxdataF; LTE_UE_DLSCH_t *dlsch_rx_sldch[MAX_SLDCH];
int16_t **slcch_rxdataF; int16_t **sl_rxdataF;
int16_t **slsch_rxdata_7_5kHz; int16_t **sl_rxdata_7_5kHz;
int16_t **slcch_rxdata_7_5kHz;
int16_t *slsch_dlsch_llr; int16_t *slsch_dlsch_llr;
int16_t *slsch_ulsch_llr; int16_t *slsch_ulsch_llr;
int16_t *sldch_dlsch_llr;
int16_t *sldch_ulsch_llr;
SLSCH_t *slsch; SLSCH_t *slsch;
SLSCH_t slsch_rx; SLSCH_t slsch_rx;
int slsch_active; int slsch_active;
...@@ -1288,6 +1294,8 @@ typedef struct { ...@@ -1288,6 +1294,8 @@ typedef struct {
uint32_t slsch_txcnt; uint32_t slsch_txcnt;
uint32_t slsch_errors; uint32_t slsch_errors;
uint32_t slsch_rxcnt[4]; uint32_t slsch_rxcnt[4];
SLDCH_t *sldch;
int sldch_sdu_active;
//Paging parameters //Paging parameters
uint32_t IMSImod1024; uint32_t IMSImod1024;
uint32_t PF; uint32_t PF;
...@@ -1368,6 +1376,7 @@ typedef struct { ...@@ -1368,6 +1376,7 @@ typedef struct {
uint8_t pscch_coded; uint8_t pscch_coded;
uint8_t pscch_generated; uint8_t pscch_generated;
uint8_t pssch_generated; uint8_t pssch_generated;
uint8_t psdch_generated;
uint8_t generate_prach; uint8_t generate_prach;
uint8_t prach_cnt; uint8_t prach_cnt;
uint8_t prach_PreambleIndex; uint8_t prach_PreambleIndex;
......
...@@ -355,10 +355,9 @@ typedef enum { ...@@ -355,10 +355,9 @@ typedef enum {
PSCCH_34_ODD=4, PSCCH_34_ODD=4,
PSSCH_12=5, PSSCH_12=5,
PSSCH_34=6, PSSCH_34=6,
PSDCH_EVEN=7, PSDCH=7,
PSDCH_ODD=8, PSBCH=8,
PSBCH=9, MAX_SLTYPES=9
MAX_SLTYPES=10
} SL_chan_t; } SL_chan_t;
/// DeltaFList-PUCCH from 36.331 RRC spec /// DeltaFList-PUCCH from 36.331 RRC spec
......
...@@ -62,12 +62,14 @@ int main(int argc, char **argv) { ...@@ -62,12 +62,14 @@ int main(int argc, char **argv) {
PHY_VARS_UE *UE; PHY_VARS_UE *UE;
int log_level = LOG_INFO; int log_level = LOG_INFO;
SLSCH_t slsch; SLSCH_t slsch;
SLDCH_t sldch;
SCM_t channel_model=AWGN; SCM_t channel_model=AWGN;
UE_rxtx_proc_t proc; UE_rxtx_proc_t proc;
double snr0 = 35; double snr0 = 35;
double snr_step=1; double snr_step=1;
double snr_int=1; double snr_int=1;
uint8_t slsch_payload[768*9]; uint8_t slsch_payload[768*9];
uint8_t sldch_payload[32];
int mcs=10; int mcs=10;
int nb_rb=20; int nb_rb=20;
char channel_model_input[20]; char channel_model_input[20];
...@@ -235,7 +237,8 @@ int main(int argc, char **argv) { ...@@ -235,7 +237,8 @@ int main(int argc, char **argv) {
UE->N_TA_offset = 0; UE->N_TA_offset = 0;
UE->hw_timing_advance = 0; UE->hw_timing_advance = 0;
UE->slsch = &slsch; UE->slsch = &slsch;
// SL Configuration UE->sldch = &sldch;
// SLSCH/CCH Configuration
slsch.N_SL_RB = 20; slsch.N_SL_RB = 20;
slsch.prb_Start = 5; slsch.prb_Start = 5;
slsch.prb_End = 44; slsch.prb_End = 44;
...@@ -264,10 +267,28 @@ int main(int argc, char **argv) { ...@@ -264,10 +267,28 @@ int main(int argc, char **argv) {
slsch.L_CRBs = nb_rb; slsch.L_CRBs = nb_rb;
slsch.payload_length = get_TBS_UL(slsch.mcs,slsch.L_CRBs); slsch.payload_length = get_TBS_UL(slsch.mcs,slsch.L_CRBs);
slsch.payload = slsch_payload; slsch.payload = slsch_payload;
// SLDCH Configuration
sldch.type = disc_type1;
sldch.N_SL_RB = 8;
sldch.prb_Start = 15;
sldch.prb_End = 34;
sldch.offsetIndicator = 0;
/// 128 frame
sldch.discPeriod = 128;
// 1 transmission per period
sldch.numRepetitions = 1;
// 4 transmissions per SLDCH sdu
sldch.numRetx = 3;
// 16 TXops
sldch.bitmap1 = 0xffff;
sldch.bitmap_length = 16;
sldch.payload_length = 256;
// copy sidelink parameters, PSCCH and PSSCH payloads will get overwritten // copy sidelink parameters, PSCCH and PSSCH payloads will get overwritten
memcpy((void*)&UE->slsch_rx,(void*)UE->slsch,sizeof(SLSCH_t)); memcpy((void*)&UE->slsch_rx,(void*)UE->slsch,sizeof(SLSCH_t));
for (int i=0;i<768*9;i++) slsch_payload[i] = taus()&255; for (int i=0;i<768*9;i++) slsch_payload[i] = taus()&255;
for (int i=0;i<32;i++) sldch_payload[i] = taus()&255;
// 0dBm transmit power for PSCCH = 0dBm - 10*log10(12) dBm/RE // 0dBm transmit power for PSCCH = 0dBm - 10*log10(12) dBm/RE
...@@ -279,19 +300,22 @@ int main(int argc, char **argv) { ...@@ -279,19 +300,22 @@ int main(int argc, char **argv) {
UE->slsch_txcnt = 0; UE->slsch_txcnt = 0;
UE->slsch_rxcnt[0] = 0; UE->slsch_rxcnt[1] = 0; UE->slsch_rxcnt[2] = 0; UE->slsch_rxcnt[3] = 0; UE->slsch_rxcnt[0] = 0; UE->slsch_rxcnt[1] = 0; UE->slsch_rxcnt[2] = 0; UE->slsch_rxcnt[3] = 0;
pscch_errors=0; pscch_errors=0;
UE->sl_fep_done = 0;
for (trials = 0;trials<n_trials;trials++) { for (trials = 0;trials<n_trials;trials++) {
UE->pscch_coded=0; UE->pscch_coded=0;
UE->pscch_generated=0; UE->pscch_generated=0;
UE->psdch_generated=0;
for (int absSF=0;absSF<10240;absSF++) { for (int absSF=0;absSF<10240;absSF++) {
frame = absSF/10; frame = absSF/10;
subframe= absSF%10; subframe= absSF%10;
check_and_generate_psdch(UE,frame,subframe);
UE->slsch_active = 1; UE->slsch_active = 1;
check_and_generate_pscch(UE,frame,subframe); check_and_generate_pscch(UE,frame,subframe);
proc.subframe_tx = subframe; proc.subframe_tx = subframe;
proc.frame_tx = frame; proc.frame_tx = frame;
check_and_generate_pssch(UE,&proc,frame,subframe); check_and_generate_pssch(UE,&proc,frame,subframe);
if (UE->pscch_generated > 0 || UE->pssch_generated > 0) { if (UE->psdch_generated>0 || UE->pscch_generated > 0 || UE->pssch_generated > 0) {
AssertFatal(UE->pscch_generated<3,"Illegal pscch_generated %d\n",UE->pscch_generated); AssertFatal(UE->pscch_generated<3,"Illegal pscch_generated %d\n",UE->pscch_generated);
// FEP // FEP
ulsch_common_procedures(UE,&proc,0); ulsch_common_procedures(UE,&proc,0);
...@@ -301,12 +325,13 @@ int main(int argc, char **argv) { ...@@ -301,12 +325,13 @@ int main(int argc, char **argv) {
// write_output("rxsig0.m","rxs0",&UE->common_vars.rxdata[0][UE->frame_parms.samples_per_tti*subframe],UE->frame_parms.samples_per_tti,1,1); // write_output("rxsig0.m","rxs0",&UE->common_vars.rxdata[0][UE->frame_parms.samples_per_tti*subframe],UE->frame_parms.samples_per_tti,1,1);
UE->pscch_generated = 0; UE->pscch_generated = 0;
UE->pssch_generated = 0; UE->pssch_generated = 0;
UE->psdch_generated = 0;
} }
rx_slcch(UE,frame,subframe); rx_slcch(UE,frame,subframe);
rx_slsch(UE,&proc,frame,subframe); rx_slsch(UE,&proc,frame,subframe);
UE->sl_fep_done = 0;
if ((absSF%320) == 319) { if ((absSF%320) == 319) {
if (UE->slcch_received == 0) pscch_errors++; if (UE->slcch_received == 0) pscch_errors++;
break; break;
......
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