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:
- The Line-of-Sight (LOS) Ray: Travels directly through the air over distance $d_1 = d_{los}$.
- The Ground-Reflected Ray: Bounces off the Earth’s surface over distance $d_2 = d_{ref}$.
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')

Topic in this chapter
- Introduction to Large scale propagation models
- Friis free space propagation model
- Log distance path loss model
- Two ray ground reflection model
- Modeling diffraction loss
- Hata Okumura model for outdoor propagation
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.

dear sir the matlab code is not available for two-ray ground reflection example discussed here. kindly share the code or inbox me.
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.
does no phase jump of 180° appear with the reflection on the ground?
yes, reflection causes 180° phase shift.