107 lines
3.5 KiB
C
107 lines
3.5 KiB
C
/*
|
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.openairinterface.org/?page_id=698
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*-------------------------------------------------------------------------------
|
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
* contact@openairinterface.org
|
|
*/
|
|
|
|
/*! \file ue_power.c
|
|
* \brief Routines to compute UE TX power according to 36.213
|
|
* \author R. Knopp, F. Kaltenberger
|
|
* \date 2020
|
|
* \version 0.1
|
|
* \company Eurecom
|
|
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
|
* \note
|
|
* \warning
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include "PHY/defs_eNB.h"
|
|
#include <openair1/PHY/TOOLS/tools_defs.h>
|
|
#include <openair1/SCHED/sched_common_extern.h>
|
|
|
|
int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, int ncp, uint8_t use_srs)
|
|
{
|
|
|
|
/// The payload + CRC size in bits, "B"
|
|
uint32_t B;
|
|
/// Number of code segments
|
|
uint32_t C;
|
|
/// Number of "small" code segments
|
|
uint32_t Cminus;
|
|
/// Number of "large" code segments
|
|
uint32_t Cplus;
|
|
/// Number of bits in "small" code segments (<6144)
|
|
uint32_t Kminus;
|
|
/// Number of bits in "large" code segments (<6144)
|
|
uint32_t Kplus;
|
|
/// Total number of bits across all segments
|
|
uint32_t sumKr;
|
|
/// Number of "Filler" bits
|
|
uint32_t F;
|
|
// num resource elements
|
|
uint32_t num_re=0.0;
|
|
// num symbols
|
|
uint32_t num_symb=0.0;
|
|
/// effective spectral efficiency of the PUSCH
|
|
uint32_t MPR_x100=0;
|
|
/// beta_offset
|
|
uint16_t beta_offset_pusch_x8=8;
|
|
/// delta mcs
|
|
float delta_mcs=0.0;
|
|
/// bandwidth factor
|
|
float bw_factor=0.0;
|
|
|
|
B= tbs+24;
|
|
lte_segmentation(NULL,
|
|
NULL,
|
|
B,
|
|
&C,
|
|
&Cplus,
|
|
&Cminus,
|
|
&Kplus,
|
|
&Kminus,
|
|
&F);
|
|
|
|
|
|
sumKr = Cminus*Kminus + Cplus*Kplus;
|
|
num_symb = 12-(ncp<<1)-(use_srs==0?0:1);
|
|
num_re = num_symb * nb_rb * 12;
|
|
|
|
if (num_re == 0)
|
|
return(0);
|
|
|
|
MPR_x100 = 100*sumKr/num_re;
|
|
|
|
if (control_only == 1 )
|
|
beta_offset_pusch_x8=8; // fixme
|
|
|
|
//(beta_offset_pusch_x8=ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? ue->ulsch[eNB_id]->beta_offset_cqi_times8:8;
|
|
|
|
// if deltamcs_enabledm
|
|
delta_mcs = ((hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch_x8)>>3))/100.0);
|
|
|
|
bw_factor = (norm!=0) ? 0 : (hundred_times_log10_NPRB[nb_rb-1]/100.0);
|
|
LOG_D(PHY,"estimated ue tx power %d (num_re %d, sumKr %d, mpr_x100 %d, delta_mcs %f, bw_factor %f)\n",
|
|
(int16_t)ceil(delta_mcs + bw_factor), num_re, sumKr, MPR_x100, delta_mcs, bw_factor);
|
|
return (int16_t)ceil(delta_mcs + bw_factor);
|
|
|
|
}
|
|
|