Two-ray ground reflection model — path loss with LOS and ground bounce

Propagation path:
Friis → Two-ray ground → Log-distance shadowing → FSPL calculator

The Two-Ray Ground Reflection Model (also known as the Plane-Earth Loss Model) is a foundational tool in wireless propagation.

When a cell tower transmits a signal in deep space, power drops off with distance squared ($1/d^2$) following Friis’ free-space law. But put that same tower on Earth, and suddenly the signal decays at $1/d^4$ ($40\text{ dB/decade}$) over long distances.

Why the sudden penalty? The ground reflection.

In terrestrial wireless environments (such as cellular networks, Wi-Fi, or vehicular communications), antennas are elevated above the ground. The receiving antenna picks up two distinct waves:

  1. The Line-of-Sight (LOS) Ray: Travels directly through the air over distance $d_1 = d_{los}$.
  2. The Ground-Reflected Ray: Bounces off the Earth’s surface over distance $d_2 = d_{ref}$.
Two ray ground reflection model illustration
Figure 1: Two ray ground reflection model

When the receiver is far away, both rays travel nearly identical distances and arrive almost parallel. Because bouncing off the ground flips the reflected wave’s phase by roughly $180^\circ$, the two waves arrive out of phase and nearly cancel each other out.

The farther away you go, the closer they get to total cancellation—driving the signal down at $1/d^4$.

Geometric Path Difference ($\Delta d$)

Let $h_t$ be the transmit antenna height, $h_r$ be the receive antenna height, and $d$ be the horizontal separation distance between the two towers.

Using the Pythagorean theorem and a basic Taylor series expansion ($d \gg h_t, h_r$):

$$d_1 \approx d + \frac{(h_t – h_r)^2}{2d}, \quad d_2 \approx d + \frac{(h_t + h_r)^2}{2d}$$

$$\Delta d = d_2 – d_1 \approx \frac{2 h_t h_r}{d}$$

Electric Field Superposition

The physical distance gap creates a phase delay $\Delta \phi = \frac{2\pi \Delta d}{\lambda}$. Combined with the ground’s $180^\circ$ ($\pi$) phase flip:

$$\vert{}E_{\text{tot}}\vert{} \approx \frac{2 E_0}{d} \sin\left( \frac{2\pi h_t h_r}{\lambda d} \right)$$

This $\sin(\cdot)$ term is the mathematical heart of the Two-Ray model:

  • Because received power is proportional to field squared ($P_r \propto \vert{}E_{\text{tot}}\vert{}^2$), power varies as $\sin^2\left( \frac{2\pi h_t h_r}{\lambda d} \right)$.
  • When $d$ is small to moderate, the multiplier $\frac{2\pi h_t h_r}{\lambda}$ is very large. As you walk away from the tower, the angle inside $\sin(\cdot)$ winds through multiple multiples of $\pi$, causing power to swing rapidly between constructive peaks ($+6\text{ dB}$) and destructive nulls ($-\infty\text{ dB}$).

Far-Field Approximation ($d \gg d_c$)

For long distances, the argument inside the sine function becomes tiny. Using $\sin(\theta) \approx \theta$:

$$\vert{}E_{\text{tot}}\vert{} \approx \frac{2 E_0}{d} \left( \frac{2\pi h_t h_r}{\lambda d} \right) = \frac{4\pi E_0 h_t h_r}{\lambda d^2}$$

Since received power $P_r \propto \vert{}E_{\text{tot}}\vert{}^2$, squaring this expression yields:

$$P_r = P_t G_t G_r \frac{h_t^2 h_r^2}{d^4}$$

Notice that the $\sin(\cdot)$ term—and all interference oscillations—completely vanish, leaving a smooth $1/d^4$ curve.

This has two surprising takeaways:

  • Wavelength ($\lambda$) disappears! At long distances, a $2.4\text{ GHz}$ and $5\text{ GHz}$ signal suffer the exact same two-ray loss over flat ground.
  • Height is king ($h_t^2 h_r^2$). Doubling your antenna height quadruples your received power (+6 dB gain).

