Note: this commit is work in progress. Contains initial integration of NFAPI data structures which are tested for TX path. RX path to follow.

This commit is contained in:
Raymond Knopp
2017-07-06 08:18:32 -07:00
parent d23697aef3
commit 8da1c4b5bb
74 changed files with 5561 additions and 6411 deletions
+49 -275
View File
@@ -34,10 +34,6 @@
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#ifdef LOCALIZATION
#include <sys/time.h>
#endif
void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
unsigned char current_subframe,
unsigned int current_frame,
@@ -266,7 +262,7 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
default:
LOG_E(PHY,"get_Msg3_harq_pid: Unsupported TDD configuration %d\n",frame_parms->tdd_config);
mac_xface->macphy_exit("get_Msg3_harq_pid: Unsupported TDD configuration");
AssertFatal(1==0,"get_Msg3_harq_pid: Unsupported TDD configuration");
break;
}
}
@@ -781,8 +777,7 @@ lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub
break;
default:
LOG_E(PHY,"subframe %d Unsupported TDD configuration %d\n",subframe,frame_parms->tdd_config);
mac_xface->macphy_exit("subframe x Unsupported TDD configuration");
AssertFatal(1==0,"subframe %d Unsupported TDD configuration %d\n",subframe,frame_parms->tdd_config);
return(255);
}
@@ -873,198 +868,8 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub
}
#ifdef LOCALIZATION
double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frame, sub_frame_t subframe, int32_t UE_tx_power_dB)
{
// parameters declaration
int8_t Mod_id, CC_id;
// int32_t harq_pid;
int32_t avg_power, avg_rssi, median_power, median_rssi, median_subcarrier_rss, median_TA, median_TA_update, ref_timestamp_ms, current_timestamp_ms;
char cqis[100], sub_powers[2048];
int len = 0, i;
struct timeval ts;
double sys_bw = 0;
uint8_t N_RB_DL;
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
Mod_id = eNB->Mod_id;
CC_id = eNB->CC_id;
ref_timestamp_ms = eNB->ulsch[UE_id+1]->reference_timestamp_ms;
for (i=0; i<13; i++) {
len += sprintf(&cqis[len]," %d ", eNB->UE_stats[(uint32_t)UE_id].DL_subband_cqi[0][i]);
}
len = 0;
for (i=0; i<eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) {
len += sprintf(&sub_powers[len]," %d ", eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]);
}
gettimeofday(&ts, NULL);
current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;
LOG_D(LOCALIZE, " PHY: [UE %x/%d -> eNB %d], timestamp %d, "
"frame %d, subframe %d"
"UE Tx power %d dBm, "
"RSSI ant1 %d dBm, "
"RSSI ant2 %d dBm, "
"pwr ant1 %d dBm, "
"pwr ant2 %d dBm, "
"Rx gain %d dB, "
"TA %d, "
"TA update %d, "
"DL_CQI (%d,%d), "
"Wideband CQI (%d,%d), "
"DL Subband CQI[13] %s \n",
// "timestamp %d, (%d active subcarrier) %s \n"
eNB->dlsch[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms,
frame,subframe,
UE_tx_power_dB,
eNB->UE_stats[(uint32_t)UE_id].UL_rssi[0],
eNB->UE_stats[(uint32_t)UE_id].UL_rssi[1],
dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]),
dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]),
eNB->rx_total_gain_eNB_dB,
eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset, // raw timing advance 1/sampling rate
eNB->UE_stats[(uint32_t)UE_id].timing_advance_update,
eNB->UE_stats[(uint32_t)UE_id].DL_cqi[0],eNB->UE_stats[(uint32_t)UE_id].DL_cqi[1],
eNB->measurements[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][0],
eNB->measurements[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][1],
cqis);
LOG_D(LOCALIZE, " PHY: timestamp %d, (%d active subcarrier) %s \n",
current_timestamp_ms,
eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier,
sub_powers);
N_RB_DL = frame_parms->N_RB_DL;
switch (N_RB_DL) {
case 6:
sys_bw = 1.92;
break;
case 25:
sys_bw = 7.68;
break;
case 50:
sys_bw = 15.36;
break;
case 100:
sys_bw = 30.72;
break;
}
if ((current_timestamp_ms - ref_timestamp_ms > eNB->ulsch[UE_id+1]->aggregation_period_ms)) {
// check the size of one list to be sure there was a message transmitted during the defined aggregation period
// make the reference timestamp == current timestamp
eNB->ulsch[UE_id+1]->reference_timestamp_ms = current_timestamp_ms;
int i;
for (i=0; i<10; i++) {
median_power = calculate_median(&eNB->ulsch[UE_id+1]->loc_rss_list[i]);
del(&eNB->ulsch[UE_id+1]->loc_rss_list[i]);
median_rssi = calculate_median(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]);
del(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]);
median_subcarrier_rss = calculate_median(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]);
del(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]);
median_TA = calculate_median(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]);
del(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]);
median_TA_update = calculate_median(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]);
del(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]);
if (median_power != 0)
push_front(&eNB->ulsch[UE_id+1]->tot_loc_rss_list,median_power);
if (median_rssi != 0)
push_front(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list,median_rssi);
if (median_subcarrier_rss != 0)
push_front(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list,median_subcarrier_rss);
if (median_TA != 0)
push_front(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list,median_TA);
if (median_TA_update != 0)
push_front(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list,median_TA_update);
initialize(&eNB->ulsch[UE_id+1]->loc_rss_list[i]);
initialize(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[i]);
initialize(&eNB->ulsch[UE_id+1]->loc_rssi_list[i]);
initialize(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[i]);
initialize(&eNB->ulsch[UE_id+1]->loc_timing_update_list[i]);
}
median_power = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_rss_list);
del(&eNB->ulsch[UE_id+1]->tot_loc_rss_list);
median_rssi = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list);
del(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list);
median_subcarrier_rss = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list);
del(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list);
median_TA = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list);
del(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list);
median_TA_update = calculate_median(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list);
del(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list);
initialize(&eNB->ulsch[UE_id+1]->tot_loc_rss_list);
initialize(&eNB->ulsch[UE_id+1]->tot_loc_subcarrier_rss_list);
initialize(&eNB->ulsch[UE_id+1]->tot_loc_rssi_list);
initialize(&eNB->ulsch[UE_id+1]->tot_loc_timing_advance_list);
initialize(&eNB->ulsch[UE_id+1]->tot_loc_timing_update_list);
double alpha = 2, power_distance, time_distance;
// distance = 10^((Ptx - Prx - A)/10alpha), A is a constance experimentally evaluated
// A includes the rx gain (eNB->rx_total_gain_eNB_dB) and hardware calibration
power_distance = pow(10, ((UE_tx_power_dB - median_power - eNB->rx_total_gain_eNB_dB + 133)/(10.0*alpha)));
/* current measurements shows constant UE_timing_offset = 18
and timing_advance_update = 11 at 1m. at 5m, timing_advance_update = 12*/
//time_distance = (double) 299792458*(eNB->UE_stats[(uint32_t)UE_id].timing_advance_update)/(sys_bw*1000000);
time_distance = (double) abs(eNB->UE_stats[(uint32_t)UE_id].timing_advance_update - 11) * 4.89;// (3 x 108 x 1 / (15000 x 2048)) / 2 = 4.89 m
eNB->UE_stats[(uint32_t)UE_id].distance.time_based = time_distance;
eNB->UE_stats[(uint32_t)UE_id].distance.power_based = power_distance;
LOG_D(LOCALIZE, " PHY agg [UE %x/%d -> eNB %d], timestamp %d, "
"frame %d, subframe %d "
"UE Tx power %d dBm, "
"median RSSI %d dBm, "
"median Power %d dBm, "
"Rx gain %d dB, "
"power estimated r = %0.3f, "
" TA %d, update %d "
"TA estimated r = %0.3f\n"
,eNB->dlsch[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms,
frame, subframe,
UE_tx_power_dB,
median_rssi,
median_power,
eNB->rx_total_gain_eNB_dB,
power_distance,
eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset, median_TA_update,
time_distance);
return 0;
} else {
avg_power = (dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]) + dB_fixed(eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]))/2;
avg_rssi = (eNB->UE_stats[(uint32_t)UE_id].UL_rssi[0] + eNB->UE_stats[(uint32_t)UE_id].UL_rssi[1])/2;
push_front(&eNB->ulsch[UE_id+1]->loc_rss_list[subframe],avg_power);
push_front(&eNB->ulsch[UE_id+1]->loc_rssi_list[subframe],avg_rssi);
for (i=0; i<eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) {
push_front(&eNB->ulsch[UE_id+1]->loc_subcarrier_rss_list[subframe], eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]);
}
push_front(&eNB->ulsch[UE_id+1]->loc_timing_advance_list[subframe], eNB->UE_stats[(uint32_t)UE_id].UE_timing_offset);
push_front(&eNB->ulsch[UE_id+1]->loc_timing_update_list[subframe], eNB->UE_stats[(uint32_t)UE_id].timing_advance_update);
return -1;
}
}
#endif
/*
LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti)
{
int8_t UE_id;
@@ -1083,33 +888,9 @@ LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti)
return(&RC.eNB[Mod_id][CC_id]->UE_stats[(uint32_t)UE_id]);
}
*/
int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *eNB)
{
uint8_t i;
for (i=0; i<NUMBER_OF_UE_MAX; i++) {
if ((eNB->dlsch[i]) &&
(eNB->dlsch[i][0]) &&
(eNB->dlsch[i][0]->rnti==rnti)) {
return(i);
}
}
#ifdef CBA
for (i=0; i<NUM_MAX_CBA_GROUP; i++) {
if ((eNB->ulsch[i]) && // ue J is the representative of group j
(eNB->ulsch[i]->num_active_cba_groups) &&
(eNB->ulsch[i]->cba_rnti[i]== rnti))
return(i);
}
#endif
return(-1);
}
/*
LTE_DL_FRAME_PARMS* get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id)
{
@@ -1126,6 +907,7 @@ MU_MIMO_mode *get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti)
return &RC.eNB[Mod_id][CC_id]->mu_mimo_mode[UE_id];
}
*/
int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx)
{
@@ -1176,98 +958,90 @@ void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeri
{
if(TDD == frameType)
{
if(isrs<10)
{
mac_xface->macphy_exit("2 ms SRS periodicity not supported");
}
AssertFatal(isrs>=10,"2 ms SRS periodicity not supported");
if((isrs>9)&&(isrs<15))
if((isrs>9)&&(isrs<15))
{
*psrsPeriodicity=5;
*psrsOffset=isrs-10;
*psrsPeriodicity=5;
*psrsOffset=isrs-10;
}
if((isrs>14)&&(isrs<25))
if((isrs>14)&&(isrs<25))
{
*psrsPeriodicity=10;
*psrsOffset=isrs-15;
*psrsPeriodicity=10;
*psrsOffset=isrs-15;
}
if((isrs>24)&&(isrs<45))
if((isrs>24)&&(isrs<45))
{
*psrsPeriodicity=20;
*psrsOffset=isrs-25;
*psrsPeriodicity=20;
*psrsOffset=isrs-25;
}
if((isrs>44)&&(isrs<85))
if((isrs>44)&&(isrs<85))
{
*psrsPeriodicity=40;
*psrsOffset=isrs-45;
*psrsPeriodicity=40;
*psrsOffset=isrs-45;
}
if((isrs>84)&&(isrs<165))
if((isrs>84)&&(isrs<165))
{
*psrsPeriodicity=80;
*psrsOffset=isrs-85;
*psrsPeriodicity=80;
*psrsOffset=isrs-85;
}
if((isrs>164)&&(isrs<325))
if((isrs>164)&&(isrs<325))
{
*psrsPeriodicity=160;
*psrsOffset=isrs-165;
*psrsPeriodicity=160;
*psrsOffset=isrs-165;
}
if((isrs>324)&&(isrs<645))
if((isrs>324)&&(isrs<645))
{
*psrsPeriodicity=320;
*psrsOffset=isrs-325;
*psrsPeriodicity=320;
*psrsOffset=isrs-325;
}
if(isrs>644)
{
mac_xface->macphy_exit("Isrs out of range");
}
AssertFatal(isrs<=644,"Isrs out of range %d>644\n",isrs);
}
else
{
{
if(isrs<2)
{
{
*psrsPeriodicity=2;
*psrsOffset=isrs;
}
}
if((isrs>1)&&(isrs<7))
{
{
*psrsPeriodicity=5;
*psrsOffset=isrs-2;
}
if((isrs>6)&&(isrs<17))
{
{
*psrsPeriodicity=10;
*psrsOffset=isrs-7;
}
}
if((isrs>16)&&(isrs<37))
{
{
*psrsPeriodicity=20;
*psrsOffset=isrs-17;
}
}
if((isrs>36)&&(isrs<77))
{
{
*psrsPeriodicity=40;
*psrsOffset=isrs-37;
}
}
if((isrs>76)&&(isrs<157))
{
{
*psrsPeriodicity=80;
*psrsOffset=isrs-77;
}
}
if((isrs>156)&&(isrs<317))
{
{
*psrsPeriodicity=160;
*psrsOffset=isrs-157;
}
if((isrs>316)&&(isrs<637))
{
{
*psrsPeriodicity=320;
*psrsOffset=isrs-317;
}
if(isrs>636)
{
mac_xface->macphy_exit("Isrs out of range");
}
}
}
AssertFatal(isrs<=636,"Isrs out of range %d>636\n",isrs);
}
}