Commit e3fd9f7f authored by Roberto Louro Magueta's avatar Roberto Louro Magueta

To use the channel generated by multipath_channel() for single-layer case in ulsim

parent b6a01808
...@@ -1251,34 +1251,36 @@ int main(int argc, char **argv) ...@@ -1251,34 +1251,36 @@ int main(int argc, char **argv)
} }
} }
// The multipath_channel() function calculates a channel matrix with only 1's. So the channel rank is 1, and we
if (UE2gNB->max_Doppler == 0) // cannot use multi-layer. To solve this issue, for now we use the H_awgn_mimo matrix for multi-layer.
multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0); if (precod_nbr_layers == 1) {
else if (UE2gNB->max_Doppler == 0) {
multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0); multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
} else {
for (i=0; i<slot_length; i++) { multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) { }
if (channel_model == AWGN) { } else {
double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0
double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0 {0.2, 1.0, 0.2, 0.1}, //rx 1
{0.2, 1.0, 0.2, 0.1}, //rx 1 {0.1, 0.2, 1.0, 0.2}, //rx 2
{0.1, 0.2, 1.0, 0.2}, //rx 2 {0.05, 0.1, 0.2, 1.0}}; //rx 3
{0.05, 0.1, 0.2, 1.0}}; //rx 3 for (i=0; i<slot_length; i++) {
for (ap = 0; ap < frame_parms->nb_antennas_rx; ap++) {
// sum up signals from different Tx antennas // sum up signals from different Tx antennas
r_re[ap][i] = 0; r_re[ap][i] = 0;
r_im[ap][i] = 0; r_im[ap][i] = 0;
for (int aa=0; aa<n_tx; aa++) { for (int aa=0; aa<n_tx; aa++) {
r_re[ap][i] += s_re[aa][i]*H_awgn_mimo[ap][aa]; r_re[ap][i] += s_re[aa][i]*H_awgn_mimo[ap][aa];
r_im[ap][i] += s_im[aa][i]*H_awgn_mimo[ap][aa]; r_im[ap][i] += s_im[aa][i]*H_awgn_mimo[ap][aa];
} }
} }
}
}
for (i=0; i<slot_length; i++) {
for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */ /* Add phase noise if enabled */
if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)], phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)],
......
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