Real-World Reality Checks

Textbook derivations assume a flat mirror, isotropic antennas, and perfect $100\%$ reflection ($\Gamma = -1$). In the field, three physical realities change the story:

  • Ground isn’t a mirror (Brewster’s Angle): For vertically polarized cellular signals, the reflection coefficient $\Gamma_V$ drops to zero at Brewster’s Angle ($\theta_B \approx 14^\circ$). At this distance, the ground absorbs the signal instead of reflecting it—preventing cancellation and creating a localized signal spike.
  • Ground isn’t flat (Surface Roughness): Grass, asphalt, and ocean waves cause diffuse scattering. By the Rayleigh criterion ($h > \frac{\lambda}{8 \sin\theta_g}$), rough ground weakens the reflected ray. Less reflection means less cancellation, pulling path loss back toward $1/d^2$.
  • Antennas aren’t isotropic (Beam Tilt): Base station antennas tilt downward. Because the direct and reflected rays leave the antenna at different angles, they arrive with unequal power. This prevents complete “zero-signal” blackouts in real networks.

The 3 Operational Regions

The exact Two-Ray formula, while mathematically elegant, is impractical for day-to-day radio network engineering. If you are designing a mobile network, calculating link budgets, or setting cell coverage radii, evaluating rapid trigonometric oscillations ($\sin(\cdot)$) at every meter is neither helpful nor realistic. So there exists a piecewise graph that describes how a system engineer plans coverage. It turns complex wave physics into three distinct rule-of-thumb zones used in modern 4G/5G Radio Network Planning (RNP) software. It proves to be an useful tool for

  • Separating Large-Scale Path Loss from Small-Scale Fading – The piecewise line strips away the high-frequency “jitter” of the exact curve and presents the true underlying mean signal trend.
  • Identifying the Cell Edge (The Breakpoint $d_c$) – Knowing $d_c$ tells network planners exactly where a cell tower’s reliable coverage ends and where handover to the next tower must occur.
  • Simplifying Link Budgets to Simple Addition – the piecewise approximation converts complex exponential field math into three straight lines:
    • Region 1: $0\text{ dB/decade}$ slope (Flat line)
    • Region 2: $20\text{ dB/decade}$ slope (Free-space slope)
    • Region 3: $40\text{ dB/decade}$ slope (Two-ray far-field slope)

Python script

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np

# --- 1. System Parameters ---
f = 900e6
c = 3e8
lambda_val = c / f
h_t = 50.0
h_r = 2.0
P_t = 1.0
G_t = G_r = 1.0

d_c = (4 * np.pi * h_t * h_r) / lambda_val
distances = np.logspace(0, 5, 2500)

# --- 2. Exact Two-Ray Model Calculation ---
d_1 = np.sqrt(distances**2 + (h_t - h_r) ** 2)
d_2 = np.sqrt(distances**2 + (h_t + h_r) ** 2)
delta_phi = (2 * np.pi / lambda_val) * (d_2 - d_1)

E_term = np.abs(1 / d_1 - np.exp(-1j * delta_phi) / d_2)
P_r_exact = P_t * G_t * G_r * (lambda_val / (4 * np.pi)) ** 2 * E_term**2
P_r_exact_dBm = 10 * np.log10(P_r_exact * 1000)

# --- 3. Piecewise 3-Region Approximation ---
P_r_approx = np.zeros_like(distances)

for i, d in enumerate(distances):
    if d <= h_t:
        P_r_approx[i] = (
            P_t * G_t * G_r * (lambda_val / (4 * np.pi * h_t)) ** 2
        )
    elif h_t < d < d_c:
        P_r_approx[i] = (
            P_t * G_t * G_r * (lambda_val / (4 * np.pi * d)) ** 2
        )
    else:
        P_r_approx[i] = P_t * G_t * G_r * (h_t**2 * h_r**2) / d**4

P_r_approx_dBm = 10 * np.log10(P_r_approx * 1000)

# --- 4. Plotting Configuration ---
plt.figure(figsize=(11, 6.5), dpi=300)

