Uplink Power Control in LTE 4G
Open- and closed-loop power control for PUSCH, PUCCH and PRACH in LTE.
Your phone doesn't shout at full volume all the time. On the uplink the network tells each UE exactly how loud to transmit — just enough to reach the eNB at a decent quality, but no louder, so it doesn't drown out neighbouring cells or flatten its own battery. That balancing act is uplink power control, and LTE runs a separate flavour of it for every uplink signal: PUSCH, PUCCH, SRS and the PRACH preamble, all defined in TS 36.213.
Introduction
Uplink power control is the set of rules that decides, subframe by subframe, how much power an LTE UE puts into each thing it transmits. It is a physical-layer function parameterised by RRC and driven live by the eNB through TPC commands, and it applies independently to the data channel (PUSCH), the control channel (PUCCH), the sounding reference signal (SRS) and the random-access preamble (PRACH).
It runs everywhere in the UE lifecycle. The very first thing a UE transmits — the PRACH preamble from RRC_IDLE — is already power-controlled by an open-loop estimate; once connected in RRC_CONNECTED, every PUSCH and PUCCH transmission is set by the combined open-loop plus closed-loop formula. There is no point in the UE's transmit path where power is simply "full blast."
It matters because the LTE uplink is interference-limited and battery-limited at the same time. Too little power and the eNB cannot decode you; too much and you waste battery and raise the noise floor for every neighbouring cell reusing the same frequencies. Power control is the mechanism that holds both in balance, and understanding it explains a large share of uplink coverage, capacity and battery behaviour.
On this page
Why Uplink Power Must Be Controlled
In plain words: imagine a crowded room where everyone is talking to a friend across the table. If one person shouts, nobody else can hear their own conversation. The right etiquette is to speak just loudly enough for your listener to catch you and no louder. Uplink power control is that etiquette enforced by the network: each UE speaks only as loud as the eNB needs, so the whole room stays usable.
The uplink is where power control really matters. Many UEs in many cells all transmit on the same frequencies at the same time, and every one of them is a source of interference to the others. If a UE transmits harder than it needs to, three bad things happen at once: it wastes its own battery, it raises the interference floor for every neighbouring cell, and it can even swamp the eNB's receiver relative to weaker UEs on adjacent resources.
A set of procedures that continuously set the UE's transmit power for PUSCH, PUCCH, SRS and the PRACH preamble, so each arrives at the eNB near its target quality while never exceeding the UE's configured maximum power P_CMAX.
To hit the SINR target the eNB needs to decode you, limit inter-cell interference so the whole network's capacity holds up, and save UE battery — all three at the same time.
An open-loop part estimates the needed power from path loss (PL derived from CRS RSRP), a target P0, a fractional factor α and a bandwidth term; a closed-loop part fine-tunes it with per-command TPC corrections carried in the DCI.
The core tension: transmit loud enough to meet your SINR target, quiet enough to limit interference to neighbours, and never above P_CMAX. Uplink power control is the mechanism that resolves those three pulls every subframe, on a per-channel basis.
Open-Loop: Compensating for Path Loss
The open-loop component is the UE's own estimate of how much power it needs, made without any per-command feedback from the eNB. Its job is to undo the path loss (PL) between UE and eNB — the further you are, the more signal you lose on the way, so the more you must transmit.
The UE derives PL entirely from the downlink. The eNB broadcasts the transmit power of its Cell-specific Reference Signal in the IE referenceSignalPower (inside SIB2 / RadioResourceConfigCommon), and the UE measures how strong those reference symbols actually land as CRS RSRP. The difference is the path loss: PL = referenceSignalPower − higher-layer-filtered RSRP. Because it is measured on the downlink CRS, this estimate is available even before the UE has sent anything, which is exactly why open-loop can set the very first PRACH preamble.
Two RRC-signalled parameters then shape the open-loop level. P0 is the target received power per resource block — effectively "how strong I want your signal to land at my antenna." It is itself the sum of a cell-wide part and a UE-specific part: P0 = P0-NOMINAL-PUSCH + P0-UE-PUSCH, the first broadcast to everyone, the second a per-UE offset in RRCConnectionReconfiguration. Both are signed integers in dBm-per-RB units: p0-NominalPUSCH spans roughly −126…+24 dBm in 1 dB steps, and p0-UePUSCH is a smaller trim of about −8…+7 dB. The fractional path-loss compensation factor α (alpha), an enumerated value in the set {0, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}, decides how much of the measured path loss the UE actually compensates for. With α = 1 the UE fully compensates: every UE lands at the same received power regardless of distance. With α < 1 the UE only partly compensates, so distant UEs land a little weaker than near ones — this is fractional power control, a deliberate trade of cell-edge throughput for lower inter-cell interference and higher total capacity. Typical deployments sit around α = 0.7–0.8.
Finally there is a bandwidth term. Power is quoted per resource block, so a UE granted M_PUSCH resource blocks must scale its total power up by 10·log10(M_PUSCH) — transmitting over ten RBs needs about ten times the total power of transmitting over one, at the same per-RB density. This is the reason a UE at the edge often gets a narrow grant: concentrating its limited power into fewer RBs raises the per-RB energy and keeps decoding possible.
Open-loop, precisely: the path-loss-driven part of PUSCH power is P0-PUSCH + α·PL + 10·log10(M_PUSCH). The UE derives PL itself from referenceSignalPower minus its measured CRS RSRP; no uplink transmission is needed to compute it.
Closed-Loop: TPC Corrections and f(i)
Open-loop gets you close, but it can't see everything — fast fading, receiver load, or a slightly wrong path-loss estimate all leave a residual error. The closed-loop component lets the eNB correct that error directly. It watches your actual received quality and sends Transmit Power Control commands (TPC) telling you to nudge up or down.
Each TPC command is a small field carried in the DCI on PDCCH. For PUSCH it rides either inside your own uplink grant (DCI format 0, a 2-bit TPC field) or in a group-common power-control DCI (DCI format 3 or 3A) that packs TPC bits for many UEs at once, each UE reading its own bits at a configured tpc-Index. DCI format 3 carries 2-bit commands; DCI format 3A carries 1-bit commands. The group-common formats are scrambled with a dedicated TPC-PUSCH-RNTI (or TPC-PUCCH-RNTI for the PUCCH loop) so a UE knows which DCI to look inside.
These corrections feed an accumulated term written f(i). The behaviour depends on the RRC flag accumulationEnabled:
- Accumulative mode (
accumulationEnabled= true): each command adds to the running total, sof(i)=f(i−1)+ δPUSCH. The typical accumulative steps are −1, 0, +1 and +3 dB (the four values a 2-bit TPC field encodes). The loop has memory and drifts the power gradually to the right place, correcting slow drift with tiny nudges. - Absolute mode (
accumulationEnabled= false): each command sets the correction directly,f(i)= δPUSCH, chosen from a wider set −4, −1, +1, +4 dB. There is no memory; every command is a fresh absolute offset.
Mental model: open-loop is you reading a map to guess how far you have to shout; closed-loop is the listener saying "a bit louder… a bit softer" until it's just right. In accumulative mode f(i) is your memory of all those little corrections; in absolute mode each instruction overwrites the last.
Both halves run together every subframe. The open-loop branch turns a downlink measurement into a base level; the closed-loop branch folds in the eNB's running corrections; the two are summed, the result is clipped to P_CMAX, and that becomes the actual transmit power. The eNB then measures what actually arrived and issues the next TPC, so the loop keeps chasing the target as the radio channel drifts. The figure below traces that full cycle — downlink CRS to path-loss estimate, through both branches, to the clipped transmission and back.
The PUSCH Power Formula
Put both halves together and you get the PUSCH power expression from TS 36.213. Everything is in dBm, computed per subframe i, and the whole thing is capped at the UE's configured maximum P_CMAX:
Read it left to right, then look up each term in the table below. P_CMAX is the ceiling — the UE never transmits above it, and when the inner value exceeds P_CMAX the UE is power-limited and clips. The highlighted group 10·log10(M_PUSCH) + P0_PUSCH + α·PL is the open-loop estimate. ΔTF is a transport-format (MCS-dependent) offset, and f(i) is the accumulated closed-loop correction from all the TPC commands so far.
| Term | Name | What it is |
|---|---|---|
M_PUSCH | Bandwidth term | Number of allocated resource blocks in subframe i. Enters as 10·log10(M_PUSCH) because power is defined per RB — wider grants need proportionally more total power. |
P0_PUSCH | Target level | P0-NOMINAL-PUSCH (cell-wide, broadcast, ≈ −126…+24 dBm) + P0-UE-PUSCH (per-UE offset in RRC, ≈ −8…+7 dB). The wanted received power per RB. |
α | Fractional PL factor | Enum {0, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1}. How much of the measured path loss the UE compensates. α=1 equalises received power; α<1 spares neighbours. |
PL | Path loss | referenceSignalPower − filtered CRS RSRP. The UE's own downlink estimate of the link loss. |
ΔTF | Transport-format offset | MCS-dependent term: a denser modulation / higher coding rate needs more energy per RB. Enabled by deltaMCS-Enabled; can be zero. |
f(i) | Closed-loop term | Accumulated (or absolute) sum of TPC corrections from DCI 0 / DCI 3/3A. The eNB's live fine-tuning. |
P_CMAX | Max UE power | Configured ceiling (bounded by the power class, typically 23 dBm for class 3, minus MPR/A-MPR). The min clips the result to it. |
Power headroom: when the inner term approaches or exceeds P_CMAX, the UE reports a Power Headroom Report (PHR) so the eNB knows how much room is left. A negative headroom means the UE is already clipping — the eNB should then grant it fewer RBs or a lower MCS.
PUCCH and SRS Power Control
Control information cannot afford the fractional-power gamble — if the eNB misses your HARQ-ACK or SR, the whole scheduling loop stalls. So PUCCH uses its own parameters and always fully compensates path loss (effectively α = 1). Its power formula, again capped at P_CMAX, is:
The pieces mirror PUSCH but with control-specific twists. P0_PUCCH = P0-NOMINAL-PUCCH + P0-UE-PUCCH. There is no M bandwidth term because PUCCH always occupies one RB per slot. ΔF_PUCCH(F) is a format-dependent offset, signalled as deltaF-PUCCH-FormatX, that accounts for how much information the chosen PUCCH format carries — Format 1/1a/1b (ACK/SR) versus Format 2/2a/2b (CQI) versus Format 3 all have different reference levels. h(n) is a term that scales with the number of information bits carried (for CQI and multi-bit ACK), so a report with more bits gets more power. ΔTxD is added only with transmit diversity, and g(i) is the PUCCH closed-loop accumulator, fed by TPC in DCI format 1/1A/2/2A/2B/2C (downlink assignments) or in DCI format 3/3A.
SRS (Sounding Reference Signal) reuses the PUSCH machinery. Its power is the PUSCH open-loop plus closed-loop value adjusted by a dedicated offset P_SRS_OFFSET, so PSRS = min{ P_CMAX, P_SRS_OFFSET + 10·log10(M_SRS) + P0_PUSCH + α·PL + f(i) }. It shares the same f(i) as PUSCH — sounding is only useful if it lands at a power the eNB can relate back to the data channel it is meant to characterise.
Why control fully compensates: PUSCH can tolerate fractional power because lost data is retransmitted by HARQ. A dropped ACK or scheduling request, by contrast, breaks the control loop itself — so PUCCH is configured to full path-loss compensation and carries per-format and per-bit-count offsets to guarantee it is always heard.
PRACH Preamble Power and Ramping
The PRACH case is special because there is no connection yet — the eNB can't send TPC to a UE it hasn't heard from. So the preamble uses open-loop plus a self-driven ramp: the "closed loop before there is a loop."
The UE computes the first preamble's transmit power from a broadcast target and its own path-loss estimate:
preambleInitialReceivedTargetPower is the wanted received level of the preamble at the eNB, broadcast in SIB2 (RACH-ConfigCommon / PowerRampingParameters); it is an enum stepping from about −120 dBm up to −90 dBm in 2 dB steps. Adding PL fully compensates the link. If no Random Access Response arrives within the RAR window, the UE assumes it was too quiet, steps the power up by powerRampingStep (an enum of 0, 2, 4 or 6 dB) and retransmits. This repeats up to preambleTransMax attempts (an enum such as n3, n4, n6 … n200); if it still fails, the UE declares a random-access problem to higher layers. The count of transmissions so far, PREAMBLE_TRANSMISSION_COUNTER, is what multiplies the ramp step.
| Aspect | Open-loop (PUSCH/PUCCH/SRS) | Closed-loop (PUSCH/PUCCH) | PRACH ramping |
|---|---|---|---|
| Feedback source | None — UE's own CRS RSRP | TPC from the eNB | Presence/absence of RAR |
| Carrier | RRC parameters (P0, α) | DCI 0 / DCI 3/3A (and DL DCI for PUCCH) | SIB2 RACH-ConfigCommon |
| Correction term | P0 + α·PL + bandwidth | f(i) / g(i), accumulated or absolute | +powerRampingStep per retry |
| Memory | Recomputed each subframe | Accumulative: has memory; absolute: none | Ramps up until success or preambleTransMax |
| Needs a connection? | No | Yes (needs RNTI + DCI) | No — runs before connection |
Power Headroom and Scaling Under P_CMAX
The eNB schedules the uplink blind to the UE's real power budget unless the UE tells it. That is the job of the Power Headroom Report (PHR), a MAC control element that reports the difference between P_CMAX and the power the UE would have used for its current grant. The reported value is quantised to a range of roughly −23 dB to +40 dB in 1 dB steps.
A Type 1 PHR reports headroom for PUSCH alone: PH = P_CMAX − { 10·log10(M_PUSCH) + P0_PUSCH + α·PL + Δ_TF + f(i) }. A positive value means the UE has spare power (the eNB can grant more RBs or a higher MCS); a negative value means the formula demanded more than P_CMAX and the UE is clipping — the eNB should pull back. Reporting is triggered by periodicPHR-Timer, or by prohibitPHR-Timer plus a path-loss change exceeding dl-PathlossChange. (LTE-A adds a Type 2 PHR that also covers PUCCH when PUSCH and PUCCH are sent together.)
When the UE really is out of headroom, something has to give — and the rules are strict about what. With carrier aggregation the UE has one P_CMAX across all serving cells, and the total requested power over simultaneous PUSCH/PUCCH transmissions can exceed it. LTE then applies power scaling with a fixed priority order:
- PUCCH is protected first — if PUCCH and PUSCH would together exceed
P_CMAX, the PUSCH power is scaled down to make room, because control must survive. - PUSCH carrying UCI (uplink control multiplexed onto data) is prioritised over PUSCH carrying only data.
- Remaining PUSCH powers across component carriers are scaled by a common factor
w(0 ≤ w ≤ 1) so their sum fits under the total budget.
Priority in one line: when the UE is power-limited, LTE spends the last available dB on the most important thing first — PRACH and PUCCH ahead of PUCCH-less PUSCH, and PUSCH-with-UCI ahead of PUSCH-with-data-only. PHR is how the UE warns the eNB before it gets there.
⚠ Common pitfalls / gotchas
- Confusing per-RB and total power.
P0is a target per resource block. Forgetting the10·log10(M_PUSCH)term makes wide grants look under-powered; it is exactly why a cell-edge UE is often better served by a narrow grant that concentrates power. - Assuming α = 1 everywhere. With fractional power control (
α< 1) cell-edge UEs deliberately land below theP0target. Reading their low received power as a fault, rather than by design, is a classic misdiagnosis. - Accumulation drift. In accumulative mode a run of missed or misdecoded
TPCcommands desynchronises the UE'sf(i)from the eNB's assumed value, so the UE transmits at the wrong level until an absolute command or reset realigns it. - Ignoring PHR sign. A negative
PHRis not "a bit low" — it means the UE is already clipping atP_CMAX, so any further RB or MCS increase simply will not be delivered.
LTE ↔ NR: the structure carries straight over — NR keeps open-loop (P0 + α·PL + bandwidth term), closed-loop f(i), and TPC in the DCI. The big differences are beam-related: NR path loss is measured on an SS/PBCH block or CSI-RS resource selected as the pathlossReferenceRS (not the always-on LTE CRS), power control is per beam / per SRS resource set, and NR supports multiple closed loops selected by a closedLoopIndex. NR also drops the group-common DCI format 3/3A in favour of DCI format 2_2 / 2_3 for TPC, and PRACH ramping is likewise beam-aware. The intent — hit a target received level while limiting interference — is identical.
Summary
LTE uplink power control sets, every subframe, how loud each uplink signal transmits. Open-loop builds a base level from the UE's own downlink path-loss estimate (referenceSignalPower − CRS RSRP), a target P0, the fractional factor α, and the bandwidth term 10·log10(M_PUSCH). Closed-loop then folds in the eNB's live TPC corrections through f(i), accumulative or absolute per accumulationEnabled. The sum is always clipped to P_CMAX.
PUCCH uses the same skeleton but fully compensates path loss and adds format- and bit-count-dependent offsets, because losing control breaks scheduling. SRS rides the PUSCH loop with an offset. The PRACH preamble, having no connection to lean on, uses open-loop plus self-driven ramping. When the UE runs out of budget, the PHR warns the eNB and a strict scaling order (PUCCH › PUSCH-with-UCI › PUSCH data) decides what survives under a single P_CMAX. The through-line: reach the eNB at its target quality, and no louder.
Quick Q&A
Q. What is the difference between open-loop and closed-loop power control?
A. Open-loop is the UE's own estimate from path loss using P0, α and the bandwidth term 10·log10(M_PUSCH) — no per-command eNB feedback, with PL derived from CRS RSRP. Closed-loop adds TPC commands from the DCI that the UE folds into f(i), correcting the residual error the open-loop estimate can't capture.
Q. What is the difference between accumulated and absolute TPC?
A. It is set by accumulationEnabled. Accumulated mode adds each command to a running f(i) (steps −1/0/+1/+3 dB) so the loop has memory; absolute mode makes each command overwrite f(i) with a fresh offset (−4/−1/+1/+4 dB) with no memory.
Q. Where does the UE get the path loss from?
A. From the downlink CRS: PL = referenceSignalPower (broadcast in SIB2) minus the UE's higher-layer-filtered CRS RSRP. It needs no uplink transmission, so it is available even for the first PRACH preamble.
Q. Why does PUCCH fully compensate path loss while PUSCH may not?
A. PUSCH data is protected by HARQ retransmission, so fractional compensation (α<1) is an acceptable trade for lower interference. Losing PUCCH control (ACK, SR, CQI) breaks the scheduling loop itself, so PUCCH is configured to full compensation plus format-dependent Δ_F_PUCCH and a bit-count term h(n).
Q. How is the PRACH preamble powered when there's no connection yet?
A. Open-loop plus ramping: initial power is preambleInitialReceivedTargetPower + PL, and if no Random Access Response arrives the UE retransmits a step (powerRampingStep) louder, up to preambleTransMax attempts.
Q. What happens when total requested power exceeds P_CMAX with carrier aggregation?
A. LTE applies power scaling in priority order: PUCCH is protected first, PUSCH carrying UCI next, and remaining PUSCH across carriers is scaled by a common factor w≤1 so the sum fits under the single P_CMAX. The PHR warns the eNB before this clipping happens.
Where power control connects
Power control sits underneath everything the UE transmits — the preamble that opens a connection, the control channel that keeps it alive, and the data channel it feeds.