Commit 2d7336a6 authored by Khodr Saaifan's avatar Khodr Saaifan Committed by Thomas Schlichter

Fix UE measurements and add TM4 feedback CQI and Rank Indicator

parent 8a14d72a
*.cproject
*.project
*.c~
cmake_targets/*.txt
cmake_targets/log/*
cmake_targets/lte_noS1_build_oai/*.txt
cmake_targets/lte_noS1_build_oai/build/*
cmake_targets/rxsig_frame0.dat
targets/bin/*
\ No newline at end of file
......@@ -27,6 +27,10 @@
#include "SCHED/extern.h"
#include "log.h"
#include "PHY/sse_intrin.h"
//SFN
#include "sudas_tm4.h"
//#include <stdio.h>
//#include <stdlib.h>
//#define k1 1000
#define k1 ((long long int) 1000)
......@@ -36,7 +40,7 @@
//#define DEBUG_MEAS_UE
//#define DEBUG_RANK_EST
int16_t cond_num_threshold = 0;
int16_t cond_num_threshold = 5;
#ifdef USER_MODE
void print_shorts(char *s,short *x)
......@@ -205,13 +209,16 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
((ue->frame_parms.frame_type == TDD) && ((subframe == 1) || (subframe == 6)))
)
{ // FDD PSS/SSS, compute noise in DTX REs
ue->measurements.n0_power_tot = 0;//clear to avoid accum
if (ue->frame_parms.Ncp==NORMAL) {
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
if(ue->frame_parms.frame_type == FDD)
{
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
//rxF_sss points to OFDM symbol 5*N, thus the +ve subcarrier starts from rxF_sss[0]:dc rxF_sss[1] ... rxF_sss[150]
//rxF_sss points to OFDM symbol 6*N, thus the +ve subcarrier starts from rxF_pss[0]:dc rxF_pss[1] ... rxF_pss[150]
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
}
else
......@@ -219,22 +226,22 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(2*ue->frame_parms.ofdm_symbol_size)];
}
//-ve spectrum from SSS
//+ve spectrum from SSS
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
// printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from PSS
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
if(ue->frame_parms.frame_type == FDD)
//+ve spectrum from SSS//0 dc 1:1:31 sss (2k 2k+1): k=32 33 34 35 36 are null signal
ue->measurements.n0_power[aarx] = (int32_t)(rxF_sss[66]*rxF_sss[66])+(int32_t)(rxF_sss[67]*rxF_sss[67]);//k=33 ->(66 67)
ue->measurements.n0_power[aarx] += (int32_t)(rxF_sss[68]*rxF_sss[68])+(int32_t)(rxF_sss[69]*rxF_sss[69]);//k=34 ->(68 69)
ue->measurements.n0_power[aarx] += (int32_t)(rxF_sss[70]*rxF_sss[70])+(int32_t)(rxF_sss[71]*rxF_sss[71]);//k=35 ->(70 71)
//+ve spectrum from PSS//0 dc 1:1:31 sss (2k 2k+1): k=32 33 34 35 36 37
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[66]*rxF_pss[66])+(int32_t)(rxF_pss[67]*rxF_pss[67]);
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[68]*rxF_pss[68])+(int32_t)(rxF_pss[69]*rxF_pss[69]);
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[70]*rxF_pss[70])+(int32_t)(rxF_pss[71]*rxF_pss[71]);//>>15
if(ue->frame_parms.frame_type == FDD)
{
//rxF_sss points to OFDM symbol 6*N, thus the -ve subcarrier of sss starts from rxF_sss[-1] ... rxF_sss[-150]
//rxF_sss points to OFDM symbol 7*N, thus the -ve subcarrier of pss starts from rxF_pss[-1] ... rxF_pss[-150]
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
}
......@@ -243,26 +250,26 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)];
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(3*ue->frame_parms.ofdm_symbol_size)];
}
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65]));
ue->measurements.n0_power[aarx] = (((int32_t)rxF_sss[-70]*rxF_sss[-70])+((int32_t)rxF_sss[-69]*rxF_sss[-69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-68]*rxF_sss[-68])+((int32_t)rxF_sss[-67]*rxF_sss[-67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-66]*rxF_sss[-66])+((int32_t)rxF_sss[-65]*rxF_sss[-65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12);
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
//-ve spectrum from SSS// -1:-1:-31 sss (2k+1 2k): k=-32 -33 -34 -35 -36 -37 are null signal
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[-70]*rxF_pss[-70])+(int32_t)(rxF_pss[-69]*rxF_pss[-69]);//k=-35 ->(-69 -70)
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[-68]*rxF_pss[-68])+(int32_t)(rxF_pss[-67]*rxF_pss[-67]);//k=-34 ->(-67 -68)
ue->measurements.n0_power[aarx] += (int32_t)(rxF_pss[-66]*rxF_pss[-66])+(int32_t)(rxF_pss[-65]*rxF_pss[-65]);//k=-33 ->(-65 -66)
ue->measurements.n0_power[aarx] += (int32_t)(rxF_sss[-70]*rxF_sss[-70])+(int32_t)(rxF_sss[-69]*rxF_sss[-69]);
ue->measurements.n0_power[aarx] += (int32_t)(rxF_sss[-68]*rxF_sss[-68])+(int32_t)(rxF_sss[-67]*rxF_sss[-67]);
ue->measurements.n0_power[aarx] += (int32_t)(rxF_sss[-66]*rxF_sss[-66])+(int32_t)(rxF_sss[-65]*rxF_sss[-65]);
ue->measurements.n0_power[aarx]=(ue->measurements.n0_power[aarx])/12;//per one antenna
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]);
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];//per two antenna
}
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/aarx);//(unsigned short) dB_fixed(ue->measurements.n0_power_tot/aarx);
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx));
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
} else {
LOG_E(PHY, "Not yet implemented: noise power calculation when prefix length = EXTENDED\n");
}
......@@ -298,7 +305,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
// printf("sssp32 %d\n",ue->measurements.n0_power[aarx]);
//+ve spectrum from PSS
//+ve spectrum from PSS n0_power
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67]));
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
......@@ -316,7 +323,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
}
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx));
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(aarx));
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
//LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot);
......@@ -330,18 +337,13 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
if (eNB_offset > 0)
Nid_cell = ue->measurements.adj_cell_id[eNB_offset-1];
nushift = Nid_cell%6;
ue->measurements.rsrp[eNB_offset] = 0;
///////////////////////we are here
if (abstraction_flag == 0) {
// compute RSRP using symbols 0 and 4-frame_parms->Ncp
for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) {
k = (nu + nushift)%6;
#ifdef DEBUG_MEAS_RRC
......@@ -353,32 +355,38 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
off = (ue->frame_parms.first_carrier_offset+k)<<1;
if (l==(4-ue->frame_parms.Ncp)) {
if (l==(4-ue->frame_parms.Ncp)) { // compute RSRP using symbols 4-frame_parms->Ncp
for (rb=0; rb<ue->frame_parms.N_RB_DL; rb++) {
// printf("rb %d, off %d, off2 %d\n",rb,off,off2);
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
// printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
// if ((ue->frame_rx&0x3ff) == 0)
// printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
off+=12;
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
off = (1+k)<<1;
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
//starts RB0 two pilots at off and off+12
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));//pilot symbol at reference signal +ve
off+=12;//2 pilot per RB (2*6=12)
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));//pilot symbol at reference signal +ve
off+=12;//2 pilot per RB (2*6=12)
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
{
off = (1+k)<<1;//start second half of the spectrum
}
//off+=12;//one pilot per RB
//check for +ve freq portion
//if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
//{
// off = (1+k)<<1;
// ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
// printf("rb %d, off %d : %d\n",rb,off,(((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
/*
if ((ue->frame_rx&0x3ff) == 0)
printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
*/
off+=12;
//off+=12;
//}
//else//we start with -ve spectrum starts from off to
//{
// ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));//pilot symbol at reference signal +ve
// off+=12;//2 pilot per RB (2*6=12)
//}
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
off = (1+k)<<1;
}
......@@ -397,15 +405,16 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
}
}
// 2 RE per PRB
// ue->measurements.rsrp[eNB_offset]/=(24*ue->frame_parms.N_RB_DL);
ue->measurements.rsrp[eNB_offset]/=(2*ue->frame_parms.N_RB_DL*ue->frame_parms.ofdm_symbol_size);
// 2 RE per PRB l=4 only
//I am here
// ue->measurements.rsrp[eNB_offset]/=(ue->frame_parms.N_RB_DL);
ue->measurements.rsrp[eNB_offset]/=(2*ue->frame_parms.N_RB_DL*ue->frame_parms.ofdm_symbol_size);//we read
// LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,ue->measurements.rsrp[eNB_offset]);
if (eNB_offset == 0) {
// ue->measurements.rssi/=(24*ue->frame_parms.N_RB_DL);
// ue->measurements.rssi*=rx_power_correction;
// ue->measurements.rssi=ue->measurements.rsrp[0]*24/2;
ue->measurements.rssi=ue->measurements.rsrp[0]*(12*ue->frame_parms.N_RB_DL);
ue->measurements.rssi=ue->measurements.rsrp[0]*(12*ue->frame_parms.N_RB_DL);//watt
}
if (ue->measurements.rssi>0)
......@@ -477,8 +486,16 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
int nb_subbands,subband_size,last_subband_size;
int N_RB_DL = frame_parms->N_RB_DL;
#ifdef FHG_TM4_LOG
static int rx_spatial_power_UE_I=0;
static int rx_ri_UE_I=0;
#endif
#ifdef FHG_TM4_LOG_CQI
static int rx_cqi_UE_I=0;
#endif
int rank_tm3_tm4;
int rank_tm3_tm4=0;
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
......@@ -515,11 +532,9 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
(signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
(N_RB_DL*12)));
//- ue->measurements.n0_power[aarx];
(N_RB_DL*12)));//signal power is NE{|A_k|^2}--> should divide by 2^15 back to fixed point due to mult
if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
......@@ -541,27 +556,51 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
} //eNB_id
eNB_id=0;
if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){
if (rank_adaptation == 1)
rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4],
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4],
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4],
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4],
//sfn: I shall enable rank estimation first
//Then, I can read the rank value.
//hardcoded
//if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){
//if (rank_adaptation == 1)
#ifdef FHG_TM4
rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4],
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4],//2
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4],//1
&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4],//3
N_RB_DL);
else
rank_tm3_tm4=1;
#ifdef DEBUG_RANK_EST
printf("rank tm3 or tm4 %d\n", rank_tm3_tm4);
#endif
}
if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
ue->measurements.rank[eNB_id] = 0;
else
ue->measurements.rank[eNB_id] = rank_tm3_tm4;
#endif
//sfn:
//else
// rank_tm3_tm4=1;
//#ifdef DEBUG_RANK_EST
// printf("rank tm3 or tm4 %d\n", rank_tm3_tm4);
//#endif
// }
// if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
// ue->measurements.rank[eNB_id] = 0;
// else
#ifdef FHG_TM4_LOG
rx_ri_UE_I++;
if (rx_ri_UE_I>6000)
{
rx_ri_UE_I=0;
LOG_I(PHY,"[UE][UCI--->PUSCH] meas->rank %d\n",rank_tm3_tm4);
}
#endif
ue->measurements.rank[eNB_id] = rank_tm3_tm4;
// printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
// printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
......@@ -586,13 +625,12 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
}
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed(ue->measurements.rx_power_avg[eNB_id])-45 -3;//we subtract correction factor since channel estimation add 3 dB to signal power
ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot)-3-3;//we subtract correction factor since channel estimation add 3 dB to signal power. Furthermore, we subtract 3 dB since rx power is collected from 2 antennas
ue->measurements.wideband_cqi_avg[eNB_id] =dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg)-3-3;
ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id]-ue->rx_total_gain_dB+30-2;//-2.3: correction factor 10log10(300/512)
#ifdef DEBUG_MEAS_UE
LOG_I(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
eNB_id,
LOG_I(PHY,"Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
subframe,
ue->measurements.rx_rssi_dBm[eNB_id],
ue->measurements.rx_power_avg_dB[eNB_id],
......@@ -600,8 +638,36 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
ue->measurements.rx_power_avg[eNB_id],
ue->measurements.n0_power_tot);
#endif
}
#ifdef FHG_TM4_LOG_CQI
rx_cqi_UE_I++;
if (rx_cqi_UE_I>6000)
{
rx_cqi_UE_I=0;
LOG_I(PHY,"rx1_p %d, rx2_p %d, rxtot_p %d rxtot_p %d dB\n",
ue->measurements.rx_power[eNB_id][0],
ue->measurements.rx_power[eNB_id][1],
ue->measurements.rx_power_tot[eNB_id],
ue->measurements.rx_power_tot_dB[eNB_id]);
LOG_I(PHY,"rx_p_avg %d, n0PwrAvg %d, rx_p_tot %d n0Pwrtot %d\n",
ue->measurements.rx_power_avg[eNB_id],
ue->measurements.n0_power_avg,
ue->measurements.rx_power_tot[eNB_id],
ue->measurements.n0_power_tot);
LOG_I(PHY,"rx_p_avg/n0Pwravg %d dB, rx_p_tot/n0Pwrtot %d dB\n",
ue->measurements.wideband_cqi_avg[eNB_id],
ue->measurements.wideband_cqi_tot[eNB_id]
);
LOG_I(PHY,"RSSI (digital) %d dB RSSI %d dBm\n",
ue->measurements.rx_power_avg_dB[eNB_id],
ue->measurements.rx_rssi_dBm[eNB_id]
);
}
#endif
}
ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg);
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
......@@ -619,28 +685,21 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
if ((subband<(nb_subbands-1))||(N_RB_DL==6)) {
/*for (i=0;i<48;i++)
msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
*/
ue->measurements.subband_cqi[eNB_id][aarx][subband] =
(signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size));
(signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size))>>1;//divide by to correct sqrt(2)
if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0)
ue->measurements.subband_cqi[eNB_id][aarx][subband]=0;
/*
else
ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx];
*/
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
ue->measurements.n0_power[aarx]);
} else { // this is for the last subband which is smaller in size
// for (i=0;i<12;i++)
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) +
signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx];
signal_energy_nodc(dl_ch1,last_subband_size))>>1;
if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0)
ue->measurements.subband_cqi[eNB_id][aarx][subband]=0;
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
ue->measurements.n0_power[aarx]);
......@@ -661,9 +720,11 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
//printf("aarx=%d", aarx);
// skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
//sfn
ue->measurements.wideband_pmi_re[eNB_id][aarx]=0;
ue->measurements.wideband_pmi_im[eNB_id][aarx]=0;
#if defined(__x86_64__) || defined(__i386__)
__m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
__m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmnulltmp0,mmnulltmp00 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
......@@ -680,8 +741,10 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
// pmi
#if defined(__x86_64__) || defined(__i386__)
pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);
pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);
pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);//initialize pmi128_re with zeros
mmnulltmp0 = *(__m128i*)&mmvariable3[0];//_mm_xor_si128(mmnulltmp,mmnulltmp);exp(-45)
mmnulltmp00 = *(__m128i*)&mmvariable[0];//_mm_xor_si128(mmnulltmp,mmnulltmp);exp(135)
pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);//initialize pmi128_re with zeros
#elif defined(__arm__)
pmi128_re = vdupq_n_s32(0);
......@@ -700,11 +763,10 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
// For each RE in subband perform ch0 * conj(ch1)
// For each RE in subband perform ch0 * conj(ch1)//->(ch0.ch1)exp(+j(thetach0-thetach1))
// multiply by conjugated channel
// print_ints("ch0",&dl_ch0_128[0]);
// print_ints("ch1",&dl_ch1_128[0]);
mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
// print_ints("re",&mmtmpPMI0);
mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
......@@ -716,8 +778,12 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[0]);
// print_ints("mm_madd_epi16",&mmtmpPMI1);
// mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
//sfn avoid overflow due to summing up
//sfn: mmtmpPMI0=_mm_srai_epi32(mmtmpPMI0, 15);//fixed point handling
pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
// print_ints(" pmi128_re 0",&pmi128_re);
//sfn avoid overflow due to summing up
//sfn: mmtmpPMI1=_mm_srai_epi32(mmtmpPMI1, 15);//fixed point handling
pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
// print_ints(" pmi128_im 0 ",&pmi128_im);
......@@ -755,11 +821,15 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
dl_ch1_128++;
}
ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2;
ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2;
//pmi128_re
//pmi128_im
ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = ((int )((int)((int *)&pmi128_re)[0] + (int)((int *)&pmi128_re)[1] + (int)((int *)&pmi128_re)[2] + (int)((int *)&pmi128_re)[3]))/((int )(4*limit));//limit*4=subband_size
ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = ((int )((int)((int *)&pmi128_im)[0] + (int)((int *)&pmi128_im)[1] + (int)((int *)&pmi128_im)[2] + (int)((int *)&pmi128_im)[3]))/((int )(4*limit));
ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx];
ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx];
} // subband loop
ue->measurements.wideband_pmi_re[eNB_id][aarx]=ue->measurements.wideband_pmi_re[eNB_id][aarx]/((int )nb_subbands);
ue->measurements.wideband_pmi_im[eNB_id][aarx]=ue->measurements.wideband_pmi_im[eNB_id][aarx]/((int )nb_subbands);
} // rx antenna loop
} // if frame_parms->mode1_flag == 0
else {
......@@ -777,7 +847,11 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
// for (i=0;i<48;i++)
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
ue->measurements.subband_cqi[eNB_id][aarx][subband] =
(signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx];
(signal_energy_nodc(dl_ch0,48)) - ue->measurements.n0_power[aarx];
if (ue->measurements.subband_cqi[eNB_id][aarx][subband]<0)
ue->measurements.subband_cqi[eNB_id][aarx][subband] =0;
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
......@@ -786,6 +860,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
// for (i=0;i<12;i++)
// printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx];
if (ue->measurements.subband_cqi[eNB_id][aarx][subband]<0)
ue->measurements.subband_cqi[eNB_id][aarx][subband] =0;
ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
ue->measurements.n0_power[aarx]);
......@@ -896,7 +972,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
printf("\n shift %d \n" , shift);
printf("\n conj(ch00)ch01 \n");
#endif
//1
conjch0_mult_ch1(ch00_rank,
ch01_rank,
conjch00_ch01,
......@@ -906,7 +982,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch01)ch00 \n");
#endif
//2
conjch0_mult_ch1(ch01_rank,
ch00_rank,
conjch01_ch00,
......@@ -917,7 +993,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
printf("\n conj(ch10)ch11 \n");
#endif
//3
conjch0_mult_ch1(ch10_rank,
ch11_rank,
conjch10_ch11,
......@@ -927,7 +1003,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch11)ch10 \n");
#endif
//4
conjch0_mult_ch1(ch11_rank,
ch10_rank,
conjch11_ch10,
......@@ -937,7 +1013,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch00)ch00 \n");
#endif
//5
conjch0_mult_ch1(ch00_rank,
ch00_rank,
conjch00_ch00,
......@@ -947,7 +1023,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch01)ch01 \n");
#endif
//6
conjch0_mult_ch1(ch01_rank,
ch01_rank,
conjch01_ch01,
......@@ -957,7 +1033,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch10)ch10 \n");
#endif
//7
conjch0_mult_ch1(ch10_rank,
ch10_rank,
conjch10_ch10,
......@@ -966,7 +1042,7 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
#ifdef DEBUG_RANK_EST
printf("\n conj(ch11)ch11 \n");
#endif
//8
conjch0_mult_ch1(ch11_rank,
ch11_rank,
conjch11_ch11,
......@@ -1120,14 +1196,14 @@ void construct_HhH_elements(int *ch0conj_ch0, //00_00
__m128i *ch0conj_ch1_128, *ch1conj_ch0_128, *ch2conj_ch3_128, *ch3conj_ch2_128;
__m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
ch0conj_ch0_128 = (__m128i *)ch0conj_ch0;
ch1conj_ch1_128 = (__m128i *)ch1conj_ch1;
ch2conj_ch2_128 = (__m128i *)ch2conj_ch2;
ch3conj_ch3_128 = (__m128i *)ch3conj_ch3;
ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
ch1conj_ch0_128 = (__m128i *)ch1conj_ch0;
ch2conj_ch3_128 = (__m128i *)ch2conj_ch3;
ch3conj_ch2_128 = (__m128i *)ch3conj_ch2;
ch0conj_ch0_128 = (__m128i *)ch0conj_ch0;//00_00
ch1conj_ch1_128 = (__m128i *)ch1conj_ch1;//01_01
ch2conj_ch2_128 = (__m128i *)ch2conj_ch2;//11_11
ch3conj_ch3_128 = (__m128i *)ch3conj_ch3;//10_10
ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;//00_01
ch1conj_ch0_128 = (__m128i *)ch1conj_ch0;//01_00
ch2conj_ch3_128 = (__m128i *)ch2conj_ch3;//10_11
ch3conj_ch2_128 = (__m128i *)ch3conj_ch2;//11_10
after_mf_00_128 = (__m128i *)after_mf_00;
after_mf_01_128 = (__m128i *)after_mf_01;
after_mf_10_128 = (__m128i *)after_mf_10;
......
......@@ -37,7 +37,8 @@
#endif
#include "assertions.h"
//SFN
#include "sudas_tm4.h"
//#define DEBUG_HARQ
#include "LAYER2/MAC/extern.h"
......@@ -7072,9 +7073,10 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_
else
sinr_tmp = (double) meas->wideband_cqi_avg[eNB_id];
//LOG_I(PHY,"[UE][UCI] Filling CQI format %d for eNB %d N_RB_DL %d\n",uci_format,eNB_id,N_RB_DL);
//LOG_I(PHY,"[UE][UCI--->PUSCH] Filling CQI format %d for eNB %d N_RB_DL %d\n",uci_format,eNB_id,N_RB_DL);
//SFN
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] meas->rank[eNB_id] %d Filling CQI format %d for eNB %d N_RB_DL %d flag_LA %d\n",meas->rank[eNB_id],uci_format,eNB_id,N_RB_DL,flag_LA);
//fflush(debug_sudas_LOG_PHY);
switch (N_RB_DL) {
......@@ -7146,6 +7148,9 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_
break;
case HLC_subband_cqi_nopmi:
//SFN
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] HLC_subband_cqi_nopmi\n");
//fflush(debug_sudas_LOG_PHY);
((HLC_subband_cqi_nopmi_5MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode);
((HLC_subband_cqi_nopmi_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,7);
break;
......@@ -7654,6 +7659,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
// ulsch->harq_processes[harq_pid]->status = ACTIVE;
if (cqi_req == 1) {
if( (AntennaInfoDedicated__transmissionMode_tm3 == transmission_mode) || (AntennaInfoDedicated__transmissionMode_tm4 == transmission_mode) )
......@@ -7664,6 +7670,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
{
ulsch->O_RI = 0;
}
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] transmission_mode %d ulsch->O_RI %d\n",transmission_mode,ulsch->O_RI);
//fflush(debug_sudas_LOG_PHY);
//ulsch->O_RI = 0; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
switch(transmission_mode) {
......
......@@ -37,6 +37,11 @@
#include "PHY/sse_intrin.h"
#include "T.h"
//SFN
#include "sudas_tm4.h"
#ifndef USER_MODE
#define NOCYGWIN_STATIC static
#else
......@@ -147,6 +152,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
break;
case PDSCH:
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"ue->DLSCH: PDSCH; \n");
//fflush(debug_sudas_LOG_PHY);
pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe]];
dlsch = ue->dlsch[ue->current_thread_id[subframe]][eNB_id];
//printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status);
......@@ -319,7 +326,8 @@ int rx_pdsch(PHY_VARS_UE *ue,
dlsch0_harq->mimo_mode);
}
} else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
//1)
nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
......@@ -776,6 +784,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
} */
}
} else {
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"ue->measurements: rx_pdsch: dlsch_detection_mrc(); \n");
//fflush(debug_sudas_LOG_PHY);
dlsch_detection_mrc(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id_i]->rxdataF_comp0,
......@@ -803,6 +814,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb);
*/
} else if (dlsch0_harq->mimo_mode == ALAMOUTI) {
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"ue->measurements: rx_pdsch: dlsch_alamouti(); \n");
// fflush(debug_sudas_LOG_PHY);
dlsch_alamouti(frame_parms,
pdsch_vars[eNB_id]->rxdataF_comp0,
pdsch_vars[eNB_id]->dl_ch_mag0,
......@@ -3457,7 +3471,7 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext,
unsigned char aatx,aarx,pilots=0,symbol_mod;
__m128i *dl_ch128, ch_amp128;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;//0:6
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size
......@@ -3467,6 +3481,8 @@ void dlsch_scale_channel(int **dl_ch_estimates_ext,
}
// Determine scaling amplitude based the symbol
//dlsch_ue[0]->sqrt_rho_b//pilot position
//dlsch_ue[0]->sqrt_rho_a//data position
ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
......
......@@ -23,6 +23,9 @@ extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32];
extern unsigned short lte_cqi_eff1024[16];
extern char lte_cqi_snr_dB[15];
extern short conjugate[8],conjugate2[8];
//sfn
extern short mmvariable[8],mmvariable1[8],mmvariable2[8],mmvariable3[8];
extern short minus_one[8];
extern short minus_one[8];
extern short *ul_ref_sigs[30][2][33];
......
......@@ -35,6 +35,8 @@
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "SCHED/extern.h"
//sfn add display math.c
#include <math.h>
#ifdef OPENAIR2
#include "../openair2/LAYER2/MAC/proto.h"
......@@ -59,15 +61,15 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
return 0;
if ((mode == normal_txrx) || (mode == no_L2_connect)) {
len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",ue->Mod_id, ue->pdcch_vars[0][0]->crnti);
len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, N0 %d dBm/RE (NF %.1f dB)\n",
10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
10*log10(ue->measurements.rsrq[0]),
ue->measurements.n0_power_tot_dBm,
(double)ue->measurements.n0_power_tot_dBm+132.24);
/*
len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x UE Rx Gain in dB %d\n",ue->Mod_id, ue->pdcch_vars[0][0]->crnti,ue->rx_total_gain_dB);
len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, NoisePower/RE %f dBm (Measured Noise Figure %.1f dB)\n",
10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB+30-10*log10(1<<15),
10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB+30-10*log10(1<<15),
10*log10(ue->measurements.rsrq[0])-10*log10(1<<15),
(double)ue->measurements.n0_power_tot_dBm+30-10*log10(1<<15),
(double)ue->measurements.n0_power_tot_dBm+30-10*log10(1<<15)-(-174+10*log10(15000)));//(-174+10*log10(15000))=132.24 dBm
/*/*- ue->rx_total_gain_dB+30-10*dB_fixed(1<<15)*/
len += sprintf(&buffer[len],
"[UE PROC] Frame count: %d\neNB0 RSSI %d dBm/RE (%d dB, %d dB)\neNB1 RSSI %d dBm/RE (%d dB, %d dB)neNB2 RSSI %d dBm/RE (%d dB, %d dB)\nN0 %d dBm/RE, %f dBm/%dPRB (%d dB, %d dB)\n",
proc->frame_rx,
......@@ -85,7 +87,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
ue->frame_parms.N_RB_DL,
ue->measurements.n0_power_dB[0],
ue->measurements.n0_power_dB[1]);
*/
#ifdef EXMIMO
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
......@@ -113,12 +115,25 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
}
//for (eNB=0;eNB<NUMBER_OF_eNB_MAX;eNB++) {
for (eNB=0; eNB<1; eNB++) {
len += sprintf(&buffer[len], "[UE PROC] RX spatial power eNB%d: [%d %d; %d %d] dB\n",
len += sprintf(&buffer[len], "/////////////////////****RX spatial power****////////////////////\n");
len += sprintf(&buffer[len], "[UE PROC] MIMO Channel FRank Indicator :) %d \n",ue->measurements.rank[eNB]);
len += sprintf(&buffer[len], "[UE PROC] RX spatial power eNB%d at Rx N_Power=%.2f dBm/Re : P11=%.2f dBm/RE, P21=%.2f dBm/RE, P12=%.2f dBm/RE, and P22=%.2f dBm/RE\n",
eNB,
ue->measurements.rx_spatial_power_dB[eNB][0][0],
ue->measurements.rx_spatial_power_dB[eNB][0][1],
ue->measurements.rx_spatial_power_dB[eNB][1][0],
ue->measurements.rx_spatial_power_dB[eNB][1][1]);
(double)ue->measurements.n0_power_tot_dBm-20*log10(1<<15)+30+ue->rx_total_gain_dB,
(double)ue->measurements.rx_spatial_power_dB[eNB][0][0]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][0][1]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][1][0]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][1][1]-20*log10(1<<15)-10*log10(512)+30);
len += sprintf(&buffer[len], "[UE PROC] RX spatial power eNB: \n"
" Tx1 ----- P11=%.2f dBm/RE -----> Rx1\n"
" P21=%.2f dBm/RE \n"
" P12=%.2f dBm/RE \n"
" Tx2 ----- P22=%.2f dBm/RE -----> Rx2\n",
(double)ue->measurements.rx_spatial_power_dB[eNB][0][0]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][0][1]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][1][0]-20*log10(1<<15)-10*log10(512)+30,
(double)ue->measurements.rx_spatial_power_dB[eNB][1][1]-20*log10(1<<15)-10*log10(512)+30);
len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,ue->measurements.rx_power_tot_dB[eNB],ue->measurements.rx_power_avg_dB[eNB]);
len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",ue->measurements.rx_power_tot[eNB],
......@@ -128,7 +143,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
switch (ue->frame_parms.N_RB_DL) {
case 6:
len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d] dB\n",
len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (RX Ant 0): [%d %d %d %d %d %d] dB\n",
eNB,
ue->measurements.subband_cqi_dB[eNB][0][0],
ue->measurements.subband_cqi_dB[eNB][0][1],
......@@ -138,7 +153,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
ue->measurements.subband_cqi_dB[eNB][0][5]);
len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d] dB\n",
len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Rx Ant 1): [%d %d %d %d %d %d] dB\n",
eNB,
ue->measurements.subband_cqi_dB[eNB][1][0],
ue->measurements.subband_cqi_dB[eNB][1][1],
......@@ -178,6 +193,9 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
ue->measurements.subband_pmi_re[eNB][5][1],
ue->measurements.subband_pmi_im[eNB][5][1]);
len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d]\n",
eNB,
ue->measurements.selected_rx_antennas[eNB][0],
......@@ -215,39 +233,58 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
ue->measurements.subband_cqi_dB[eNB][1][6]);
len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n",
len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f)]\n",
eNB,
ue->measurements.subband_pmi_re[eNB][0][0],
ue->measurements.subband_pmi_im[eNB][0][0],
ue->measurements.subband_pmi_re[eNB][1][0],
ue->measurements.subband_pmi_im[eNB][1][0],
ue->measurements.subband_pmi_re[eNB][2][0],
ue->measurements.subband_pmi_im[eNB][2][0],
ue->measurements.subband_pmi_re[eNB][3][0],
ue->measurements.subband_pmi_im[eNB][3][0],
ue->measurements.subband_pmi_re[eNB][4][0],
ue->measurements.subband_pmi_im[eNB][4][0],
ue->measurements.subband_pmi_re[eNB][5][0],
ue->measurements.subband_pmi_im[eNB][5][0],
ue->measurements.subband_pmi_re[eNB][6][0],
ue->measurements.subband_pmi_im[eNB][6][0]);
(double)ue->measurements.subband_pmi_re[eNB][0][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][0][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][1][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][1][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][2][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][2][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][3][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][3][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][4][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][4][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][5][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][5][0]/32768,
(double)ue->measurements.subband_pmi_re[eNB][6][0]/32768,
(double)ue->measurements.subband_pmi_im[eNB][6][0]/32768);
len += sprintf(&buffer[len], "[UE PROC] Phase diff PMI eNB%d (Rx Ant 0): [(%.2f) (%.2f) (%.2f) (%.2f) (%.2f) (%.2f)]\n",
eNB,
atan((double)ue->measurements.subband_pmi_im[eNB][0][0]/ue->measurements.subband_pmi_re[eNB][0][0]),
atan((double)ue->measurements.subband_pmi_im[eNB][1][0]/ue->measurements.subband_pmi_re[eNB][1][0]),
atan((double)ue->measurements.subband_pmi_im[eNB][2][0]/ue->measurements.subband_pmi_re[eNB][2][0]),
atan((double)ue->measurements.subband_pmi_im[eNB][3][0]/ue->measurements.subband_pmi_re[eNB][3][0]),
atan((double)ue->measurements.subband_pmi_im[eNB][4][0]/ue->measurements.subband_pmi_re[eNB][4][0]),
atan((double)ue->measurements.subband_pmi_im[eNB][5][0]/ue->measurements.subband_pmi_re[eNB][5][0]));
len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n",
len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f) (%f +j%f)]\n",
eNB,
ue->measurements.subband_pmi_re[eNB][0][1],
ue->measurements.subband_pmi_im[eNB][0][1],
ue->measurements.subband_pmi_re[eNB][1][1],
ue->measurements.subband_pmi_im[eNB][1][1],
ue->measurements.subband_pmi_re[eNB][2][1],
ue->measurements.subband_pmi_im[eNB][2][1],
ue->measurements.subband_pmi_re[eNB][3][1],
ue->measurements.subband_pmi_im[eNB][3][1],
ue->measurements.subband_pmi_re[eNB][4][1],
ue->measurements.subband_pmi_im[eNB][4][1],
ue->measurements.subband_pmi_re[eNB][5][1],
ue->measurements.subband_pmi_im[eNB][5][1],
ue->measurements.subband_pmi_re[eNB][6][1],
ue->measurements.subband_pmi_im[eNB][6][1]);
(double)ue->measurements.subband_pmi_re[eNB][0][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][0][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][1][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][1][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][2][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][2][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][3][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][3][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][4][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][4][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][5][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][5][1]/32768,
(double)ue->measurements.subband_pmi_re[eNB][6][1]/32768,
(double)ue->measurements.subband_pmi_im[eNB][6][1]/32768);
len += sprintf(&buffer[len], "[UE PROC] Phase diff PMI eNB%d (Rx Ant 1): [(%.2f) (%.2f) (%.2f) (%.2f) (%.2f) (%.2f)]\n",
eNB,
atan((double)ue->measurements.subband_pmi_im[eNB][0][1]/ue->measurements.subband_pmi_re[eNB][0][1]),
atan((double)ue->measurements.subband_pmi_im[eNB][1][1]/ue->measurements.subband_pmi_re[eNB][1][1]),
atan((double)ue->measurements.subband_pmi_im[eNB][2][1]/ue->measurements.subband_pmi_re[eNB][2][1]),
atan((double)ue->measurements.subband_pmi_im[eNB][3][1]/ue->measurements.subband_pmi_re[eNB][3][1]),
atan((double)ue->measurements.subband_pmi_im[eNB][4][1]/ue->measurements.subband_pmi_re[eNB][4][1]),
atan((double)ue->measurements.subband_pmi_im[eNB][5][1]/ue->measurements.subband_pmi_re[eNB][5][1]));
len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d]\n",
eNB,
......
......@@ -41,7 +41,8 @@
#include "extern.h"
#include "SIMULATION/ETH_TRANSPORT/extern.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
//SFN
#include "sudas_tm4.h"
//#define DEBUG_ULSCH_CODING
//#define DEBUG_ULSCH_FREE 1
......@@ -207,7 +208,7 @@ uint32_t ulsch_encoding(uint8_t *a,
uint8_t control_only_flag,
uint8_t Nbundled)
{
// PHY statistics for RRC decisions
time_stats_t *seg_stats=&ue->ulsch_segmentation_stats;
time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats;
time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats;
......@@ -220,7 +221,7 @@ uint32_t ulsch_encoding(uint8_t *a,
uint32_t A;
uint8_t Q_m=0;
uint32_t Kr=0,Kr_bytes,r,r_offset=0;
uint8_t y[6*14*1200],*yptr;;
uint8_t y[6*14*1200],*yptr;// y matrix max(Q_m)*14 symbols*12*100
uint8_t *columnset;
uint32_t sumKr=0;
uint32_t Qprime,L,G,Q_CQI=0,Q_RI=0,Q_ACK=0,H=0,Hprime=0,Hpp=0,Cmux=0,Rmux=0,Rmux_prime=0;
......@@ -263,8 +264,11 @@ uint32_t ulsch_encoding(uint8_t *a,
if (ulsch->O>0) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN);
rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
//sfn target function : we start here CQI/PMI for tm_4 CQI1 and CQI2
fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] harq_pid %d subframe_Tx %d, CQI ON, RI ON \n",harq_pid,(subframe_rx+4)%10);
//fflush(debug_sudas_LOG_PHY);
LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti);
print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL);
......@@ -619,8 +623,14 @@ uint32_t ulsch_encoding(uint8_t *a,
i=0;
//SFN
// Do RI coding
if (ulsch->O_RI == 1) {
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] ulsch->O_RI= %d, ulsch->o_RI[0]=%d meas->rank[eNB_id]%d\n", ulsch->O_RI, ulsch->o_RI[0],meas->rank[0]);
//fflush(debug_sudas_LOG_PHY);
switch (Q_m) {
case 2:
ulsch->q_RI[0] = ulsch->o_RI[0];
......@@ -756,15 +766,18 @@ uint32_t ulsch_encoding(uint8_t *a,
// channel multiplexing/interleaving
start_meas(m_stats);
Hpp = Hprime + Q_RI;
Qprime_RI = Q_RI / Q_m;
Qprime_ACK = Q_ACK / Q_m;
Qprime_CQI = Q_CQI / Q_m;
//fix Hpp SFN
Hpp = Hprime + Qprime_RI;
Cmux = ulsch->Nsymb_pusch;
Rmux = Hpp*Q_m/Cmux;
Rmux_prime = Rmux/Q_m;
Qprime_RI = Q_RI / Q_m;
Qprime_ACK = Q_ACK / Q_m;
Qprime_CQI = Q_CQI / Q_m;
// printf("Qprime_CQI = %d\n",Qprime_CQI);
// RI BITS
......
......@@ -62,6 +62,11 @@ unsigned char ue_power_offsets[25] = {14,11,9,8,7,6,6,5,4,4,4,3,3,3,2,2,2,1,1,1,
short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
short mmvariable[8]__attribute__((aligned(16))) = {23170,23170,23170,23170,23170,23170,23170,23170};//45
short mmvariable1[8]__attribute__((aligned(16))) = {23170,-23170,23170,-23170,23170,-23170,23170,-23170};//-45
short mmvariable2[8]__attribute__((aligned(16))) = {0,23170,0,23170,0,23170,0,23170};//90
short mmvariable3[8]__attribute__((aligned(16))) = {23170,0,23170,0,23170,0,23170,0};//0
int qam64_table[8],qam16_table[4];
unsigned char cs_ri_normal[4] = {1,4,7,10};
......
......@@ -54,7 +54,8 @@
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
#include "UTIL/LOG/log.h"
//SFN
#include "sudas_tm4.h"
#ifdef EMOS
fifo_dump_emos_UE emos_dump_UE;
#endif
......@@ -411,8 +412,10 @@ uint8_t is_cqi_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
{
int subframe = proc->subframe_tx;
int frame = proc->frame_tx;
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic;
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic;
//sudas_LOG_PHY(debug_sudas_LOG_PHY,"[UE][UCI--->PUSCH] CQI_ReportPeriodic cqirep->Npd %d cqirep->N_OFFSET_CQI %d \n",cqirep->Npd,cqirep->N_OFFSET_CQI);
//fflush(debug_sudas_LOG_PHY);
//LOG_I(PHY,"[UE %d][CRNTI %x] AbsSubFrame %d.%d Checking for CQI TXOp (cqi_ConfigIndex %d) isCQIOp %d\n",
// ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe,
// cqirep->cqi_PMI_ConfigIndex,
......@@ -1527,6 +1530,8 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_OUT);
}
// UL UE Procedure for Shared Channel
void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
int harq_pid;
......@@ -1534,20 +1539,22 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
int subframe_tx=proc->subframe_tx;
int Mod_id = ue->Mod_id;
int CC_id = ue->CC_id;
uint8_t Msg3_flag=0;
uint16_t first_rb, nb_rb;
uint8_t Msg3_flag=0;//schedule RRC request
uint16_t first_rb, nb_rb;//indicate the first RB in the virtual RB array
unsigned int input_buffer_length;
int i;
int aa;
int tx_amp;
uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32)));
uint8_t access_mode;
uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32)));//32 bytes aligned for SIMD operation
uint8_t access_mode;//indicate PUSCH or PUCCH
uint8_t Nbundled=0;
uint8_t NbundledCw1=0;
uint8_t ack_status_cw0=0;
uint8_t ack_status_cw1=0;
uint8_t cqi_status = 0;
uint8_t ri_status = 0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_IN);
// get harq_pid from subframe relationship
......@@ -1591,9 +1598,9 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
Msg3_flag=0;
}
}
// Check and test if the schedulig ifo are valid for PUSCH channel
// it uses isBad to test the validation of the parms first_rb, nb_rb, and RV index
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
uint8_t isBad = 0;
if (ue->frame_parms.N_RB_UL <= ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb) {
LOG_D(PHY,"Invalid PUSCH first_RB=%d for N_RB_UL=%d\n",
......@@ -1635,6 +1642,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
}
}
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
ue->generate_ul_signal[eNB_id] = 1;
......@@ -1642,13 +1650,14 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
// deactivate service request
// ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
LOG_D(PHY,"Generating PUSCH (Abssubframe: %d.%d): harq-Id: %d, round: %d, MaxReTrans: %d \n",frame_tx,subframe_tx,harq_pid,ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,ue->ulsch[eNB_id]->Mlimit);
// Control HARQ process round=0,...,Mlimit - 1, where Mlimit = 4
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round >= (ue->ulsch[eNB_id]->Mlimit - 1))
{
LOG_D(PHY,"PUSCH MAX Retransmission achieved ==> send last pusch\n");
ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
}
// Get ack status for cw0 for antenna 0 for PDSCH
ack_status_cw0 = reset_ack(&ue->frame_parms,
ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack,
subframe_tx,
......@@ -1656,6 +1665,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
ue->ulsch[eNB_id]->o_ACK,
&Nbundled,
0);
// Reset ack status for cw1 for antenna 1 for PDSCH ()
ack_status_cw1 = reset_ack(&ue->frame_parms,
ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][1]->harq_ack,
subframe_tx,
......
......@@ -19,7 +19,7 @@
#define FHG_TM4
//#define FHG_TM4_LOG
#define FHG_TM4_LOG_CQI
#define FHG_LOG
......
......@@ -75,6 +75,8 @@ unsigned short config_frames[4] = {2,9,11,13};
#endif
#include "system.h"
//SFN
#include "sudas_tm4.h"
#ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h"
......@@ -125,7 +127,9 @@ int UE_scan_carrier = 0;
runmode_t mode = normal_txrx;
FILE *input_fd=NULL;
//sfn
FILE *debug_sudas_LOG_PHY;
FILE *debug_sudas_LOG_MAC;
#if MAX_NUM_CCs == 1
rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
......@@ -1382,6 +1386,15 @@ void init_openair0() {
int main( int argc, char **argv ) {
int i,j,k,aa,re;
debug_sudas_LOG_PHY = fopen("debug_sudas_LOG_PHY.txt", "w");
debug_sudas_LOG_MAC = fopen("debug_sudas_LOG_MAC.txt", "w");
sudas_LOG_PHY(debug_sudas_LOG_PHY,"main();\n");
fflush(debug_sudas_LOG_PHY);
#if defined (XFORMS)
void *status;
#endif
......@@ -2013,6 +2026,7 @@ int main( int argc, char **argv ) {
terminate_opt();
logClean();
fclose(debug_sudas_LOG_PHY);
fclose(debug_sudas_LOG_MAC);
return 0;
}
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