plt.semilogx(
    distances,
    P_r_exact_dBm,
    color='#1f77b4',
    linewidth=1.8,
    label='Exact Two-Ray Model',
)
plt.semilogx(
    distances,
    P_r_approx_dBm,
    color='#d62728',
    linestyle='--',
    linewidth=2.2,
    label='3-Region Piecewise Approximation',
)

# Vertical boundary lines
plt.axvline(x=h_t, color='magenta', linestyle=':', linewidth=1.5)
plt.axvline(x=d_c, color='magenta', linestyle=':', linewidth=1.5)

# Boundary labels at the bottom of the plot
plt.text(
    h_t * 0.85,
    -123,
    r'$d = h_t$' + f'\n({int(h_t)}m)',
    color='magenta',
    fontsize=10,
    fontweight='bold',
    ha='right',
    va='bottom',
)
plt.text(
    d_c * 1.15,
    -123,
    r'$d = d_c$' + f'\n({int(d_c)}m)',
    color='magenta',
    fontsize=10,
    fontweight='bold',
    ha='left',
    va='bottom',
)

# Region text boxes
plt.text(
    4,
    -110,
    'Region 1 ($d \\leq h_t$)\nDirect Path Dominates\nSlope: 0 dB/dec',
    fontsize=9,
    ha='center',
    bbox=dict(boxstyle='round,pad=0.5', facecolor='white', alpha=0.85),
)
plt.text(
    400,
    -110,
    'Region 2 ($h_t < d < d_c$)\nInterference Oscillations\n'
    'Avg Slope: 20 dB/dec ($1/d^2$)',
    fontsize=9,
    ha='center',
    bbox=dict(boxstyle='round,pad=0.5', facecolor='white', alpha=0.85),
)
plt.text(
    25000,
    -110,
    'Region 3 ($d \\geq d_c$)\nGrazing Phase Cancellation\n'
    'Slope: 40 dB/dec ($1/d^4$)',
    fontsize=9,
    ha='center',
    bbox=dict(boxstyle='round,pad=0.5', facecolor='white', alpha=0.85),
)

# Chart styling
plt.title(
    'Two-Ray Ground Reflection Model & 3-Region Approximation',
    fontsize=13,
    fontweight='bold',
    pad=15,
)
plt.xlabel('Distance $d$ [meters] (log scale)', fontsize=11, fontweight='bold')
plt.ylabel('Received Power [dBm]', fontsize=11, fontweight='bold')
plt.grid(True, which='both', linestyle='--', alpha=0.4)
plt.legend(fontsize=10, loc='upper right', framealpha=0.9)
plt.xlim([1, 100000])
plt.ylim([-125, 0])

plt.tight_layout()
plt.savefig('two_ray_ground_reflection.png', dpi=300)
print(f'Breakpoint distance: {d_c:.1f} m')
print('Saved plot: two_ray_ground_reflection.png')
Figure 1: Received power versus transmitter–receiver distance for the exact two-ray ground-reflection model and its three-region approximation at 900 MHz, with transmitter and receiver antenna heights of 50 m and 2 m.

Topic in this chapter

FAQ

When is the two-ray ground-reflection model a good approximation? It works best in large open areas with a strong ground bounce and a clear line-of-sight path — rural macros, highways, flat desert links — not in rich indoor multipath where many scatterers dominate.

What is the breakpoint distance in the two-ray model? It marks the transition from a regime that still resembles free-space-like decay (with interference ripples) toward the large-distance asymptote where the direct and reflected rays combine so that average power falls about 40 dB per decade of range ($latex 1/d^4$).

How does two-ray differ from Friis free-space loss? Friis models a single ray in free space ($latex 1/d^2$ power decay). Two-ray adds the ground-reflected path, so the received field is the coherent sum of two phasors and the distance law changes once the geometry reaches the far breakpoint region.

Similar articles

4 thoughts on “Two-ray ground reflection model — path loss with LOS and ground bounce”

  1. Dear sir, I have already done my simulation but for further verification, will it be possible to share the code with me as I am not able to fine it in the link you suggested.

    Reply

Leave a Comment