Power Control

Upon scheduling users to available resources, the transmission power must beadjusted to ensure that users receive the desiredquality of service while minimizing interference to other users.
In the uplink, the user terminal typically aims at (partially) compensating forthe pathloss to reach a target received power at the base station.In the downlink, the base station distributes the available power budget acrossusers according to a certain fairness criterion.
For an example of how to adjust transmission power in Sionna, referto thePower Control notebook.
Uplink
- sionna.sys.open_loop_uplink_power_control(pathloss,num_allocated_subcarriers,alpha=1.0,p0_dbm=-90.0,ut_max_power_dbm=26.0,precision=None)[source]
Implements an open-loop uplink power control procedure inspired by 3GPP TS38.213, Section 7.1.1[3GPP38213].
For each user, the uplink transmission power\(P^{\mathrm{UL}}\)is computed as:
\[P^{\mathrm{UL}} = \min \{ P_0 + \alpha PL + 10 \log_{10}(\mathrm{\#PRB}), \ P^{\mathrm{max}}\} \quad [\mathrm{dBm}]\]where\(P^{\mathrm{max}}\) is the maximum power,\(P_0\) [dBm] isthe target received power per Physical Resource Block (PRB),\(PL\) isthe pathloss and\(\alpha\in [0,1]\) is the pathloss compensation factor.
Note that if\(\alpha=1\), the pathloss is fully compensated and thepower per PRB received by the base station equals\(P_0\) [dBm], assuming\(P^{\mathrm{max}}\) is not reached. Lower values of\(\alpha\) can helpreducing interference caused to neighboring cells.
With respect to 3GPP TS 38.213, additional factors such asclosed-loop control and transport format adjustments are here ignored
- Input:
pathloss ([…, num_ut],tf.float) – Pathloss for each user relative to the serving base station, in linear scale
num_allocated_subcarriers ([…, num_ut]) – Number of allocated subcarriers for each user
alpha ([…, num_ut],tf.float |float (default: 1.0)) – Pathloss compensation factor. If afloat, the same value isapplied to all users.
p0_dbm ([…, num_ut],tf.float |float (default: -90.0)) – Target received power per PRB. If afloat, the same value isapplied to all users.
ut_max_power_dbm ([…, num_ut],tf.float |float (default: 26.0)) – Maximum transmit power [dBm] for each user. If afloat, the samevalue is applied to all users.
precision (None (default) | “single” | “double”) – Precision used for internal calculations and outputs.If set toNone,
precisionis used.
- Output:
tx_power_per_ut ([…, num_ut],tf.float) – Uplink transmit power [W] for each user, across subcarriers, streamsand time steps
Example
importmatplotlib.pyplotaspltfromsionna.sysimportopen_loop_uplink_power_controlfromsionna.phyimportconfigfromsionna.phy.utilsimportdb_to_lin,watt_to_dbm# N. usersnum_ut=100# Max tx power per UTut_max_power_dbm=26# [dBm]# Pathloss [dB]pathloss_db=config.tf_rng.uniform([num_ut],minval=80,maxval=120)# N. allocated subcarriers per UTnum_allocated_subcarriers=tf.fill([num_ut],40)# Parameters (pathloss compensation factor, reference rx power)alpha_p0=[(1,-90),(.8,-75)]foralpha,p0,inalpha_p0:# Power allocationtx_power_per_ut=open_loop_uplink_power_control(db_to_lin(pathloss_db),num_allocated_subcarriers=num_allocated_subcarriers,alpha=alpha,p0_dbm=p0,ut_max_power_dbm=ut_max_power_dbm)# Plot CDF of tx powerplt.ecdf(watt_to_dbm(tx_power_per_ut),label=fr'$\alpha$={alpha}, $P_0$={p0} dBm')# Plot max UT powerplt.plot([ut_max_power_dbm]*2,[0,1],'k--',label='max UT power')plt.legend()plt.grid()plt.xlabel('Tx power [dBm]')plt.ylabel('Cumulative density function')plt.title('Uplink tx power distribution')plt.show()

Downlink
- sionna.sys.downlink_fair_power_control(pathloss,interference_plus_noise,num_allocated_re,bs_max_power_dbm=56.0,guaranteed_power_ratio=0.5,fairness=0.0,return_lagrangian=False,precision=None,**kwargs)[source]
Allocates the downlink transmit power fairly across all users served by asingle base station (BS)
The maximum BS transmit power\(\overline{P}\) is distributed across usersby solving the following optimization problem:
\[\begin{split}\begin{align} \mathbf{p}^* = \operatorname{argmax}_{\mathbf{p}} & \, \sum_{u=1}^{U} g^{(f)} \big( r_u \log( 1 + p_u q_u) \big) \\ \mathrm{s.t.} & \, \sum_{u=1}^U r_u p_u = \overline{P} \\ & r_u p_u \ge \rho \frac{\overline{P}}{U} , \quad \forall \, u=1,\dots,U\end{align}\end{split}\]where\(q_u\) represents the estimated channel quality, defined as theratio between the channel gain (being the inverse of pathloss) and theinterference plus noise ratio,\(r_u>0\) denotes the number of allocated resources, and\(p_u\) is the per-resource allocated power, for every user\(u\).
The parameter\(\rho\in[0;1]\) denotes the guaranteed power ratio; ifset to 1, the power is distributed uniformly across all users.
The fairness function\(g^{(f)}\) is defined as in[MoWalrand]:
\[\begin{split}\begin{align} g^{(f)}(x) = \left\{ \begin{array}{l} \log(x), \quad f=1 \\ \frac{x^{1-f}}{1-f}, \quad \forall\, f>0, \ f\ne 1. \end{array} \right.\end{align}\end{split}\]When the fairness parameter\(f=0\), the sum of utilities\(\log( 1+ p_u q_u)\) is maximized, leading to a waterfilling-like solution(see, e.g.,[Tse]).As\(f\) increases, the allocation becomes increasinglyegalitarian. The case\(f=1\) maximizes proportional fairness;as\(f\to \infty\), the solution approaches a max-minallocation.
For optimal power allocations\(p^*_u>\frac{\overline{P}}{U r_u}\), theKarush-Kuhn-Tucker (KKT) conditions can be expressed as:
\[\big[ r_u \log (1+p^*_u q_u) \big]^f (1+p^*_u q_u) = q_u \mu^{-1}, \quad \forall \, u\]where\(\mu\) is the Lagrangian multiplier associated with theconstraint on the total transmit power.
This function returns the optimal power allocation\(r_u p_u^*\) and thecorresponding utility\(r_u \log( 1 + p^*_u q_u)\), for each user\(u=1,\dots,U\).If
return_lagrangianisTrue,\(\mu^{-1}\) is returned, too.- Input:
pathloss ([…, num_ut],tf.float) – Pathloss for each user in linear scale
interference_plus_noise ([…, num_ut],tf.float |float) – Interference plus noise [Watt] for each user. Iffloat, the samevalue is assigned to all users.
num_allocated_re ([…, num_ut],tf.int32 |int) – Number of allocated resources to each user. Ifint, the samevalue is assigned to all users.
bs_max_power_dbm ([…],tf.float |float (default: 56.)) – Maximum transmit power for the base station [dBm]. Iffloat, thesame value is assigned to all batches.
guaranteed_power_ratio (float (default: 0.2)) – The power allocated to a user is guaranteed to exceed a portion
guaranteed_power_ratioofbs_max_power_dbmdivided by the numberof scheduled users. Must be within [0;1].fairness (float (default: 0.)) – Fairness parameter. If 0, the sum of utilities ismaximized; when 1, proportional fairness is achieved. As
fairnessincreases, the optimal allocation approaches a max-min one.return_lagrangian (bool (default:False)) – IfTrue, the inverse of the optimal Lagrangian multiplier
mu_inv_staris returnedprecision (None (default) | “single” | “double”) – Precision used for internal calculations and outputs.If set toNone,
precisionis used.kwargs (dict) – Additional inputs for
bisection_method()used to compute the optimalpower allocation, such aseps_x,eps_y,max_n_iter,step_expand
- Output:
tx_power ([…, num_ut],tf.float) – Optimal downlink power allocation\(p_u^*\) [Watt] for each user\(u\)
utility ([…, num_ut],tf.float) – Optimal utility for each user, computed as\(r_u \log( 1 + p^*_uq_u)\) for user\(u\)
mu_inv_star ([…],tf.float) – Inverse of the optimal Lagrangian multiplier\(\mu\) associated with thetotal power constraint. Only returned if
return_lagrangianisTrue.
Example
importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltfromsionna.phyimportconfigfromsionna.phy.utilsimportdb_to_lin,dbm_to_wattfromsionna.sysimportdownlink_fair_power_controlconfig.seed=45# Evaluate the impact of 'fairness' and 'guaranteed_power_ratio'# parameters on the DL power allocation and utility# Guaranteed power ratiosguaranteed_power_ratio_vec=[0,.35,.7]# Fairness parametersfairness_vec=[0,1,2,5]# N. usersnum_ut=30# BS tx powerbs_max_power_dbm=56max_power_bs=dbm_to_watt(bs_max_power_dbm)# Interference plus noiseinterference_plus_noise=5e-10# [W]# Generate random pathlosspathloss_db=config.tf_rng.uniform([num_ut],minval=70,maxval=110)# [dB]pathloss=db_to_lin(pathloss_db)# Channel qualitycq=1/(pathloss*interference_plus_noise)fig,axs=plt.subplots(3,len(guaranteed_power_ratio_vec),figsize=(3.5*len(guaranteed_power_ratio_vec),8),sharey='row')fig.subplots_adjust(top=0.8)foraxinaxs.flatten():ax.yaxis.set_tick_params(labelbottom=True)ax.grid()ax.set_xlabel(r'User terminal $u$',fontsize=12)# Show channel quality in decreasing orderind_sort=np.argsort(cq)[::-1]axs[0,1].plot(10*np.log10(cq)[ind_sort],'.-')axs[0,1].set_ylabel(r'$q_u$ [dB]',fontsize=12)axs[0,1].set_title('Channel quality')forii,guar_ratioinenumerate(guaranteed_power_ratio_vec):# Guaranteed power for each userguaranteed_power=guar_ratio*max_power_bs/num_utforfairnessinfairness_vec:# DL fair power allocationtx_power,utility=downlink_fair_power_control(pathloss,interference_plus_noise=interference_plus_noise,num_allocated_re=1,bs_max_power_dbm=bs_max_power_dbm,guaranteed_power_ratio=guar_ratio,fairness=fairness)# Show utilityaxs[2,ii].plot(utility.numpy()[ind_sort],'.-',label=f'fairness ={fairness}')# Show transmit poweraxs[1,ii].plot(tx_power.numpy()[ind_sort],'.-',label=f'fairness ={fairness}')axs[1,ii].plot([0,num_ut-1],[guaranteed_power]*2,'--k',label='guaranteed power')axs[1,ii].set_ylabel(r'Power $r_u p^*_u$ [W]',fontsize=12)axs[1,ii].legend(fontsize=9)axs[2,ii].set_ylabel(r'Utility $r_u \log(1+p^*_u q_u)$',fontsize=12)axs[1,ii].set_title(f'Guaranteed power ratio ={guar_ratio}')fig.suptitle('Downlink fair power control',y=.98,fontsize=18)fig.tight_layout()fig.delaxes(axs[0,0])fig.delaxes(axs[0,2])plt.show()

References: