>
Home5G NRPHY — Physical LayerOpen-Loop Power Control (OLPC)
📵 PHY — Physical LayerIntermediate

Open-Loop Power Control (OLPC) in 5G NR

Before the network has sent a single power-control command, the UE already needs a sensible transmit power for its very first uplink transmission. Open-loop power control is how it gets one, entirely from its own measurements.

📚 3GPP-basedTS 38.213TS 38.331

The Power Control overview page covers open- and closed-loop control together as one continuous formula. This page zooms into the open-loop half specifically — the part of the calculation the UE runs by itself, from broadcast/RRC parameters and its own downlink measurements, before any network command has ever reached it. It is what lets a UE's very first PRACH preamble and its very first PUSCH transmission go out at a reasonable power instead of a guess.

Introduction

Open-Loop Power Control (OLPC) is the part of uplink power control the UE computes entirely on its own: given a downlink path-loss estimate and a handful of network-broadcast or RRC-configured parameters, the UE calculates a transmit power without waiting for any explicit per-transmission command from the gNB. It's called "open loop" because there's no feedback loop being closed in real time — the UE isn't reacting to a TPC command, it's computing a starting point from what it can already see.

Why open loop has to exist

Consider the very first thing a UE transmits on a new cell: a PRACH preamble, sent before the UE has any RRC connection, any grant, or any TPC command history with this cell at all. There is no closed loop to lean on yet — nothing has been "closed" because nothing has been exchanged. The UE still needs to pick a transmit power that's roughly right: too low and the gNB won't detect the preamble; too high and the UE wastes battery and raises interference to neighbouring cells unnecessarily.

Open loop solves exactly this cold-start problem, and it keeps working throughout the connection as the baseline that closed-loop corrections (see Closed-Loop Power Control) are then applied on top of — OLPC never stops running once the UE is connected; it's the foundation every subsequent PUSCH/PUCCH power calculation still starts from.

The OLPC formula

The open-loop component of the standard PUSCH power-control formula (TS 38.213) is:

PO_PUSCH = P0 + α × PL

Where P0 is a target received power at the gNB (in dBm), α (alpha) is a fractional compensation factor between 0 and 1, and PL is the UE's own downlink path-loss estimate (in dB). This term sits inside the full PUSCH power equation alongside a bandwidth-scaling term, a transport-format offset, and the closed-loop adjustment f(i) — but P0 + α·PL is specifically the open-loop part: everything the UE can compute without any network command in hand.

P0 — the target received power

P0 is the power the network wants to receive from the UE at the gNB, before any path-loss compensation is applied. It's broadcast/configured in two parts that get summed: p0-NominalWithGrant (a cell-wide default, same for every UE) and p0-UE-PUSCH (a UE-specific offset the network can tune per device, e.g. to favour a UE known to be causing or suffering more interference). A typical nominal value sits somewhere around −90 to −100 dBm, though the exact figure is entirely an operator/deployment choice tuned to the cell's noise floor and target SINR.

Alpha — fractional path-loss compensation

If α = 1, the UE fully compensates for its path loss — a cell-edge UE with high path loss transmits at proportionally higher power to land at exactly P0 at the gNB, the same as a cell-center UE. This is full compensation, and it's simple, but it means cell-edge UEs transmit at high power, which raises the interference they cause to neighbouring cells’ uplinks.

If α < 1 (a value like 0.8 is common), the UE only partially compensates — a cell-edge UE still transmits at somewhat higher power than a cell-center UE, but not enough to fully cancel its extra path loss, so its received power at the gNB ends up a bit below P0. This is fractional path-loss compensation, and it's a deliberate trade: cell-edge UEs get a slightly worse link individually, in exchange for causing meaningfully less interference to the cells around them — a system-level throughput win, even though it looks like a per-UE sacrifice.

💡

Rule of thumb: α = 1 optimizes for the individual UE's link. α < 1 optimizes for total system capacity by keeping cell-edge interference in check — almost every real deployment uses fractional compensation for exactly this reason.

Measuring the path loss

PL is estimated by the UE itself, entirely from the downlink: it compares the known transmitted reference-signal power (broadcast in system information) against what it actually measures receiving (typically from SS-RSRP off the SSB, or CSI-RS where configured), and the difference is the path loss. This assumes downlink and uplink path loss are reasonably similar — a fair assumption at a given carrier frequency, though large-scale duplex-gap or beam-correction terms can be layered on for FR2 deployments where the assumption is less exact.

Open loop for PRACH: power ramping

PRACH power control is a special, more conservative case of open loop: the UE computes an initial preamble power from a similar path-loss-compensated formula, but if the gNB doesn't respond with a Random Access Response in time, the UE doesn't just resend at the same power — it ramps up, increasing power by a configured step (powerRampingStep) on each retry, up to a maximum number of attempts. This is open loop with a built-in escalation mechanism, since there's no TPC command available yet to correct a bad initial guess any other way. See Random Access (RACH) for the full preamble retry procedure this power ramping sits inside.

Worked Example

A UE measures SS-RSRP of −95 dBm from a cell whose SSB is known (via SIB1) to be transmitted at 20 dBm EIRP. Its estimated path loss is therefore PL = 20 − (−95) = 115 dB. The cell broadcasts P0 = −96 dBm (combining nominal + UE-specific offset) and α = 0.8.

PO_PUSCH = −96 + 0.8 × 115 = −96 + 92 = −4 dBm

This −4 dBm open-loop target then feeds into the rest of the full PUSCH power formula (bandwidth scaling, transport-format offset, and any closed-loop f(i) adjustment on top) before the UE arrives at its actual transmit power for that PUSCH occasion — but the −4 dBm figure above is specifically what open loop alone contributed, computed with no network command involved beyond the broadcast P0/α values themselves.

Summary

Open-loop power control is the UE's own calculation — P0 (target received power) plus α times its own downlink-derived path-loss estimate — that gives every uplink transmission a sensible starting power with zero network commands in the loop. Fractional compensation (α < 1) is the deliberate, near-universal choice to trade a bit of cell-edge link quality for materially lower interference to neighbouring cells. It never switches off: closed-loop power control corrects on top of it, but OLPC is the foundation every PUSCH/PUCCH/PRACH power calculation starts from.

Q&A Quick LTE 4G / 5G NR Interview Questions

Q. Why is fractional path-loss compensation (α < 1) used instead of full compensation?

A. Full compensation (α=1) makes every UE land at the same received power regardless of path loss, which means cell-edge UEs transmit at high power and raise interference to neighbouring cells. Fractional compensation deliberately under-compensates cell-edge UEs, trading a bit of their own link quality for materially less interference system-wide.

Q. How does a UE compute open-loop power before it has ever received a TPC command?

A. It estimates its own downlink path loss by comparing the SSB's known broadcast transmit power against what it actually measures (SS-RSRP), then applies P0 + α×PL using broadcast/RRC-configured P0 and α values — no network command is needed for this calculation.

Q. What happens if a PRACH preamble at the open-loop-computed power isn't detected by the gNB?

A. The UE doesn't just retransmit at the same power — it ramps up by a configured step (powerRampingStep) on each retry, since there's no TPC command yet available to correct the estimate any other way.